Полистрипсы - это подмножество полиомино, соответствующих следующим правилам:
- каждая часть состоит из 1 или более клеток
- ни одна клетка не может иметь более двух соседей
- клетки не должны закрывать отверстие
Свободные полиомино отличаются, когда ни одно из них не является жестким преобразованием (перемещение, вращение, отражение или скользящее отражение) другого (фрагменты, которые можно подбирать и переворачивать). Перевод, вращение, отражение или скольжение, отражающее свободное полиомино, не меняет его форму ( Википедия )
Например, существует 30 свободных гептастрипов (полистрипов длиной 7). Вот все они, упакованные в сетку 14x15.
Изображение предоставлено Мирославом Вичером
Цель
Напишите программу / функцию, которая принимает положительное целое число в n
качестве входных данных и перечисляет различные свободные n
-полистрины.
n = 1 -> 1 (один квадрат)
n = 2 -> 1 (возможна только одна двухсторонняя полоса из 2 квадратов)
n = 3 -> 2 (один состоит из 3 квадратов, соединенных в линию, а другой - в форме буквы L)
n = 4 -> 3 (одна прямая, одна L-образная и одна Z-образная)
, , ,
Тестовые случаи:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
счет
Это код-гольф , поэтому чем короче код, тем лучше. Я был бы очень признателен за подробные объяснения алгоритма и кода.
Частичная справочная реализация в J
Я решил описать каждую часть в «векторном» формате, и мне нужны только n-2 блока для описания части с n-полистрипами (есть только 1 2-полистрица, и она возвращается явно). Блоки описывают относительное направление: 0 - без изменений; 1 - повернуть налево; 2 - поверните направо. Неважно, в каком направлении вы начнете, нужно только указать, куда следует поместить следующую ячейку. Может быть любое количество последовательных нулей, но 1 и 2 всегда одинарные. Эта реализация является частичной, потому что она не учитывает дырки - решения для n> 6 также учитывают куски с дырками.
источник
101010
в вашей выборочной записи)?Ответы:
Python 3 ,
480433406364309299295 байтВыглядело как хороший момент для начала моей карьеры PPCG (или нет?).
Попробуйте онлайн!
Редактирование:
D
иX
, и немного подправлен в некоторых местах для гольфа.m
. (Комплексные числа действительно сильны, но часто игнорируются в гольфе; адаптированы из решения xnor для другой задачи )LFR
строковое представление на-1,0,1
кортежи и пожертвовали временем выполнения для сумасшедшего сокращения байтов (!). Теперь решение теоретически правильно, но время ожидания до выдачи результата на 15.r
. НАКОНЕЦ ПОД 300 БАЙТОВ !!!1j
может придерживаться чего-либо еще, не путая синтаксический анализатор (-2B), иnot
имеет безумно низкий приоритет (-2B).Устаревшая версия (480 байт):
Попробуйте онлайн!
Раскрытое решение с комментариями:
Попробуйте онлайн!
Нам это больше не нужно, и теперь он гарантированно будет правильным для произвольного размера ввода благодаря встроенному комплексному числу.m = 999
выбран потому, что для подсчета всего требуется экспоненциальное время, а для расчета уже требуется ~ 8 сn = 1..15
. Может быть, это нормально, чтобы сохранить 1 байт, используя вместо 99.источник
APL (Dyalog Unicode) ,
7065 байтПопробуйте онлайн!
Полная версия программы с кодом ниже, благодаря Adám.
APL (Dyalog Unicode) , 70 байт
Попробуйте онлайн!
Как это устроено
Код выше эквивалентен следующему определению:
Это работает как решение Python, но в другом порядке. Это
gen
eratesLFR
-strips длиныn-2
,canonicalize
с каждой полосой, принимает∪
Nique полоски,test
с каждой полоской , если она затрагивает себя (1 , если не касаясь, 0 в противном случае), и суммирует+/
на логический результате.gen
canonicalize
test
источник