Вам будет предоставлен вложенный массив. Ваша программа должна визуализировать массив.
Но как?
Например, давайте предположим, что у нас есть вложенный массив, например [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Этот вложенный массив может быть визуализирован как:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Примеры
Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron
Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4
правила
- Вы можете использовать строку (или другие типы, которые работают как вложенный массив) в качестве входных данных.
- Максимальный уровень «слоев» составляет 2 ^ 32-1.
code-golf
printable-ascii
Мэтью Ро
источник
источник
Ответы:
APL, 32 байта
Тестовое задание:
Объяснение:
{
...}∘0
: запустить следующую функцию с0
привязкой к⍵
:1=≡⍺:
: если вход имеет глубину 1 (т.е. массив, который не содержит других массивов):⍵/'->'
: создать строку, содержащую⍵
-
s и⍵
>
s,1↓
: отбросить первый элемент,⍵↑
: и возьмите первые⍵
элементы. В результате получается строка, содержащая⍵-1
тире и единицу>
.⍺,⍨
: добавить вход к нему,⎕←
: и вывести это на экран⋄
: в противном случае,⍺∇¨⍵+1
: добавить 1⍵
и применить функцию к каждому вложенному массивуисточник
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 байтСпасибо Грегу Мартину за сохранение 1 байта.
Спасибо ngenisis за сохранение 1 байта.
источник
Java 7,
153141114 байт-39 байт благодаря @ Barteks2x
Объяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
for(int j=i;j-->0;r+="-");
чтобы также делать то, что делает следующая строка, и используя универсальный аргумент вместо Object []:String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;}
и даже на 1 символ меньше, если передать 1 вместо 0 в качестве первого аргумент в порядке.[]
из параметра для сохранения 1 дополнительного байта дает ошибку. Смотрите ошибку здесь > Отладка после запуска.String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}
это работает. Также вы можете сделать аналогичный общий трюк со строкой, чтобы сохранить дополнительный байт, но требует либо сохранения результата в переменной перед его печатью, либо явного приведения (неоднозначный вызов метода):String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}
И требование для приведения строки к типу возврата при вызове это прошло.PHP,
77 7473 байта4 байта сохранены благодаря @manatwork.
рекурсивная функция, требует PHP 7.1 или новее для отрицательного индекса строки.
"$e"
этоArray
для массивов; так"$e"!=$e
же, какis_array($e)
.>
-
префикс к каждому уровнюисточник
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
его можно заменить на$e[-1]!==""
.$e[-]==""
... и с обратным условием$e[-1]>""
. Хорошая находка!$e[-1]>""
может быть заменен"$e"==$e
. По крайней мере, в древнем PHP 5.6 я использую.C99 (GCC),
201187140112109Расширенная форма:
Это берет строку в правильном формате и завершается при поиске последнего соответствия
]
.Он не использует рекурсию и использует длинные типы для достижения второго правила: 2 ^ 32-1 уровней . Большинство языков сценариев имеют ограниченную глубину рекурсии или просто аварийно завершают работу при переполнении стека.
Я не привык к гольфу в C, любая помощь приветствуется :)
Спасибо Болову за его советы! Особенно благодаря Титу, который всегда готов к хорошей игре в гольф (даже в C)!
Еще два байта сохраняются благодаря тому факту, что мы можем закончить, как только мы сопоставим последний
]
и нам не нужно совпадать с нулевым символом.Это можно проверить в Wandbox .
источник
for(int d=1 ...
?long
имеет 4 символа, в то время какint
имеет только 3, и нет никаких причин, по которым вам нужно сделать так, чтобы оно превышало значение,2^32 - 1
чтобы отправка была действительной, сохраняя вам один байт.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
намного меньше, чем2^32-1
.2^32-1
не подходит, вint
то время как он соответствуетunsigned
или илиlong
(это, конечно, на большинстве систем / компиляторов). Поэтомуint
не смог бы дать правильный ответ (как большинство ответов здесь не может быть).JavaScript (ES6),
5851 байтРедактировать: Сохранено 7 байт, когда @Arnauld указал, что я могу объединить два моих подхода.
источник
PHP,
129 123 112 109 95 9391 байтИтеративное решение берет строку из STDIN:
Запустите ее
echo '<input>' | php -nR '<code>'
или протестируйте онлайн .сломать
Рад, что цифры в кавычках; поэтому мне нужно только одно действие за раз.
ASCII возиться
Добавление 3 штрихов
$p
и удаление 2 для[
, 4 для]
добавляет один для[
и удаляет один для]
.источник
Python 2,
6564 байтаПрямо сейчас мой ответ последовательно начинается без черточек, поэтому
["foo", "bar"]
:источник
import sys, pprint; pprint.pprint(sys.argv)
43 байта, но я не знаю, нарушает ли он правила игры в гольф.f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
import sys, pprint.pprint as p; p(sys.argv)
все еще 43, но хорошее предложение тем не менее; D Попыткаimport sys.argv as v
фактически удлиняет это приблизительно ~ 48 байтов. Если бы можно было устранить sys.argv, они бы сэкономили много, но тогда программа становится совершенно бесполезной. Рекурсивный подход довольно длинныйdef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~ 80 байт.Perl 5 , 55 байт
53 байта кода +
-nl
флаги.Попробуйте онлайн!
Не оптимально для регулярных выражений из-за некоторых острых случаев, которые могут произойти (в частности, если элемент массива содержит скобки внутри).
Хотя рекурсивная анонимная функция была бы чуть длиннее (61 байт):
Попробуйте онлайн!
Но то, как Perl обрабатывает параметры, не является оптимальным для функций игры в гольф: отсутствие дополнительных параметров означает, что мне нужно сделать вторую (анонимную) функцию, вызывающую первую, и я должен явно получить последний параметр с этой длинной
my$v=pop
.источник
Рубин,
49 4546 байтПример:
Объяснение:
Рекурсивная функция: если
x==[*x]
тогда x является массивом, и мы перебираем его. Если нет, сделайте отступ.источник
Haskell, 104 байта
У Haskell нет вложенных списков с разной глубиной, поэтому мне приходится разбирать входную строку самостоятельно. К счастью, библиотечная функция
reads
может анализировать строки (т."
Е. -Замкнутая последовательность символов), поэтому здесь я немного помог.Пример использования:
Попробуйте онлайн! ,
Как это устроено:
Функция
#
проходит строку char с помощью char и сохраняет уровень вложенности (первый параметрl
) в виде строки-
с финалом>
. Если заголовок списка можно проанализировать как строку, возьмитеl
строку и строку, а затем рекурсивный вызов со удаленной строкой. Если первый символ - пробел, пропустите его. Если это,
, возьмите новую строку и продолжайте, если это так]
, снизьте уровень вложенности и продолжайте, а в противном случае (только[
слева) поднимите уровень вложенности и продолжайте. Рекурсия заканчивается пустой строкой ввода. Основная функция(">"#)
устанавливает уровень вложенности">"
и вызывает#
.источник
SWI-Пролог, 115 байт
Разрывы строк добавлены только для удобства чтения, не включены в число байтов.
p
Предикат рекурсивно обходит массивы, добавляя «-» к префиксуF
при перемещении уровня глубже.w
используется для записи массива префиксов, а также фактического элемента в вывод.Пример:
источник
Пакетный, 249 байт
Досадно, что Пакет не может сравнивать запятые. Образец прогона:
источник
Сетчатка ,
635452 байтаСохранено 2 байта благодаря Мартину Эндеру
Попробуйте онлайн!
объяснение
Во-первых, массив разбивается путем замены каждой строки в кавычках на все, что было до нее, а также на себя и на новую строку. Разбивая его так, можно найти непревзойденные открывающие скобки перед каждой строкой.
Эта транслитерации заменит
[
с-
, оставить]
без изменений, а также удалить любой другой символ (-~
все печати ASCII). Однако он заменяет только символы, появляющиеся перед последней строкой в каждой строке.Далее все экземпляры
-]
удаляются. Они соответствуют совпадающим парам скобок, и нам нужны только несопоставимые скобки. После их удаления каждая строка имеет число-
s, равное количеству непревзойденных открывающих скобок перед ней.Последний
-
перед a"
заменяется на>
, чтобы сформировать стрелки.Наконец, все остальные
]
s и"
s удаляются.источник
Röda , 54 байта
Попробуйте онлайн!
Это функция, которая читает входной массив из потока. Для каждого элемента он либо вызывает себя рекурсивно, либо печатает элемент.
источник
Python 3, 80 байт
Кажется, кто-то знал рекурсию поддержки лямбд Python.
Это счетчик / комплимент к ответу orlp .
источник
=
. Я также подозреваю, что вы можете отбросить все пробелы после трех)
, но я не очень знаком с игрой в гольф на Python.Groovy, 92 байта
источник
С накоплением , 27 байтов
Попробуйте онлайн!
Принимает ввод с вершины стека и оставляет вывод на STDOUT. Это просто, как сделать карту глубины, повторять
-
d
времена, объединять с «>» и самим элементом.источник
Гема, 63 персонажа
Как и другие решения синтаксического анализа, предполагается, что в строках не будет экранированных двойных кавычек.
Образец прогона:
источник
JQ,
7067 символов(
6764 символов кода + 3 символа командной строки)Образец прогона:
Он-лайн тест
источник