Учитывая возможно вложенный, непустой массив однозначных положительных целых чисел (не гарантировано уникальных), выведите представление ASCII-art в виде дерева, используя символы рисования блоков ┌ ┴ ┐ ─ │ ┬ ┼
. (Они были скопированы из кодовой страницы 437, но вы можете использовать любое эквивалентное представление).
Каждое целое число массива должно быть листом дерева. Элементы одного уровня глубоко в массиве должны присутствовать на одном уровне дерева. Все элементы должны быть отделены друг от друга достаточным количеством пробелов, чтобы их можно было различить (до вас зависит, какова ширина, минимум одного пробела между ними).
Например, для данного массива [[1, [2]], [3, [4, 5]]]
выведите следующее дерево
┌─┴─┐
┌┴┐ ┌┴─┐
1 │ 3 ┌┴┐
2 4 5
Для массива [1, 2, 3]
дерево может выглядеть так
┌─┼─┐
1 2 3
Но массив [[1, 2, 3]]
будет выглядеть
│
┌─┼─┐
1 2 3
Хотя массив [1, [1, [1, [1]]]]
может выглядеть
┌─┴┐
1 ┌┴─┐
1 ┌┴┐
1 │
1
В качестве более сложного примера, [1, [[[2, 3], 4], 5]]
может быть
┌┴───┐
1 ┌─┴┐
┌─┴┐ 5
┌┴┐ 4
2 3
или несколько других вариантов.
- Вход и выход могут быть заданы любым удобным способом .
- Вы можете распечатать его в STDOUT или вернуть как результат функции.
- Либо полная программа или функция приемлемы.
- Любое количество посторонних пробелов является приемлемым, при условии, что символы выстраиваются соответствующим образом.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
источник
[1,[[[2,3],4],5]]
Это может быть интересным тестовым примером, поскольку ему нужно искусственно расширить корень, чтобы правое поддерево не сталкивалось с левым поддеревом.1
представляет собой массив из 3 -х элементов:[2,3]
,4
, и5
. Но 4 и 5 не соседствуют.[1, [[[2, 3]], [4], 5]]
на меня.Ответы:
Python 3 ,
400393390 байтВозвращает список строк сверху вниз.
РЕДАКТИРОВАТЬ 1: обрезать 7 байтов, избегая дублирования
┴┼
(чистое сохранение 2 байта), вырезая 0 из одной строки, изменяя способ выбора символов рисования┬┌┐
(используйте<
вместо==
) и заменяяL(z)
пропущенный I наe
РЕДАКТИРОВАТЬ 2: -2 байта благодаря ovs и -1 байту благодаря Kevin Cruijssen
Попробуйте онлайн!
Ungolfed
Строит дерево из листьев, по одному слою за раз.
источник
S,*K=' ┴┼│123456789'
.e==1
может быть,e<2
чтобы сохранить байт (я не думаю, что это когда-либо может быть 0, так как вызов заявляет, что вход не пустой - и пустые входные данныеmax(map(L,z))
в этом случае уже потерпели бы неудачу .)Чисто ,
544506 байтЭкранирование используется, чтобы избежать недопустимого UTF-8 в SE / TIO, но считается одним байтом, поскольку они являются действительными литералами
Попробуйте онлайн!
Принимает ввод в формате
L[I 3, L[I 4, I 5], I 2]..
Соединяет деревья снизу вверх, слева направо, затем корректирует расстояния справа налево.
Предварительно сертифицированный, вроде:
источник
Древесный уголь ,
127123 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Измените направление рисования по умолчанию на вверх, так как мы ничего не рисуем справа.
Первый шаг заключается в преобразовании вложенного представления массива в представление индекса , который является списком всех записей вместе с индексами подмассивов, например , для ввода является и , следовательно , в списке мы хотим . Мы начинаем с единственной записи для обработки, которая представляет собой список, содержащий список текущих индексов (то есть пока ни одного) и исходный ввод.
q=[1, [[[2, 3]], [4], 5]]
5
q[1][2]
1, 2
Зацикливайтесь на массивах по мере их обработки. (Удобно, что Charcoal будет продолжать перебирать список, если вы нажмете на него во время итерации.)
Получить следующий массив для обработки.
Это на самом деле скаляр, а не массив?
Если так, то список, который у нас был, фактически принадлежит к окончательному списку списков индексов.
В противном случае, цикл по каждому элементу в этом массиве ...
... и сохраните его с новым списком индексов для дальнейшей обработки. Также сохраняется максимальный индекс массива, который используется для особого случая последнего элемента массива.
Теперь мы готовы перебрать список индексов. Однако список не в лексикографическом порядке, поэтому мы не можем повторить его напрямую.
Найти следующий элемент в лексикографическом порядке.
Удалить его из списка.
Перейти к положению скаляра на выходе. Мы можем рассчитать это, учитывая, что мы можем вести подсчет количества скаляров, которые мы выводим, и мы также знаем количество записей в его индексном списке.
На самом деле распечатать скаляр.
Цикл по записям в списке индексов. Опять же, это не простая итерация, потому что записи идут парами, и мы также должны иметь возможность выйти из цикла.
Извлеките следующий индекс из списка.
Если это не первый элемент в списке ...
... затем распечатать
┐
или в┬
зависимости от того, является ли это последним элементом в списке ...... и выведите достаточно
─
s, чтобы заполнить предыдущую запись на этом уровне ...... и очистите переменную, чтобы выйти из цикла, так как мы здесь закончили.
В противном случае, если это (первый элемент) многоэлементный список, выведите его
┌┴
, оставив курсор над,┴
чтобы иметь дело с родителем этого уровня.В противном случае, если это список из 1 элемента, просто выведите a
│
и переместите строку вверх, чтобы иметь дело с родителем этого уровня.источник