Сегодняшняя задача состоит в том, чтобы нарисовать бинарное дерево таким красивым ascii-art, как этот пример:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/ \ / \ / \ / \
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Вам будет дано положительное целое число в качестве входных данных. Этот вход - высота дерева . Приведенный выше пример имеет высоту шесть.
Вы можете отправить либо полную программу, либо функцию, и вы можете использовать любой из наших методов ввода-вывода по умолчанию . Например, будет разрешено печатать дерево, возвращать строку с символами новой строки, возвращать массив двумерных символов, сохранять дерево в файл и т. Д.
Пробелы на каждой строке разрешены.
Вот несколько примеров входов и их соответствующих выходов:
1:
/\
2:
/\
/\/\
3:
/\
/ \
/\ /\
/\/\/\/\
4:
/\
/ \
/ \
/ \
/\ /\
/ \ / \
/\ /\ /\ /\
/\/\/\/\/\/\/\/\
5:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
К сожалению, результат растет в геометрической прогрессии, поэтому трудно привести более масштабные примеры. Вот ссылка на выход за 8.
Как обычно, это задача для игры в гольф , поэтому применяются стандартные лазейки и стараются написать максимально короткую программу на любом языке, который вы выберете.
Удачного игры в гольф!
Ответы:
Python 2, 77 байт
Печать с пробелами, заканчивающимися ошибкой.
Я взял этот код из своей заявки на вызов, который я поставил на Anarchy Golf , плюс однобайтовое улучшение, найденное xsot. Кодовое значение 128 было изменено на
2**input()
.Идея состоит в том, что каждая строка вывода представляет собой сегмент, скопированный один или несколько раз. Половина после входного разбиения имеет одну копию каждого сегмента, четверть после следующего разбиения имеет две копии и т. Д. До последней строки с множеством сегментов
/\
.Каждый сегмент имел
/
и\
, с промежутками между ними, а также снаружи, чтобы заполнить до нужной длины. Внешнее дополнение сделано сcenter
.Переменная
s
отслеживает текущее значение каждого сегмента, а количество сегментовS/s
таково, что общая ширина равна ширине дереваS
. Номер строкиi
ведет обратный отсчет на 2, и когда значениеs
равно половине, происходит разделение, и ширина сегмента уменьшается вдвое. Это делается с помощью выраженияs/=s/i
. Когдаi
достигает0
, это дает ошибку, которая завершает программу.Поскольку anagolf разрешает только отправку программ, я не исследовал возможность рекурсивной функции, которая, я думаю, скорее всего короче.
источник
V , 32 байта
Попробуйте онлайн!
HexDump:
источник
Холст , 11 байт
Попробуй это здесь!
Объяснение:
источник
Haskell ,
140 138135 байтовПопробуйте онлайн! Call with
b 5
, возвращает список строк.Довольно использование печати:
(некоторые) Объяснение:
e n
генерирует строкуn
пробеловn!f
подушечки каждая строка в списке строкf
сn
пробелами слева и справаf n
рисует «пик» вn
по2n
прямоугольникуb n
рисует двоичное дерево, объединяя два меньших дерева и центрируя новый пик над нимиРедактировать: -3 байта благодаря Zgarb!
источник
1!f(n-1)
иm!f m
стоит сэкономить пару байтов.J ,
49 4342 байтаВ результате получается глагол, который принимает число и возвращает двумерный массив символов. Попробуйте онлайн!
объяснение
Сначала я строю матрицу значений -1, 0 и 1, повторяя вспомогательный глагол, а затем заменяю числа на символы. Вспомогательный глагол создает правую половину следующей итерации, а затем отражает ее по горизонтали, чтобы получить остальное. В следующем объяснении
,
конкатенация двухмерных массивов по вертикали и одномерных массивов по горизонтали.источник
JavaScript (ES6), 105 байт
Работает путем рекурсивного построения результата из базового варианта
/\
. Нижняя половина - это просто предыдущий случай с дублированием каждой строки. Верхняя половина была немного хитрее; похоже, что вы хотите взять предыдущий случай и оставить только две стороны, но вам также нужно беспокоиться о заполнении строк для удвоения ширины, поэтому вместо этого я использую магию регулярных выражений. Взяв начальные пробелы из предыдущего случая и разделив их в каждой точке, я могу рассмотреть пробелы до и после этой точки. При каждом совпадении пробелы до увеличения на 1 и пробелы после уменьшения на 1; это может быть использовано для позиционирования/
и\
в правильных местах. Новые строки и отступы также добавляются здесь; это берет на себя все отступы, кроме завершающего пробела в каждой строке и начального пробела в первой строке, которые я должен добавить вручную. (Ведущие пробелы в последующих строках взяты из совпадающей строки).источник
Древесный уголь , 12 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Длина линии составляет 1, 1, 2, 4, 8 ... 2 ^ (N-2), таким образом, неуклюжий расчет.
источник
Stax ,
2019 байтЗапустите и отладьте его
источник
Пакет, 218 байт
Примечание: строка 6 заканчивается пробелом. Работает, перемещая ветви влево и вправо соответственно каждый раз, за исключением строк, которые находятся на расстоянии 2 n от конца, и в этом случае ветви вместо этого разветвляются.
источник
Haxe, 181 байт
Или с некоторыми дополнительными пробелами:
Некоторое время я работал над решением, которое сначала создавало массив пространственных символов правильного размера, а затем итеративно помещал раздвоенные пути все ниже и ниже (и более плотно на каждой итерации). Осталось 230+ байтов. Подход здесь в значительной степени похож на подход @ Laikoni's Haskell. Я не мог сойти с рук, не имея
:String
, потому что Haxe не достаточно умен, чтобы определить, что тип возвращаемого значения всегда будет String.Это только функция, вот полная программа для тестирования:
Поместите вышесказанное в
Main.hx
, скомпилируйтеhaxe -main Main.hx -neko frac.n
и протестируйте сneko frac.n 4
(замените4
в нужном порядке).источник
PHP, 188 байт
Онлайн версия
расширенный
источник