вход
Массив, который может содержать массивы или положительные, последовательные, восходящие целые числа. Массивы могут иметь любое количество массивов внутри, и так далее, и тому подобное. Никакие массивы не будут пустыми.
Выход
Этот массив упрощен
Как упростить массив
Мы будем использовать массив, [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
как наш пример.
Сначала мы проверяем, насколько глубоко значения вложены. Вот глубины и числа на этих глубинах:
0 1
1 2 3 9
2 4 7
3 5 6
5 8
Мы создаем выходной массив, беря числа в исходном массиве, группируя их по степени их вложенности, а затем вкладывая группы в глубины исходных глубин их элементов. Расположите числа в порядке возрастания и глубины возрастания.
Итак, наш вывод [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
Примеры
[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]] -> [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
[[[1]], [2, [3]], 4, [5, [6, [7, [8], [9, [[10]]]]]]] -> [4, [2, 5], [[1, 3, 6]], [[[7]]], [[[[8, 9]]]], [[[[[[10]]]]]]]
[1] -> [1]
[1, [2], [[3]], [[[4]]], [[[[5]]]]] -> [1, [2], [[3]], [[[4]]], [[[[5]]]]]
[1, [[[[2], 3]]] [[4]]] -> [1, [[4]], [[[3]]], [[[[2]]]]]
code-golf
array-manipulation
Даниил
источник
источник
8
на линииSo, our output is.....
. Однако вы исправили это во фрагменте примеров.[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[]]]], [[[[[8]]]]]]
?Ответы:
Желе , 8 байт
Выход - один уровень на строку, с пустыми строками для уровней без элементов. Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
139109 байтОбъяснение с использованием примера input:
v
вспомогательный метод, который возвращает массивы (с параметром1
) или значения (без параметра). Начнем с тогоa = [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
, что непусто. Мы отфильтровываем массивы, даем[1]
. Затем мы рекурсивно обращаемся к сцепленным массивам, что является[2, 3, [4], [[5, 6], 7, [[[8]]]], 9]
результатом[2, 3, 9, [4, 7], [[5, 6]], [[[[8]]]]]
. Мы снова отфильтровываем массивы, что дает нам второй член нашего вывода[2, 3, 9]
, однако мы должны быть осторожны, чтобы не вставлять здесь пустой массив. Осталось обернуть массивы[4, 7], [[5, 6]], [[[[8]]]]
внутри массивов и добавить их к выводу, в результате чего[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
.источник
filter
. Может быть, начать сF=(x,y)=>x.filter(y)
[].concat(...v(1))
на,v(1)
чтобы сохранить 14 байтов. Возможно, есть и несколько других вещей, но мне трудно отследить вложенные скобки в моей голове.[].concat(...v(1))
совсем другой зверьv(1)
, иначе я бы этого не сделал! Для простого примера рассмотримa = [2, [3], [[4]]]
тогда,v(1) = [[3], [[4]]]
но[].concat(...v(1)) = [3, [4]]
.05AB1E ,
27262521 байтПопробуйте онлайн! (немного изменен, поскольку
.g
еще не на TIO)объяснение
Основная стратегия состоит в том, чтобы зацикливаться на каждом возможном уровне вложенного массива и печатать любые цифры в одной строке, сохраняя недвоенные цифры (списки) в списке на один уровень меньше вложенного.
источник
Perl, 52 байта
Просто рекурсивная подпрограмма. (необычно для ответа на Perl, я знаю ..)
Назовите это так:
Каждая строка вывода соответствует уровню глубины массива (отсюда и пустая строка в приведенном выше примере).
Его можно превратить в полную программу всего за несколько байтов: добавить
-n
флаг иeval
(внутри,@{ }
чтобы преобразовать входные данные в массив, а не arrayref), чтобы преобразовать входные данные в массив Perl:Мой предыдущий подход был немного длиннее (65 байт), но все еще интересен, поэтому я позволю его здесь:
источник
JavaScript (ES6) 121
144 152редактировать Пересмотрено много, 1 байт сохранен, спасибо Патрику Робертсу, и еще 21, просто просматривая код
Рекурсивная функция, работающая с массивами на входе и выходе. Мне не нравится требованию , имеющие элементы на глубине 1 в качестве отдельных элементов в выходном массиве ( в то время как более высокие уровни группируются как один элемент):
[l1,l1, [l2...], [[l3...]] ]
. Хотя это было бы более прямым:[ [l1...], [[l2...]], [[[l3...]]] ]
Новая строка добавлена для удобства чтения.
Некоторые примечания: строка 2 вычисляется снова и снова при каждом рекурсивном вызове, но полезна только последняя итерация в конце рекурсии.
Специальная обработка
d==0
в строке 2 обеспечивает аномалию для элементов уровня 1. Рекурсивная функция обрабатывает массив гнездящихся на выходеn
Тест
источник
v[0]
вместо этого будет более простой тест для вашего троичного оператораv.map
. Сохраняет 1 байт.JavaScript (ES6) 168 байт
демонстрация
источник
PHP, 145 байт
Сломать
источник
Pyth,
1916 байтПопробуйте онлайн. Тестирование.
Обратите внимание на ведущий пробел. Выводит уровни в строках, как в Perl.
объяснение
Q
.f
МСДЭНИ элементыT
изQ
модели:s
неI
горит ли зубT
.p
ечатьT
плюс пространство+
...d
.s
гм предметы. Это удаляет слой массивов из каждого элемента. Если ничего не осталось, дает0
.=
результатQ
.W
если результат не пуст, выведите пустую строкуk
и символ новой строки.источник
Haskell,
124123 байтаПоскольку Haskell по умолчанию не поддерживает смешанные списки (целые числа и список целых чисел), я определяю пользовательский тип списка
L
. Пример использования:Примечание: для запуска требуется некоторое время, потому что он перебирает все положительные целые числа (32 или 64 бита), чтобы найти уровень гнезда настолько глубоко. Кроме того: пользовательский тип списка не может быть напечатан по умолчанию, поэтому, если вы хотите увидеть результат, как в примере выше, вам нужно добавить
deriving Show
вdata
объявление (->data L=I Int|R[L] deriving Show
). Поскольку он не нужен для возврата L-списка из функции, я не считаю байты.Как это работает:
Редактирование @BlackCap спас байты при переходе от
>>=
кdo
нотации. Благодарность!источник
h l=R$do d<-[1..];[i|(e,i)<-0#l,d==e]!d
JavaScript (ES6),
127137134 байтовПринимает массив в качестве входных данных и возвращает строку.
Контрольные примеры
Показать фрагмент кода
источник