W przypadku tego wyzwania lista jest uważana za ważną tylko wtedy, gdy składa się wyłącznie z liczb całkowitych i prawidłowych list (definicje rekurencyjne \ o /). W przypadku tego wyzwania, podając prawidłową listę i liczbę całkowitą, zwróć listę wszystkich głębokości, na których można znaleźć liczbę całkowitą.
Przykład
Rozważmy listę [1, [2, [3, [1, 2, 3], 4], 1], 1]
i liczbę całkowitą 1
. Następnie możemy narysować listę w następujący sposób:
Depth 0 1 2 3
Num 1
2
3
1
2
3
4
1
1
Zauważysz, że 1
pojawia się na głębokościach 0, 1, 3
. Dlatego twój wynik powinien mieć 0, 1, 3
jakiś rozsądny format (kolejność nie ma znaczenia).
Głębokość może być indeksowana 0 lub 1, ale proszę podać w zgłoszeniu, która to jest.
Przypadki testowe (indeksowane 0)
Do listy [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]
Do listy [[[[[1],0],1],0],1]
:
0 -> 1, 3
1 -> 0, 2, 4
Do listy [11,22,[33,44]]
:
11 -> [0]
22 -> [0]
33 -> [1]
44 -> [1]
Zwróć pustą listę, jeśli szukanego terminu nigdzie nie ma na liście.
Wartości ujemne i zerowe są prawidłowe na liście wejściowej i w terminie.
źródło
Odpowiedzi:
Mathematica, 25 bajtów
(zwraca 1-indeksowane wyjście)
Wyjaśnienie
źródło
Haskell ,
102938076 bajtówDzięki Bruce Forte za uratowanie niektórych bajtów, a Laikoni za uratowanie niektórych.
Dzięki 4castle za oszczędność 4 bajtów.
Haskell nie ma typu danych dla tego rodzaju listy, więc stworzyłem własny.
To rozwiązanie jest
1-indexed
Wypróbuj online!
Najpierw definiuję (rekurencyjnie) typ danych
T
T
ma albo typE Int
(pojedynczy element typuInt
), alboL[L]
(lista typówT
).(%)
jest funkcja, która bierze2
argumenty, o rodzajuT
, listy, przez którą szukamy, ix
TheInt
szukamy.Ilekroć
(%)
znajdzie coś, co jest pojedynczym elementemE n
, sprawdzan
równośćx
i zwraca wartość0
True.Po
(%)
zastosowaniu doL s
(gdzies
ma typ[T]
), działa(%)
na wszystkich elementachs
i zwiększa wynik (wraz ze wzrostem głębokości, ponieważ patrzymy do środkas
) i konkatenuje wynik.nub
następnie usuwa duplikaty z listyNB.
import Data.List
jest tylko dlanub
.źródło
E n
iL s
.Python 2 , 68 bajtów
Wypróbuj online!
źródło
Python 2 , 72 bajty
Wypróbuj online!
źródło
Galaretka ,
118 bajtówWypróbuj online!
Jak to działa
Przykładowy przebieg
Za lewy argument
W
najpierw daje następującą tablicę.ẎÐĿ
wielokrotnie łączy wszystkie elementy na głębokości 1 , zmniejszając głębokość tablicy o 1 w każdym kroku. Daje to następującą tablicę wyników pośrednich.Dla prawego argumentu 1 ,
ċ€
zlicza wystąpienia 1 na każdym wyniku pośredniego.I
teraz bierze wszystkie różnice naprzód.Różnice niezerowe odpowiadają etapom, w których co najmniej jeden inny 1 został dodany do głębokości 1 . Zatem niezerowa różnica przy wskaźniku k wskazuje na obecność 1 na głębokości k .
T
znajduje wskaźniki wszystkich prawdziwych elementów, dając pożądany rezultat:źródło
R ,
1019592100 bajtówWypróbuj online!
Rozwiązanie rekurencyjne; w bajtach jest dość nieefektywny, ale
lists
praca z R jest bardzo denerwująca.Zasadniczo, wykonuje
L
i dla każdego elementux
zL
, (który jest albolist
alboatomic
wektor jeden element) sprawdza, czyn
znajduje się%in%
x
, a następnie sprawdza, czyx
jest tolist
. Jeśli nie, tox==n
zwracamy głębokośćd
; inaczej nazwać rekurencyjnief
nax
, zwiększającd
.To, oczywiście, zwraca a
list
, które myunlist
iunique
dla zapewnienia prawidłowego wyniku (zwracanie wektora głębokości całkowitych); zwracaNULL
(pusta lista) za niepoprawnąn
.Najwyraźniej
%in%
nie wyszukuje rekurencyjnie wlist
taki sposób, jak myślałem, więc muszę znaleźćunlist(x)
+8 bajtów :(źródło
APL (Dyalog) , 39 bajtów *
Pełny program Monity o listę, a następnie o numer. Drukuje listę opartą na 1 do STDOUT.
Wypróbuj online!
⎕
monit o listę⊢
wydajność, która (oddziela0
i⎕
)⎕JSON⍠'Compact'0
konwertuj na wcięty ciąg JSON z nowymi liniami⎕FMT
konwertuj na macierz (jedna linia rozdzielana znakiem nowej linii na wiersz)⍞⍷
monituj o numer jako ciąg znaków i wskaż, od czego zaczyna się od tego∨⌿
pionowa redukcja OR (tj. w których kolumnach zaczyna się)⍸
wskaźniki tych początków2÷⍨
zmniejszyć o połowę (poziomy są wcięte dwoma spacjami)⌊
zaokrąglanie w dół (ponieważ pierwsza kolumna danych to kolumna 3)* W Dyalog Classic, licząc
⍸
jako⎕U2378
i⍠
jako⎕OPT
.źródło
PHP , 117 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
7968 bajtówZwraca zestaw. Jeśli jest to niedopuszczalne, użyj
&&[...r]
za cenę 5 bajtów.źródło
Galaretka ,
1716 bajtówPełny program pobierający dwa argumenty wiersza poleceń z listą i elementem do sprawdzenia oraz drukujący głębokość lub głębokości (jeśli występują), na których element istnieje. Wyniki są indeksowane 1.
Wypróbuj online!
W jaki sposób?
źródło
JavaScript (ES6),
7374 bajtyWyjaśnienie:
Przypadki testowe
Pokaż fragment kodu
źródło
e[0]
aby było zerowe, co zrzuciłoby twój test.e.pop
na utratę jednego bajtu.Python 3 ,
1238682 bajtówWypróbuj online!
-37 bajtów dzięki Hyper Neutrino i ovs
-4 bajty dzięki Jonathanowi Frechowi
źródło
if type(a[i])!=int
-1 bajtul+=[d]
-5 bajtówl+=[d]*(a[i]==n)
-cokolwiek_numer_z_bytes_it_is[]==a[i]*0
krótszy czeku typua
zamiast zakresu igetitem
APL (Dyalog Classic) ,
3130 bajtówFunkcjonować. Lewy arg
⍺
to igła, prawy arg⍵
to stóg siana.Wypróbuj online!
źródło
Oktawa ,
126122 bajtówWypróbuj online!
Aby zapewnić czytelność, w
;
miarę możliwości zastąpiłem spacje lub końce linii. Objaśnienie niepoznanego kodu:źródło
Java, 154 + 19 = 173 bajtów
Wypróbuj online
Metoda bez golfa
źródło