Дано целое число n, перечислить все возможные полные двоичные деревья с n внутренними узлами. (Полные двоичные деревья имеют ровно 2 дочерних элемента на каждом внутреннем узле). Древовидная структура должна быть выведена в виде обхода дерева по предварительному порядку: 1 представляет внутренний узел, а 0 - внешний узел (ноль).
Вот примеры для первых нескольких n:
0:
0
1:
100
2:
11000
10100
3:
1110000
1101000
1100100
1011000
1010100
Это кодовый гольф с призом, собираемым наименьшим количеством персонажей. Деревья должны выводить по одному на строку в стандартный вывод. Программа должна читать из командной строки или стандартного ввода.
code-golf
combinatorics
binary-tree
Кайл Батт
источник
источник
Ответы:
Perl -
12579 символовГраф включает в себя 4 символа для "
-ln
" вариантов. Берет из стандартного ввода.Новый конструктивный подход:
Сформируйте решение для n, подставив новый внутренний узел («100») для каждого листа («0»), в свою очередь, в каждом дереве из решения для n-1.
(Я обязан этой концепцией другим решениям, которые используют внутренний узел для листинга [100-> 0] подстановки для проверки последовательностей, сгенерированных последовательно, и я полагаю, что увидел - после написания моего ответа на основе этой концепции - тот же самый 0- > 100 методов построения в чьем-то промежуточном редактировании.)
Предыдущий рекурсивный подход:
Рекурсивный негольф:
источник
PHP
(142)(138)(134)(113)Запускается из командной строки, т.е. «php golf.php 1» выводит «100».
РЕДАКТИРОВАТЬ: вырезать 4 символа с помощью альтернативного метода, создавая строки из 0, а не повторяя вниз от $ n. Использует PHP 5.3 для сокращенного троичного оператора; в противном случае требуется еще 2 символа.
РЕДАКТИРОВАТЬ 2: Сохранено еще 4 символа с некоторыми изменениями в петлях.
РЕДАКТИРОВАТЬ 3: я пытался другой подход, и я, наконец, получил его ниже старого метода.
Все деревья могут рассматриваться как двоичные представления целых чисел между 4 ^ n (или 0, когда n = 0) и 2 * 4 ^ n. Эта функция перебирает этот диапазон и получает двоичную строку каждого числа, затем многократно уменьшает ее, заменяя «100» на «0». Если последняя строка равна «0», то это допустимое дерево, поэтому выведите его.
источник
Рубин,
9994928987 символовВвод читается из стандартного ввода.
Редактировать 1: Изменен IO (см. Комментарии Lowjacker)
Редактировать 2: измененный алгоритм.
Редактировать 3: версия теперь использует третий подход (используя идею migimaru).
Изменить 4: снова два символа. Спасибо Мигимару.
источник
*?\n
, потому чтоputs
печатает каждый элемент массива в отдельной строке.Рубин 1,9
(80)(79)Использование нерекурсивного, конструктивного подхода, используемого DCharness.
РЕДАКТИРОВАТЬ: Сохранено 1 символ.
источник
Haskell 122 символа
Поскольку IO является нетривиальной частью кода в haskell, возможно, кто-то может использовать подобное решение на другом языке. По существу случайные прогулки в квадрате от левого нижнего к верхнему правому остановке, если диагональ пересечена. Эквивалентно следующему:
источник
Golfscript, 60
83Я разработал режим Golfscript для Emacs, если кому-то интересно.
источник