Полістрипсис - це підмножина поліоміно, що відповідає наступним правилам:
- кожен шматок складається з 1 або більше комірок
- жодна клітина не може мати більше двох сусідів
- клітини не повинні закривати отвір
Вільні поліоміно є виразними, коли жодне не є жорсткою трансформацією (переклад, обертання, відображення або відбиття ковзання) іншого (шматки, які можна підібрати і перевернути). Переклад, обертання, віддзеркалення або ковзання, що відображає вільне поліоміно, не змінюють своєї форми ( Вікіпедія )
Наприклад, існує 30 вільних гептастрипів (полістрипи довжиною 7). Ось усі вони, упаковані в сітку 14х15.
Кредитна графіка: Мирослав Вічер
Мета
Напишіть програму / функцію, яка приймає додаткове ціле число n
як вхідне і перераховує окремі вільні n
-полістрипи.
n = 1 -> 1 (Один квадрат)
n = 2 -> 1 (Існує лише одна можлива 2-полістилка з 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-polystrip і повертається явно). Блоки описують відносний напрямок: 0 - без змін; 1 - повернути вліво; 2 - повернути праворуч. Не має значення, в якому напрямку ви почнете, а лише вказати, куди слід поставити наступну клітинку. Тут може бути будь-яка кількість послідовних 0, але 1 і 2 завжди одиничні. Ця реалізація є частковою, оскільки вона не враховує отвори - рішення для n> 6 також рахують шматки з отворами.
101010
у вашій примітці зразка)?