Напишите программу или функцию, которая принимает непустой список целых чисел в любом удобном формате, например, 4, 0, -1, -6, 2
или [4 0 -1 -6 2]
.
Распечатайте или верните строку, которая отображает список в виде художественного леса ASCII, где каждое число становится деревом пропорциональной высоты. Каждое дерево занимает четыре столбца текста в выводе следующим образом:
Целое положительное число N становится деревом, основание которого
__|_
и вершина^
с N слоями/ \
между ними.Например, когда N = 1, дерево
^ / \ __|_
когда N = 2 дерево
^ / \ / \ __|_
когда N = 3 дерево
^ / \ / \ / \ __|_
и так далее.
Отрицательное целое число N становится таким же, как соответствующее положительное дерево, за исключением того, что вертикальная черта находится между косыми чертами вместо пробела.
Например, когда N = -1, дерево
^ /|\ __|_
когда N = -2 дерево
^ /|\ /|\ __|_
когда N = -3 дерево
^ /|\ /|\ /|\ __|_
и так далее.
Когда целое число равно 0, технически нет дерева, просто пустое пространство из четырех подчеркиваний:
____
Подчеркивания у основания каждого дерева должны располагаться в выходных данных, то есть все деревья должны иметь свои базы на одном уровне. Кроме того, одиночное подчеркивание добавляется в конец строки подчеркивания после последнего дерева. Это делает так, чтобы у каждого дерева был пустой столб "воздуха" по обе стороны от него.
Например, вывод для 4 0 -1 -6 2
будет
^
/|\
^ /|\
/ \ /|\
/ \ /|\ ^
/ \ ^ /|\ / \
/ \ /|\ /|\ / \
__|_______|___|___|__
Обратите внимание, что у шаблонов дерева всегда есть начальный столбец пустого пространства, но необходимо добавить подчеркивание, чтобы дополнить правую часть последнего дерева.
Также:
- Конечные пробелы на любых строках хороши, но не должно быть лишних начальных пробелов.
- Начальные символы новой строки не допускаются (самое высокое дерево должно касаться вершины сетки выходного текста), и допускается только до одного завершающего символа новой строки.
- Список может содержать любые целые числа от -250 до 250 включительно. Обработка более высоких деревьев не требуется.
Самый короткий код в байтах побеждает.
Больше примеров
3
:
^
/ \
/ \
/ \
__|__
-2
:
^
/|\
/|\
__|__
0
:
_____
0, 0
:
_________
0, 1, 0
:
^
/ \
______|______
0, -1, 2, -3, 4
:
^
^ / \
^ /|\ / \
^ / \ /|\ / \
/|\ / \ /|\ / \
______|___|___|___|__
источник
_
(подчеркивание) после последнего дерева._
.Python 2, 165 байт
Это полная программа, которая принимает список в качестве входных данных. Я все еще играю в гольф в этом ужасном беспорядке.
источник
PHP, 231
277байтЭта задача имеет прекрасный результат.
Читает список через запятую (пробелы не обязательны) из
STDIN
:Ungolfed
Правки
if/else
тернарные операторы и перемещены некоторые переменные, чтобы сохранить несколько байтов.источник
Рубин,
157156153 символовНаписано только потому, что изначально
Array.transpose
выглядело как хорошая идея. Уже нет.Образец прогона:
источник
C #, 318 байт
Я попытался транспонировать массив. Я не уверен, что это было лучшее решение.
Отступы и новые строки для ясности:
источник