Классический комбинаторный результат состоит в том, что число способов разбить 2*n
полосу 1*2
домино - это n- е число Фибоначчи. Ваша цель состоит в том, чтобы напечатать все элементы мозаичного изображения, заданные n
штрихами и вертикальными линиями, как эти 8 элементов мозаичного изображения для n=5
:
|————
|————
——|——
——|——
|||——
|||——
————|
————|
||——|
||——|
|——||
|——||
——|||
——|||
|||||
|||||
Вы должны предоставить программу или именованную функцию, которые принимают в n
качестве входных данных и распечатывают требуемые выходные данные. Побеждает несколько байтов.
вход
Число n
между 1
и 10
включительно через STDIN или функциональный вход.
Выход
Напечатайте все возможные фрагменты домино 2*n
полосы, нарисованные горизонтально. Повороты могут быть в любом порядке, но каждый должен появляться ровно один раз. Они должны быть отделены пустой строкой.
Вертикальное домино состоит из двух вертикальных полос ( |
), а горизонтальное домино состоит из двух черточек ( —
). Вы можете использовать дефисы ( -
) вместо тире, чтобы остаться в ASCII.
Вы можете делать что-либо с пробелами, если вывод на печать выглядит одинаково.
——
и|
от длины , как Деннис, а не длина-n
строки—
и|
фильтруется—
появляются парами. И для последнего я бы ожидал, что это будет с помощью регулярных выражений или строковых операций над созданной строкой, напримерs.split('——
), а не с помощью арифметического подхода, подобного вашему.Ответы:
С, 106
Гольф версия
Оригинальная версия
Как это работает
Переменная
i
работает от1<<n-1
0 до 0, создавая все возможные двоичные числа сn
цифрами. 0 кодирует для|
и 1 кодирует для-
. Нас интересуют числа, которые содержат 1 в парах. Очевидно, что такие числа делятся на 3.Когда число делится на 3, исходное число можно восстановить, умножив результат на 2 и добавив его к себе (эффективно умножая на 3). Большинство чисел потребует перенос, но когда процесс выполняется на числах проценты, перенос не требуется, поэтому в этих случаях вместо дополнения можно использовать только ИЛИ. Это используется для проверки интересующих чисел, поскольку они являются единственными, где выражение
i/3|i/3*2
возвращает исходное значениеi
. Смотрите пример ниже.1111
= 15 --->0101
= 5 --->1111
= 15 (действует,0101|1010
==0101+1010
)1001
= 9 --->0011
= 3 --->0111
= 7 (неверно0011|0110
,! =0011+0110
)Тестовое значение всегда равно или меньше исходного значения. Поскольку числа, не кратные 3, также возвращают число, меньшее оригинала, при делении на 3 и затем умножении на 3, тест также дает желаемое значение FALSE для этих чисел.
В оригинальной версии пара циклов
j
используется для сканирования битовi
и вывода. В версии для гольфа используется единственнаяfor
петля, в которойh
пробегаются все числа от(n*2)*(1<<n)-1
нуля до 0. Значенияi
генерируются с помощьюh/2/n
. Переменнаяj
больше не используется, поскольку эквивалентное количество получается изh%n
. Использованиеn*2
позволяет печатать обе строки из одного и того же цикла, при этом вputs
операторе используется несколько мультиплексоров для печати одной или двух новых строк в конце строки.Обратите внимание , что мясо это в положении приращения
for()
кронштейна и , следовательно , запускается на выполнение послеi=h/2/h
.Пример вывода n = 6:
источник
i/3|i/3*2
Трюк гениален! Я не ожидал арифметического выражения для грамматики.CJam,
3327 байтовСпасибо @ jimmy23013 за удаление 6 байтов!
Попробуйте онлайн!
Фон
Это итеративная реализация рекурсивного алгоритма:
Возможные значения для n могут быть получены путем добавления вертикального домино к возможным значениям для n - 1 и двух горизонтальных домино для возможных значений для n - 2 .
Таким образом, число мозаичных чисел для n является суммой чисел мозаичных чисел для n - 1 и n - 2 , то есть n- го числа Фибоначчи.
Как это работает
Пример запуска
источник
LNli{_'|f\@"——"f\+2/}*\;{_N}/
,f\
еще не был реализован в 0.6.2, но я смог объединить наши подходы. Благодаря!Haskell, 89 байт
f
является функцией, которая с заданным числом возвращает список из одной строки всех возможных значений Фибоначчи длины n возможных. не имеет значения, что он возвращает одну строку, потому что обе строки всех значений одинаковы.f
работает рекурсивно, вызываяn-1
иn-2
и добавляя"|"
и"--"
(соответственно) к строкам.g
это функция, которая отвечает на вопросы. он в основном вызываетf
входные данные, удваивает каждую строку, чтобы показать две строки, и соединяет их все символами новой строки.пример вывода:
источник
CJam,
4237 байтЯ посчитал тире как один байт каждый, так как вопрос позволяет заменить их дефисами ASCII.
Попробуйте онлайн.
Как это работает
Чтобы получить все возможные значения в 2 × L , мы перебираем все неотрицательные целые числа I <3 L , чтобы четные цифры в основании 3 соответствовали горизонтальным домино, а нечетные - вертикальным.
Поскольку у каждого I есть L или меньше цифр в основании 3, это генерирует все возможные способы покрытия полосы 2 × L. Осталось только отфильтровать покрытия, которые больше или меньше 2 × L, и распечатать остальные покрытия.
Пример запуска
источник
3b
. Это правильно?JavaScript (E6) 102
Генерация конфигураций из битовых последовательностей, 0 -> '-' и 1 -> '|'.
Test In firefox / консоль firebug
Выход
источник
Haskell: 109 байт
Это перевод известной однострочности Хаскеля для ленивого вычисления последовательности чисел Фибоначчи:
Основная последовательность плиточных нитей, не разглаженных:
И однострочник Фибоначчи для сравнения:
Пример использования:
источник
Кобра - 176
Не могу дождаться, пока я закончу с коброй.
источник
J - 54 символа
Функция принимает в
n
качестве аргумента справа.Основным корнем этого гольфа является
(];'--'&,"1@[,'|',"1])&>/
. Это берет список значений длины (N-2) и (N-1) и возвращает список значений длины (N-1) и N. Это стандартное повторение Фибоначчи, как линейная алгебра.];
возвращает правый список как новый левый (поскольку изменений нет).'--'&,"1@[
добавляет--
плитки в левый список, в то время как'|',"1]
добавляет|
плитки в правый список, и они вместе являются новым правым списком.Мы повторяем это много
n
раз (это@[&0
) и начинаем с пустого тайлинга и одиночного тайлинга длины 1. Затем мы возвращаем первый из пары с0{::
. То есть, если мы запустим его ноль раз, мы просто вернем первый, то есть пустой лист. Если мы запустим егоn
раз, мы вычислим до парыn
и (n
+1), но отбросим последнюю. Это дополнительная работа, но меньше персонажей.Это
(1 2$,:)
то, что J должен сделать, чтобы элементы в списках легко расширялись. Мы делаем левый начальный список одним списком из 2-х рядных символов, каждая строка имеет длину 0. Правый начальный список такой же, но строки длиной 1 заполнены|
. Затем мы добавляем новые плитки в каждую строку и добавляем списки матриц, когда мы соединяем два набора мозаичных элементов вместе. Это простое применение концепции, которую J называет «рангом»: по сути, манипулирование размерностью своих аргументов и неявное зацикливание при необходимости.Попробуйте сами на tryj.tk .
источник
Python 3: 70 байт
Рекурсивно строит все возможные строки,
s
представляющие один ряд домино, которые дублируются и печатаются. Начинаяs
с символа новой строки, автоматически появляется пустая строка.==
Между двумя вызовами дляf
только для выполнения обеих вызовов функций. Они обычно возвращаются,None
потому что они просто печатают, и==
это один из немногих операторов, определенных дляNone
.В
and
s иor
s являются произвести правильное поведение короткое замыкание , чтобы воспроизвестиif
с иelse
х годов ungolfed кода.Ungolfed:
источник
Сетчатка , 44 байта
Примечание: сетчатка моложе, чем этот вызов.
Принимает ввод в унарном виде с завершающим переводом строки.
Каждая строка должна идти в свой собственный файл и
#
должна быть заменена на новую строку в файле. Это нецелесообразно, но вы можете запускать код как один файл с-s
флагом, сохраняя#
маркеры (и изменяя символ новой строки на также#
во входных данных). При желании вы можете изменить#
обратно на новые строки в выходных данных. Например:Метод:
1
изменением на|
и одна с первыми двумя1
, замененными на--
. Мы делаем это до тех пор, пока не получим строки, по крайней мере, с двумя1
.1
, мы изменили их на|
s.источник