Я просматривал Stackoverflow и увидел этот вопрос о мозаике прямоугольника MxN, и я подумал, что это будет здорово для игры в гольф. Вот задача.
Учитывая размерность M и N, напишите программу, которая выводит, сколько уникальных способов можно прямоугольнить MxN (N - количество строк, а не столбцов. Не то, чтобы это действительно имеет значение), учитывая эти ограничения.
- Все плитки 2х1 или 3х1
- Все плитки остаются в своем ряду (то есть все они горизонтальны)
- Между каждыми двумя смежными рядами плитки не должны быть выровнены, кроме как на двух концах
- M и N гарантированно будут по крайней мере 1
Например, допустимый лист 8x3 будет
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Но следующее будет недопустимым, потому что строки выравниваются
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Тестовые случаи:
8х3: 4
3х1: 1
1x1: 0
9x4: 10
Код гольф, поэтому самый короткий ответ выигрывает.
2x1
или3x1
? Также есть выход для4x1
нуля?|
ей не способствовать длине строки, используя представление , как это (где, если не трубка (|
), есть пробел).Ответы:
Желе , 20 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
119 110 106 9691 байтПринимает вход как( N, M) ,
Попробуйте онлайн!
комментарии
Примечание: этот код использует 3 разные функции, которые вызывают друг друга. Это немного затрудняет отслеживание области видимости переменных. Имейте в виду, чтограмм определяется в рамках е и час определяется в рамках грамм ,
источник
R ,
243231 байтПопробуйте онлайн!
Версия с переносами строк:
Обратите внимание, что нет рекурсии, и обрабатывает довольно большие значения m и n (например, 24x20 -> 3.3e19)
Вот закомментированный ответ, который работает более или менее так же, как и выше, но я удалил все функции, поэтому он действительно читабелен:
Метод взятия матрицы и ее многократного умножения основан на вопросе о переполнении стека . Этот подход работает здесь, потому что он эффективно вычисляет совокупное количество ветвей через различные возможные ряды кирпичей.
Если внешние пакеты разрешены, я могу получить его до 192:
источник
Желе , 26 байт
Попробуйте онлайн!
Сломано:
Создайте список возможных стен в виде кумулятивных сумм с удаленным концом:
Найдите внешний стол всех возможных стен друг против друга, которые не имеют пересечений:
Возьмите эту матрицу в степень (N-1) и затем суммируйте все это:
Использует первый бит из ответа @ EriktheOutgolfer, чтобы сгенерировать список возможных стен, а затем использует пересечение матриц и подход к возведению в матрицу из моего ответа R. Таким образом, он хорошо работает даже с большими буквами N. Это мой первый ответ на желе, и я подозреваю, что его можно играть в гольф больше. В идеале я бы хотел изменить первый раздел, чтобы время и требования к памяти не увеличивались экспоненциально с М.
источник
05AB1E , 42 байта
Мне почти стыдно публиковать это, и определенно можно сыграть в ГЛОТЛ с другим подходом, но так как это заняло некоторое время, я решил опубликовать его в любом случае и сыграть в гольф отсюда. Задача выглядит проще, чем imo, но я определенно использую неправильный подход, и у меня есть ощущение, что 05AB1E может сделать около 25 байт ..
Попробуйте онлайн. ПРИМЕЧАНИЕ: он не только длинный, но и неэффективный, поскольку
9x4
тестовый пример выполняется в течение 40 секунд на TIO.Объяснение:
источник
Древесный уголь , 89 байт
Попробуйте онлайн!Ссылка на подробную версию кода. Работает для прямоугольников размером до 12 на TIO, но может быть сделано примерно в три раза быстрее при стоимости 2 байта, если использовать битовое переворот вместо пересечения списка. Объяснение:
Введите ширину.
Начните с ряда без кирпичей.
Начните с не завершенных строк.
Цикл по рядам.
Переверните кирпичи.
Добавьте ширину кирпича к текущей ширине строки.
Если это приводит к ширине ввода, добавьте эту строку в список завершенных строк.
В противном случае, если это все еще меньше, чем ширина ввода, добавьте новую строку в список строк, таким образом вызывая ее для более поздней итерации.
Составьте список стен одного ряда.
Петля на один меньше высоты.
Сохраните список стен.
Очистить список стен.
Зациклите сохраненный список стен.
Цикл по законченным рядам.
Если ряд можно добавить к этой стене, добавьте его в список стен.
Выведите длину окончательного списка стен.
источник