Proste wyzwanie na poniedziałkowy wieczór (no lub wtorek rano w drugiej połowie świata ...)
Jako dane wejściowe podano zagnieżdżoną, potencjalnie poszarpaną tablicę dodatnich liczb całkowitych:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Twoim zadaniem jest określenie jego głębokości, która jest największą głębokością zagnieżdżenia spośród liczb całkowitych na liście. W tym przypadku, głębokość 11
Is 6
, która jest największa.
Możesz założyć, że żadna z tablic nie będzie pusta.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wejściowe mogą być pobierane w dowolnym dogodnym formacie listy lub ciągu, który obsługuje tablice nie prostokątne (z zagnieżdżonymi tablicami o różnych głębokościach), o ile rzeczywiste informacje nie są przetwarzane wstępnie.
Nie wolno używać żadnych wbudowanych funkcji związanych z kształtem tablic (w tym wbudowanych, które rozwiązują to wyzwanie i które dają wymiary zagnieżdżonej tablicy). Jedynym wyjątkiem jest uzyskanie długości tablicy.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
[1] -> 1
[1, 2, 3] -> 1
[[1, 2, 3]] -> 2
[3, [3, [3], 3], 3] -> 3
[[[[1], 2], [3, [4]]]] -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1] -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]] -> 7
źródło
≡
jest wbudowanym prymitywem APL właśnie do tego .\
w danych wejściowych? EDYCJA: nevermind po prostu tak to próbował. To nawet nie działa. Cholera, czy nie mogę używać argumentów CMD?Odpowiedzi:
K, 4 bajty
W K
,/
połączy wszystkie elementy listy. Wspólny idiom,//
przechodzi do stałego punktu, całkowicie spłaszczając dowolnie zagnieżdżoną listę.,/\
wykona iterację do stałego punktu w podobny sposób, ale zbierze listę wyników pośrednich. Licząc, ile wyników pośrednich odwiedzamy przed osiągnięciem stałego punktu (#
), otrzymujemy pożądaną odpowiedź: maksymalną głębokość zagnieżdżenia.„Liczba złączy nad skanowaniem w punkcie stałym”.
W akcji:
źródło
Siatkówka , 10
Tutaj format wejściowy jest nieco wymyślony -
_
znaki są używane do separatorów list, więc dane wejściowe wyglądałyby tak{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
i wszystkie inne\w
postacie. Powoduje to, że a) utworzenie wszystkich list na wszystkich poziomach składa się tylko z jednego elementu oraz b) usunięcie wszystkich znaków niestrukturalnych.{
. Daje to najgłębszy poziom zagnieżdżenia.Wypróbuj online.
Jeśli to za dużo, poprzednia odpowiedź brzmiała:
Siatkówka , 13
Zakłada, że listy są zawarte w nawiasach klamrowych
{}
.Wypróbuj online .
źródło
_
zamiast,,
ale może to być trochę rozciągnięte._
separatory mogą być zbyt wymyślone. W odpowiedzi zostawiam więc obie wersjePython 2, 33 bajty
Rekurencyjnie definiuje głębokość, mówiąc, że głębokość liczby wynosi 0, a głębokość listy jest o jeden większa niż maksymalna głębokość jej elementów. Liczbę vs listę sprawdza się przez porównanie z pustym słownikiem
{}
, który znajduje się powyżej liczb, ale poniżej list w arbitralnym porządku wbudowanych typów w Pythonie 2.źródło
Pyth -
11107 bajtów1 bajt zapisany dzięki @Dennis
4 bajty zapisane dzięki @Thomas Kwa
Wypróbuj online tutaj .
Kontynuuje sumowanie tablicy, aż przestanie się zmieniać, co oznacza, że jest to tylko liczba, robi to łącznie, aby zapisać wszystkie wyniki pośrednie i uzyskać długość, wykonując urange o tej samej długości co lista i biorąc ostatni element.
źródło
m!!d
może zostać&R1
.l
nie jest dozwolone w OP.Haskell, 43 bajty
Przykład użycia:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.Haskell nie ma mieszanych list (
Integer
pomieszanych zList of Integer
), więc nie mogę wykorzystać niektórych funkcji wykrywania list i muszę przeanalizować ciąg.Zaczynam od prawej
0
i dodaje 1 dla każdego]
, odejmuję 1 dla każdego[
i zachowuję wartość w przeciwnym razie.scanr
zachowuje wszystkie wyniki pośrednie, więcmaximum
może to zrobić.źródło
JavaScript (ES6), 35 bajtów
Wyjaśnienie
Funkcja rekurencyjna, która zwraca maksymalną głębokość tablicy lub
0
jeśli przekroczyła liczbę.źródło
MATL , 11
14 15bajtówNawiasy klamrowe są używane w MATL dla tego typu tablic. W każdym razie dane wejściowe są pobierane i przetwarzane jako ciąg, więc można również użyć nawiasów kwadratowych, modyfikując dwa znaki w kodzie.
Wypróbuj online!
źródło
Oktawa, 29 bajtów
Odwzorowuje
[
na 1 i]
na -1, a następnie przyjmuje maksimum łącznej sumy.Dane wejściowe to ciąg formularza
Próbka uruchomiona na ideone .
źródło
{
,}
? Oktawą równoważną tablicom w OP są tablice komórkowe, myślęJulia,
5526 bajtówJest to funkcja rekurencyjna, która akceptuje jednowymiarową tablicę z zawartością typu
Any
i zwraca liczbę całkowitą. Przekazując tablicę do funkcji, poprzedź wszystkie nawiasy kwadratoweAny
, tznf(Any[1,Any[2,3]])
.Podejście jest dość proste. Dla wejścia a mnożymy a przez 0 i sprawdzamy, czy wynikiem jest skalar 0. Jeśli nie, wiemy, że a jest tablicą, więc zastosujemy funkcję do każdego elementu a , weź maksimum i dodaj 1.
Zaoszczędzono 29 bajtów dzięki Dennisowi!
źródło
Rubin, 53 bajty
Wejście ze STDIN, wyjście do STDOUT.
źródło
Galaretka,
107 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
Aktualizacja
Pisząc tę odpowiedź zauważyłem, że Jelly zachowuje się dość dziwnie w przypadku obdartych list, ponieważ głębokość listy obliczyłem jako zwiększoną minimalną głębokość jej elementów.
Ten problem został rozwiązany w najnowszej wersji, więc teraz działałby następujący kod ( 6 bajtów ).
To sumuje wiersze tablicy zamiast ich łączenia.
źródło
ŒḊ
jest nowszy niż wyzwanie?Mathematica, 18 bajtów
źródło
Mathematica,
2720 bajtówProsta funkcja rekurencyjna.
źródło
If
, oszczędzając 7 bajtów. (Daj mi znać, jeśli chcesz podpowiedź.)Replace
oparte jest co najmniej tak długo, jak to ...Map
ping ponad całkowitą jest nie-PO:Max[#0/@#]+1&[0#]-1&
.-1
Mogą również wejść do środka wewnętrznej rozmowy niczym...&[0#-1]&
.PHP, 61 bajtów
funkcja rekurencyjna, która wykorzystuje się jako funkcja mapowania do zastąpienia każdego elementu jego głębokością.
źródło
PHP,
8472646360 bajtówUwaga: wymaga PHP 7 dla połączonego operatora porównania. Wykorzystuje również kodowanie IBM-850
Uruchom tak:
[
i]
$i
do int. Przesunięcia ciągów są rzutowane na wartość domyślnąźródło
C,
9869 bajtów29 bajtów mniej dzięki @DigitalTrauma !!
Pobiera ciąg wejściowy i zwraca wynik jako liczbę całkowitą.
Przykład na żywo w: http://ideone.com/IC23Bc
źródło
Python 3,
4239 bajtów-3 bajty dzięki Sp3000
Jest to zasadniczo port rozwiązania xnor's Python 2 :
Niestety
[] > {}
zwracaunorderable types
błąd, więc nie można użyć określonej sprytnej sztuczki xnora. Zamiast tego-0123456789
mają niższą wartość ASCII niżA
, która jest niższa niż[]
, dlatego działa porównanie ciągów.źródło
CJam (15 bajtów)
Demo online
Sekcja
Na tej samej długości, ale raczej na brzydkim terytorium hakerskim,
źródło
s/ugly/beautiful/
'[,-
rozebrania łańcucha do[]
, co zależy od ograniczonej zawartości. Metoda spłaszczania działa niezależnie od zawartości tablicy.Sed, 40 znaków
(Kod 39 znaków + opcja wiersza poleceń 1 znak.)
Dane wejściowe: ciąg znaków, dane wyjściowe: liczba jednostkowa.
Przykładowy przebieg:
Sed, 33 znaki
(Kod 32 znaków + opcja wiersza poleceń 1 znak).
Jeśli końcowe dane wyjściowe są dozwolone.
Dane wejściowe: ciąg znaków, dane wyjściowe: liczba jednostkowa.
Przykładowy przebieg:
źródło
Sześciokąt , 61 bajtów
Edycja : Dzięki @Martin Ender ♦ za uratowanie mnie 1 bajtu od cudownej sztuczki -1!
Wypróbuj online, aby zweryfikować przypadki testowe!
Poniższe obrazy nie są modyfikowane, ale przepływ jest zasadniczo taki sam. Zauważ też, że zwróci to,
-1
jeśli dane wejściowe nie są tablicą (tzn. Bez[]
).W Hexagonie jest wiele niepotrzebnych operacji ... Wydaje mi się, że można zdecydowanie bardziej grać w golfa.
Wyjaśnienie
W skrócie, dodaje,
-1
gdy napotyka a[
i dodaje,1
gdy napotyka a]
. Wreszcie wypisuje maksimum, jakie ma.Przebiegnijmy do przypadku testowego 5, aby zobaczyć jego zachowanie, gdy biegnie wzdłuż ciągu
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Zaczyna się od początku i bierze swój wkład w rogu W:
Ponieważ nadal jest wprowadzany (nie znak zerowy
\0
lub EOL), zawija się do góry i rozpoczyna szkarłatną ścieżkę.Oto, co się stanie, gdy stamtąd będzie słodki
><
:,
wczytuje[
bufor{
iZ
ustawia stałą Z na 90.'
przesuwa się-
na Różnicę i oblicza różnicę. Dla[
a]
różnica będzie1
i3
odpowiednio. W przypadku liczb, spacji i przecinków będzie to wartość ujemna.Następnie biegniemy
(
dwa razy (raz na końcu szkarłatnej ścieżki, jeden na początku po owijaniu się zieloną ścieżką), aby zdobyć-1
i1
odpowiedzieć za[
i]
. Tutaj zmieniamy nazwęDiff
naValue
. Dodaj tę wartość do głębokości. (KiedyśZ&
upewniłem się, że kopiuje właściwego sąsiada). Następnie obliczamylastMin - Depth
i otrzymujemy liczbę na krawędzi pamięciminLR
.Następnie stosujemy
&
(na końcu zielonej ścieżki) dominLR
: Jeśli liczba wynosi <= 0, kopiuje lewą wartość (tj.lastMin - Depth <= 0 => lastMin <= Depth
), W przeciwnym razie przyjmuje prawidłową wartość.Owijamy się do poziomej niebieskiej ścieżki i
Z&
ponownie widzimy, która kopiaminLR
. Następnie"&
wykonaliśmy kopię obliczonej min. Zakłada się, że nawiasy są zrównoważone, więc min musi wynosić <= 0. Po owinięciu niebieska ścieżka idzie w lewo i uderza(
, dzięki czemu kopia jest1
mniejsza niż rzeczywista min. Ponownie wykorzystując-
, stworzyliśmy jeszcze jedną jednorazową kopię jako sąsiada bufora:Uwaga:
copy
zmieniono nazwę na1-off
Kiedy niebieska ścieżka uderza
\
i dostaje ładną"
i<
łapie ją z powrotem do głównej pętli.Kiedy trafienia pętla
1
,,
lublub inne numery jak wejście:
Różnica stanie się ujemna i zostanie ponownie odzwierciedlona w głównej pętli w celu następnego wejścia.
Kiedy wszystko przeszło przez główną pętlę, dochodzimy do EOL, który tworzy bufor
-1
i ostatecznie przechodzi do dolnej krawędzi:'
przesuwa MP do1-off copy
i)
zwiększa go, a przy~
negacji otrzymuje poprawną wartość Max Depth, którą drukuje się!
I historia kończy się na
@
.Chyba muszę trochę skomplikować. Gdybym musiał tylko „cofnąć się” i „wydrukować” bez zwiększania i negowania, zapisałbym 2 bajty bez użycia pełnego sześciokąta.
Ogromne podziękowania dla Timwi za Esoteric IDE i Hexagony Colorer !
źródło
-1
od,
, zmieniając ostatni wiersz na:@!-".
(chociaż zgadzam się, że prawdopodobnie można znacznie bardziej się ogolić, a nawet dopasować do długości boku 4 z pewną restrukturyzacją).Z
od używaniaZ&
. I powinny istnieć lepsze sposoby na uruchomienie programu z domyślnym if.pieprzenie mózgu, 48 bajtów
Sformatowany:
Pobiera sformatowane dane wejściowe
(1, ((3)), (5, 6), ((((8)))), 1)
i wyświetla wartość bajtu .Wypróbuj online.
Spowoduje to zapisanie głębokości według lokalizacji pamięci, przesunięcie wskaźnika w prawo
(
i w lewo)
oraz ignorowanie innych znaków. Odwiedzone komórki są oznaczone1
flagą, więc na końcu głównej pętli będziedepth + 1
flagi po prawej stronie bieżącej komórki. Są one następnie dodawane, aby wydrukować końcowy wynik.Poprzednie 69-bajtowe rozwiązanie wykorzystujące inne podejście:
W tej wersji głębokość i maksymalna głębokość są przechowywane bezpośrednio w komórkach.
źródło
Pyth,
15 lat13 bajtów-2 bajty @Maltysen
Liczy różnicę między skumulowanymi liczbami
[
i]
i przyjmuje maksimum.Y
jest pustą tablicą, a jej ciąg reprezentacji (`
) jest dogodnie[]
.Wypróbuj tutaj .
źródło
CJam, 19
22 23bajtówPodobny pomysł do mojej odpowiedzi MATL.
Podziękowania dla Petera Taylora za usunięcie 3 bajtów
Wypróbuj tutaj
źródło
Perl 5, 34 bajtów
32 plus dwa za
-p
Skradziony z cyfrowego Trauma „s Retina odpowiedź ... co jest o 26% krótszy niż ten.
:-)
Lub równie:
źródło
]
nie potrzebuje ucieczki, z wyjątkiem nawiasów.s&...&...&g
jest operatorem podstawienia. Zobacz perldoc.perl.org/perlop.htmlRuby, 51 znaków
(Zaczęło się jako sugestia ulepszenia Rubinowej odpowiedzi Doorknob , ale zakończyło się inaczej. Więc opublikowałem ją jako osobną odpowiedź. Głosowanie za pomysłem liczenia głębi ( zstępując od ) powinno przejść do oryginalnej odpowiedzi.)
?\\<=>$&
'] ['.index(c)
Dane wejściowe: ciąg znaków, dane wyjściowe: liczba.
Przykładowy przebieg:
źródło
Perl 6, 53 bajtów
Zamknięcie:
Potrzebuje argumentu, np .:
Wyjaśnienie:
źródło
Minkolang 0,15 ,
312924 bajtówZmodyfikowałem mój algorytm na podstawie odpowiedzi CJama Luisa Mendo i zaoszczędziłem 5 bajtów!
Wypróbuj tutaj!
Wyjaśnienie
Zasadniczo kod ten utrzymuje bieżącą sumę z +1 dla każdego
[
i -1 dla każdego]
, śledząc maksymalną osiągniętą wartość, generując to maksimum na końcu. Pętlami zajmuje się toroidalna natura szafki kodowej Minkolanga.źródło
Ruby, 41 znaków
Parametr: tablica, powrót: liczba.
Przykładowy przebieg:
źródło
Oracle SQL 11.2, 133 bajty
Bez golfa
CONNECT BY tworzy jeden wiersz na znak w ciągu wejściowym.
SUBSTR izoluje znak odpowiadający numerowi wiersza.
DECODE tłumaczy każdy „[” na 1, każdy „]” na -1, a każdy inny znak na 0.
SUMA analityczna sumuje każdy 1, -1 i 0 z poprzednich wierszy, w tym bieżącego wiersza;
Sumy MAX to głębokość.
źródło
Java 8, 95
To jest wyrażenie lambda dla
ToIntFunction<String>
. Dane wejściowe są traktowane jakoString
w formacie przykładów PO.dość prosto. Podziel ciąg, używając
[
jako separatora. Dla każdego z nich zwiększ licznike
i porównaj go z licznikiemd
, pozostawiając większy z nichd
. Następnie podziel ciąg bieżącej iteracji, używając]
tym razem jako separatora i odejmij liczbę dodatkowych podziałówe
.źródło