Напишите программу или функцию, которая принимает многострочную строку 0
«s» и 1
«s». Никаких других символов в строке не будет, и строка всегда будет прямоугольной (все строки будут иметь одинаковое количество символов) с размерами, равными 1 × 1, но в противном случае символы 0
«s» и 1
«s» могут быть расположены произвольно.
Вы можете предположить, что в строке есть дополнительный завершающий символ новой строки, и при желании вы можете использовать любые два различных печатаемых символа ASCII вместо 0
и 1
.
Выведите или верните истинное значение, если все области, связанные путями, и 0
s, и 1
s в строке являются сплошными прямоугольниками , в противном случае выведите ложное значение .
Связно область из 0
«средств s , что из любого 0
региона, все остальные 0
» s может быть достигнуто только перемещения вверх, вниз, влево и вправо к другому 0
«s (и не двигаться по диагонали, не двигаясь к любому 1
, и не выходя за пределы строки). Та же самая идея относится к 1
областям, связанным путями.
Твердый прямоугольник из 0
«означает сек всей площади прямоугольника не заполняется 0
» ы и нет 1
«ы. Та же идея относится и к 1
сплошным прямоугольникам.
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
(Обратите внимание, что строка не имеет тороидальных граничных условий .)
Примеры
1) Эта входная строка имеет 3 области пути (2 для 0
и 1 для 1
). Только нижняя правая 00
область представляет собой сплошной прямоугольник, поэтому результат будет ложным.
0011
0111
0100
2) Эта входная строка имеет 4 подключенных пути пути (2 для обоих 0
и 1
). Все они представляют собой сплошные прямоугольники, поэтому вывод будет правдивым.
0011
0011
1100
3) Этот вход имеет 2 области, связанные путями, но только одна из них представляет собой сплошной прямоугольник, поэтому на выходе будет ложным.
00000000
01111110
00000000
4) Этот вход имеет только 1 соединенную область пути и тривиально представляет собой сплошной прямоугольник, поэтому вывод верен.
11111111
11111111
11111111
Тестовые случаи
Чуть T
ниже входной строки означает правдивость, F
означает ложь.
0
T
1
T
00
T
01
T
10
T
11
T
0000000
T
1111111
T
011100100100101100110100100100101010100011100101
T
00
11
T
01
10
T
01
11
F
00
01
F
11
11
T
110
100
F
111
000
T
111
101
111
F
101
010
101
T
1101
0010
1101
0010
T
1101
0010
1111
0010
F
0011
0111
0100
F
0011
0011
1100
T
00000000
01111110
00000000
F
11111111
11111111
11111111
T
0000001111
0000001111
T
0000001111
0000011111
F
0000001111
1000001111
F
1000001111
1000001111
T
1110100110101010110100010111011101000101111
1010100100101010100100010101010101100101000
1110100110010010110101010111010101010101011
1010100100101010010101010110010101001101001
1010110110101010110111110101011101000101111
F
Руби, 76
В любой сетке, состоящей полностью из прямоугольников, каждая строка должна быть идентичной предыдущей линии или иметь все биты, переключаемые от 0 до 1 и наоборот.
Это легко доказать. Возьмите лист бумаги и нарисуйте по нему произвольные вертикальные и горизонтальные линии. Теперь раскрасьте прямоугольники, используя только 2 цвета. Вы получите искаженную шахматную доску, где все цвета переворачиваются на каждой строке.
Хотите нарисовать прямоугольники с линиями только частично? Попробуйте удалить сегмент любой из ваших линий. Теперь вам понадобится более 2 цветов, чтобы раскрасить ваш дизайн, потому что у вас будут точки, где встречаются 3 прямоугольника (2 угла и ребро). Поэтому такие дизайны не имеют отношения к этому вопросу.
Я удивлен ответами, пока не заметил этого.
Я думаю, что этот алгоритм должен быть намного короче на каком-то другом языке.
Неуправляемый в тестовой программе
источник
s.scan(/^?.*\n/)
поможет сэкономить байты.Улитки , 20 байт
Печатает область сетки, если не существует квадрата 2x2 с 3 нулями и единичным или 3 единицами и нулем, или
0
если такой квадрат 2x2 существует.источник
MATL , 12 байт
Тот же алгоритм, что и у великолепного ответа @ sp3000 .
Чтобы разрешить многострочный ввод, MATL необходимо, чтобы массив строк (строка) был явно создан с использованием символа
10
для новой строки. Поэтому вводим четыре примера (обратите внимание, что[]
это конкатенация, поэтому каждый из них представляет собой массив строк символов):и последние три контрольных случая
Истинный вывод - это массив, содержащий только единицы.
Попробуйте онлайн!
объяснение
При этом используется тот факт , что соотношение символов
'0'
и'1'
является тем же самым , что и чисел0
и1
, так что не нужно конвертировать из полукокса к цифре она представляет,источник
['first line' 10 'second llne']
, где10
ASCII для новой строки. Это приемлемо?'0011 0111 0100'
JavaScript (ES6), 69 байт
Я полагаю, что критерий прямоугольности связности путей эквивалентен требованию, чтобы для любых четырех точек, образующих углы произвольного прямоугольника, было четное число
1
s. Обратите внимание, что четность прямоугольника (0, b), (x, y) совпадает с (0, b), (a, y)^
(a, b), (x, y), поэтому мне нужно только проверить те прямоугольники, левый верхний угол которых находится в точке (0, 0). Также по законам де Моргана,!.some()
это то же самое,.every(!)
что спасает меня пару байтов.Редактировать: Я заметил, что решение Jelly проверяет четность углов всех прямоугольников 2 × 2, которые могут быть показаны как эквивалентные.
источник
JavaScript (ES6), 79
Тот же алгоритм ответа Jelly от @ Sp3000 (и рад, что не доказал, что это работает). Просто в 8 раз дольше
Меньше гольфа
Тестирование
источник
Grime v0.1, 31 байт
Отпечатки
1
для матча и0
без матча. Попробуйте онлайн!объяснение
Grime - мой язык сопоставления двухмерных шаблонов. Я изменил его сегодня, но только для изменения характера элемента синтаксиса (
`
вместо,
), чтобы он не влиял на мой счет.Я использую подход, аналогичный подходу Sp3000 : вход ложный, если он содержит прямоугольник 2 × N, одна строка которого содержит оба
0
и1
, а другая - нет.источник
JavaScript (ES6), 64 байта
Основываясь на наблюдении @ LevelRiverSt, каждая строка должна быть одинаковой или противоположной первой.
источник