Для этой задачи список считается действительным, если и только если он полностью состоит из целых чисел и допустимых списков (рекурсивные определения \ o /). Для этой задачи, учитывая действительный список и целое число, возвращают список всех глубин, на которых можно найти целое число.
пример
Давайте рассмотрим список [1, [2, [3, [1, 2, 3], 4], 1], 1]
и целое число 1
. Затем мы можем составить список следующим образом:
Depth 0 1 2 3
Num 1
2
3
1
2
3
4
1
1
Вы заметите, что 1
появляется на глубине 0, 1, 3
. Таким образом, ваш вывод должен быть 0, 1, 3
в каком-то разумном формате (порядок не имеет значения).
Глубина может быть либо 0-, либо 1-индексированной, но, пожалуйста, укажите в своем представлении, какая она есть.
Тестовые случаи (0-indexed)
Для списка [1,[2,[3,4],5,[6,7],1],[[[[5,2],4,[5,2]]],6],3]
:
1 -> [0, 1]
2 -> [1, 4]
3 -> [0, 2]
4 -> [2, 3]
5 -> [1, 4]
6 -> [1, 2]
7 -> [2]
Для списка [[[[[1],0],1],0],1]
:
0 -> 1, 3
1 -> 0, 2, 4
Для списка [11,22,[33,44]]
:
11 -> [0]
22 -> [0]
33 -> [1]
44 -> [1]
Вернуть пустой список, если поисковый термин не существует в списке нигде.
Отрицательные и нулевые значения действительны в списке ввода и сроке.
источник
Ответы:
Mathematica, 25 байтов
(возвращает 1-индексированный вывод)
объяснение
источник
Haskell ,
102938076 байтовСпасибо Брюсу Форте за сохранение нескольких байтов и Лайкони за сохранение еще нескольких.
Спасибо 4castle за сохранение 4 байта.
У Haskell нет типа данных для такого рода списков, поэтому я создал свой собственный.
Это решение
1-indexed
Попробуйте онлайн!
Сначала я определяю (рекурсивно) тип данных
T
T
имеет либо типE Int
(один элемент типаInt
), либоL[L]
(список типовT
).(%)
это функция , которая принимает2
аргументы, по типуT
, список , через которые мы искомые, иx
, тоInt
мы ищем.Всякий раз, когда
(%)
находит что-то, что является единственным элементомE n
, он проверяетn
равенство сx
и возвращает значение0
True.Когда
(%)
применяется кL s
(гдеs
имеет тип[T]
), он запускается(%)
на всех элементахs
и увеличивает результат (поскольку глубина увеличивается, поскольку мы смотрим внутрьs
), и объединяет результат.nub
затем удаляет дубликаты из спискаNB.
import Data.List
только дляnub
.источник
E n
иL s
.Python 2 , 68 байт
Попробуйте онлайн!
источник
Python 2 , 72 байта
Попробуйте онлайн!
источник
Желе ,
118 байтПопробуйте онлайн!
Как это устроено
Пример запуска
Для левого аргумента
W
Сначала выдает следующий массив.ẎÐĿ
многократно объединяет все элементы на глубине 1 , уменьшая глубину массива на 1 на каждом шаге. Это дает следующий массив промежуточных результатов.Для правильного аргумента 1 ,
ċ€
подсчитывает число вхождений 1 в каждом промежуточном результате.I
теперь берет все форвардные различия.Ненулевые различия соответствуют шагам, на которых по меньшей мере еще один 1 был добавлен на глубину 1 . Таким образом, ненулевая разность по индексу k указывает на наличие 1 на глубине k .
T
находит индексы всех истинных элементов, дающих желаемый результат:источник
R ,
1019592100 байтовПопробуйте онлайн!
Рекурсивное решение; это довольно неэффективно в байтах, но R
lists
очень раздражает в работе.В основном, принимает
L
, и для каждого элементаx
изL
, (который является либоlist
илиatomic
вектор одного элемента), проверяет , является лиn
это%in%
x
, а затем проверяет , является лиx
этоlist
. Если это не так, тоx==n
мы возвращаем глубинуd
; в противном случае мы рекурсивный вызовf
наx
, приращенииd
.Это, конечно, возвращает a
list
, который мыunlist
иunique
для обеспечения правильного вывода (возвращаем вектор целочисленных глубин); возвращаетNULL
(пустой список) для недействительныхn
.Видимо,
%in%
не ищет рекурсивно через то,list
что я думал, поэтому мне нужноunlist(x)
+8 байт :(источник
APL (Dyalog) , 39 байт *
Полная программа. Запрашивает список, затем номер. Распечатывает 1-й список в STDOUT.
Попробуйте онлайн!
⎕
запросить список⊢
дать это (отделяет0
и⎕
)⎕JSON⍠'Compact'0
преобразовать в отступ строки JSON с символами новой строки⎕FMT
преобразовать в матрицу (одна строка с разделителем новой строки в строке)⍞⍷
запросить число в виде строки и указать, где он начинается в этом∨⌿
вертикальное уменьшение ИЛИ (то есть, в каких столбцах оно начинается)⍸
индексы тех начал2÷⍨
разделить пополам (уровни имеют два пробела)⌊
округлить вниз (поскольку первый столбец данных - это столбец 3)* В Dyalog Classic, считая
⍸
как⎕U2378
и⍠
как⎕OPT
.источник
PHP , 117 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
7968 байтВозвращает набор. Если это неприемлемо, используйте
&&[...r]
по 5 байт.источник
Желе ,
1716 байтПолная программа, принимающая два аргумента командной строки: список и проверяемый элемент, и печать глубины или глубины (если есть), на которой существует элемент. Результаты 1-индексированы.
Попробуйте онлайн!
Как?
источник
JavaScript (ES6),
7374 байтаОбъяснение:
Контрольные примеры
Показать фрагмент кода
источник
e[0]
чтобы быть нулевым, что отбросило бы ваш тест.e.pop
потерю одного байта.Python 3 ,
1238682 байтаПопробуйте онлайн!
-37 байт благодаря Hyper Neutrino и овам
-4 байта благодаря Джонатану Фреху
источник
if type(a[i])!=int
-1 байтl+=[d]
для -5 байтl+=[d]*(a[i]==n)
для -whither_number_of_bytes_it_is[]==a[i]*0
в течение более короткого проверки типаa
вместо диапазона и использоватьgetitem
так много для - ~ 20 байтовAPL (Dyalog Classic) ,
3130 байтФункция. Левый арг
⍺
- это игла, правый⍵
- стог сена.Попробуйте онлайн!
источник
Октава ,
126122 байтаПопробуйте онлайн!
Для удобства чтения я заменил пробелы или
;
концы строк, где это возможно. Объяснение негольфированного кода:источник
Java, 154 + 19 = 173 байта
Попробуйте онлайн
Метод без волка
источник