Напишите программу или функцию, которая принимает прямоугольную сетку текста, где каждая ячейка представляет собой A
или B
. Все A
ячейки образуют односвязную форму, то есть все они будут ортогонально соединены без отверстий (соседние по диагонали буквы не считаются связанными). Точно так же все B
клетки будут образовывать другую, просто связанную форму. Сетка всегда будет содержать хотя бы один A
и хотя бы один B
.
Представьте , сетка на самом деле два Блочные-образные части тонкого пластика, в лице A
и B
частями. Если бы он лежал на столе ровно, можно ли было бы раздвинуть две части, оставив обе на столе полностью плоскими?
Печать или вернуть truthy значение , если два A
и B
формы могут быть разделены , как это просто потянув их друг от друга. Если нет, напечатайте или верните ложное значение.
Например, вход
AAA
ABB
AAA
Это правда, потому что BB
раздел может быть сдвинут вправо, отделяя его от A
:
AAA
A BB
AAA
Тем не менее, вход
AAAA
ABBA
ABAA
ложно, потому что нет способа раздвинуть части A
и B
части без их наложения.
Самый короткий код в байтах побеждает. При желании вы можете использовать любые два окружных печатных символа ASCII вместо A
и B
.
Правдивые примеры (разделенные пустыми строками)
BBB
BAA
BBB
BA
A
B
AB
AB
AAA
BBB
AAAAB
ABBBB
ABBA
ABBA
AAAA
AAAAAABBBBBBBBB
AABBBBBBBBBBBBB
AAAAAAAAAABBBBB
AABBBBBBBBBBBBB
AAAAAAAAAAAAAAB
AAAAAAAAAAAA
ABABABABABAB
BBBBBBBBBBBB
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBABBBB
BBBBBBBB
BBBBBBBB
AAA
BAA
AAA
Ложные Примеры
BBBB
BAAB
BABB
BBBB
BAAB
AABB
BBBBBBB
BBBBBAB
AAAAAAB
BBBBBBB
BAAA
BABA
BBBA
AABA
AAAA
AAAAAAA
ABBBBBA
AAAAABA
BBBBBBA
BAAAAABB
BBAAABBB
BBBABBBB
BBBABBBB
BBBAABBB
BBBBBBBB
BBBBBBBB
AAA
ABA
BBA
ABA
AAA
CJam,
3332201917 байтПересмотренная версия с широкой поддержкой @ Sp3000 и @ MartinBüttner:
Попробуйте онлайн
взносы
Алгоритм и Доказательство
Далее объясняются критерии для головоломки, раздвигающейся горизонтально. Вертикальный регистр может быть определен путем просмотра столбцов вместо строк или транспонирования матрицы символов и повторного просмотра строк.
Я буду использовать термин «растянуть» для максимальной последовательности тех же букв. Например, следующие строки имеют 1, 2 и 3 растяжения соответственно:
Я также буду использовать термин «заблокированный» для строки / головоломки, которые не могут раздвинуться.
Ключевое наблюдение заключается в том, что головоломка может раздвинуться, если и только если все ряды имеют максимум 2 растяжения . Или наоборот, он блокируется, если и только если есть какой-либо ряд с более чем 2 растяжками .
Следующее может не квалифицироваться как строгое математическое доказательство, но я считаю, что оно дает убедительное объяснение, почему это так.
Легко видеть, что головоломка блокируется, если она имеет ряды более 2-х отрезков. Глядя на ряд с 3-мя участками:
Понятно, что это препятствует раздвижению головоломки, потому что
A
натяжение заблокировано междуB
отрезками. Это означает, что ряд заблокирован, что, в свою очередь, блокирует всю головоломку.Противоположное направление доказательства не так очевидно. Нам нужно показать, что нет взаимосвязанных головоломок, где во всех рядах есть только 1 или 2 отрезка. Начиная с пары наблюдений:
A
иB
, головоломка явно не блокируется. В этом случае всеA
ячейки остаются от всехB
ячеек или наоборот, и при раздвижении двух частей нет столкновений.Единственный сложный случай - это головоломки, в которых у нас есть ряды с двумя отрезками разного порядка. Я собираюсь показать, что таких головоломок не существует при данных спецификациях. Чтобы показать это, давайте посмотрим на частичную головоломку с такой конфигурацией, где
.
используются шаблоны:Теперь в спецификации говорится, что
A
иB
ячейка, и ячейка просто связаны во всех действительных головоломках. ЧтобыA
связать ячейки в частичной головоломке, представленной выше, у нас есть два варианта:Мы зациклились на одном из отрезков
B
, например:Чтобы сделать это, мы неизбежно расширяем один из рядов на 3 отрезка, так что это никогда не даст нам правильную головоломку, где все ряды имеют максимум 2 отрезка.
Мы соединяем их по прямому пути:
Эти
A
клетки теперь просто соединены, и до сих пор нет строки с более чем 2 -х участков. Тем не менее,B
клетки также должны быть просто связаны. Прямой путь теперь заблокирован соединеннымиA
ячейками, и единственный способ соединитьB
ячейки - это обхватить один из участковA
ячейки. Это возвращает нас к случаю 1, где мы не можем сделать это, не создавая ряды из 3 отрезков.Для подсчета растяжений в реализации используется оператор CJam RLE.
Объяснение кода
источник
JavaScript (ES6),
108107989182 байтаЖивая демоверсия . Проверено в Firefox. Принимает ввод в виде строки с разделителями новой строки.
Редактирование:
\n
на буквальный перевод строки.g
функцию и вызывая RegExp непосредственно в массиве вместо использованияfind
.Как это работает
Предыдущая версия:
a
и разбейте его по символам новой строки на массив строк.a
и хранить его вT
. Используйте,map
чтобы перебрать каждый элементa
, разбить строку на массив символов и использоватьmap
снова, чтобы добавитьi
символ th в строку кi
строке thT
. Поскольку каждый элементT
неинициализирован, он будет выглядеть примерно так"undefinedAAABBA"
, но это не имеет значения.g
, соответствующую шаблону/AB+A|BA+B/
. Если это совпадает, кусочки блокируются в заданном направлении, потому что тогда есть наборB
s, зажатый между двумя или болееA
s или наоборот.g
для проверки всех элементов блокаa
и его транспонированияT
на соответствиеfind
. Если оба совпадают, то кусочки блокируются в обоих направлениях, поэтому выведите ложное значение, в противном случае - истинное.источник
Javascript (ES6), 118
Объяснение:
источник
JavaScript (ES6) 72
74Редактирование 2 байта , сохраненные THx @NotthatCharles
У меня есть интуитивное понимание того, что если одна часть может скользить лишь долю шага, то это бесплатно. Текущие тесты подтверждают это.
Поэтому я проверяю только один шаг в каждом направлении.
Используемые символы: 1 и 0 на
2 байта больше, чтобы использовать любые 2 печатных символа, таких как A и B
Протестируйте приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6 (с поддержкой оператора распространения - IE Firefox)
источник
s[p+o]=='0'
кажется немного длинным. Может ли он быть заменен1-s[p+o]
или, по крайней мереs[p+o]==0
?=='A'
можно заменить на<'B'
. То же самое для=='B'
x+s[p+o]=='AB'
?Mathematica
10069 байтБлагодаря огромному сохранению 31 байта, благодаря @Martin Buttner,
Форматирует ввод как матрицу символов; это также делает транспонирование матрицы. Если либо матрица, либо ее транспонирование имеет не более 2 прогонов в ряду, головоломка может скользить.
{a,a,b,b,b}
имеет 2 серии писем.{a,a,b,a,a}
имеет 3 серии писем.{a,a,b,a,a,a,b,b,b,b,b,b,b,b}
имеет 4 серии писем.источник
Дьялог АПЛ, 22 байта
Попробуй это здесь. Эта функция принимает двумерный массив символов и возвращает
1
для скользящих и0
не скользящих экземпляров . Алгоритм аналогичен большинству других ответов: проверьте матрицу и транспонируйте ее, чтобы ни одна строка не содержала более одной соседней пары разных букв. Для входной матрицы 4x3функция может быть вызвана как
что приводит к
1
.объяснение
источник
JavaScript (ES6), 94 байта
Альтернативный метод того же размера:
Это возвращает
1
для правдивого ввода и0
для ложного. Я начал работать над этим, прежде чем другие ответы были опубликованы. Я также первоначально пытался использовать массивы ES7, но это оказалось примерно на 10 символов длиннее, чем этот метод.Попробуйте это:
Предложения приветствуются!
источник