Otrzymasz zagnieżdżoną tablicę. Twój program musi wizualizować tablicę.
Ale jak?
Załóżmy na przykład, że mamy zagnieżdżoną tablicę, np [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Tę zagnieżdżoną tablicę można wizualizować jako:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Przykłady
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
Zasady
- Możesz użyć ciągu znaków (lub innych typów, które działają jak tablica zagnieżdżona) jako danych wejściowych.
- Maksymalny poziom „warstw” wynosi 2 ^ 32-1.
code-golf
printable-ascii
Matthew Roh
źródło
źródło
Odpowiedzi:
APL, 32 bajty
Test:
Wyjaśnienie:
{
...}∘0
: uruchom następującą funkcję0
związaną z⍵
:1=≡⍺:
: jeśli wejście ma głębokość 1 (tj. tablica, która nie zawiera innych tablic):⍵/'->'
: utwórz ciąg zawierający⍵
-
s i⍵
>
s,1↓
: upuść pierwszy element,⍵↑
: i weź pierwsze⍵
elementy. Daje to ciąg zawierający⍵-1
myślniki i jeden>
.⍺,⍨
: dołącz do niego dane wejściowe,⎕←
: i wyślij to na ekran⋄
: Inaczej,⍺∇¨⍵+1
: dodaj 1⍵
i zastosuj funkcję do każdej zagnieżdżonej tablicyźródło
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 bajtówDziękujemy Gregowi Martinowi za uratowanie 1 bajtu.
Dzięki ngenisis za oszczędność 1 bajtu.
źródło
Java 7,
153141114 bajtów-39 bajtów dzięki @ Barteks2x
Wyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło
for(int j=i;j-->0;r+="-");
aby zrobić to, co robi następny wiersz, i używając ogólnego argumentu zamiast 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;}
I nawet 1 znak mniej, jeśli przekazujesz 1 zamiast 0 jako pierwszy argument jest w porządku.[]
z parametru, aby zapisać 1 dodatkowy bajt, powoduje błąd. Zobacz błąd tutaj w > Debuguj po uruchomieniu.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;}
to działa. Możesz również wykonać podobną ogólną sztuczkę z łańcuchem, aby zapisać dodatkowy bajt, ale wymaga albo zapisania wyniku w zmiennej przed wydrukowaniem, albo jawnego rzutowania (niejednoznaczne wywołanie metody):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;}
oraz wymóg ciąg oddanych na typ zwracany przy wywołaniu zniknęło.PHP,
77 7473 bajtów4 bajty zapisane dzięki @manatwork.
funkcja rekurencyjna, wymaga PHP 7.1 lub nowszego dla indeksu ciągu ujemnego.
"$e"
jestArray
dla tablic; więc"$e"!=$e
jest taki sam jakis_array($e)
.>
-
do prefiksu dla każdego poziomuźródło
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
można go zastąpić$e[-1]!==""
.$e[-]==""
... i z odwróconym warunkiem$e[-1]>""
. Niezłe znalezisko!$e[-1]>""
można je zastąpić"$e"==$e
. Przynajmniej w starożytnym PHP 5.6, którego używam.C99 (GCC),
201187140112109rozszerzona forma:
Pobiera ciąg w prawidłowym formacie i kończy się po znalezieniu ostatniego dopasowania
]
.Nie używa rekurencji i używa długich typów do faktycznie osiągnąć drugą zasadę: 2 ^ 32-1 poziomy . Większość języków skryptowych ma ograniczoną głębokość rekurencji lub po prostu ulega awarii przy przepełnieniu stosu.
Nie jestem przyzwyczajony do gry w golfa w C jakakolwiek pomoc jest mile widziana :)
Dzięki w bolovie za jego wskazówki! Szczególnie dzięki Titusowi, który zawsze jest gotowy na dobrą rundę gry w golfa (nawet w C)!
Kolejne dwa bajty zapisane dzięki temu, że możemy skończyć, gdy dopasujemy ostatni
]
i nie musimy dopasowywać znaku zerowego.Można to przetestować w Wandbox .
źródło
for(int d=1 ...
?long
ma 4 znaki, podczas gdyint
ma tylko 3, i nie ma powodu, abyś musiał przekraczać2^32 - 1
limit, aby twoje zgłoszenie było ważne, oszczędzając ci jeden bajt.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
jest o wiele mniej niż2^32-1
.2^32-1
nie pasuje przezint
chwilę, pasuje dounsigned
lublong
(oczywiście w większości systemów / kompilatorów). Dlategoint
nie dałbym poprawnej odpowiedzi (jak większość odpowiedzi tutaj nie jest).JavaScript (ES6),
5851 bajtówEdycja: Zapisano 7 bajtów, gdy @Arnauld wskazał, że mogę połączyć moje dwa podejścia.
źródło
PHP,
129 123 112 109 95 9391 bajtówiteracyjne rozwiązanie pobiera ciąg znaków ze STDIN:
Uruchom go
echo '<input>' | php -nR '<code>'
lub przetestuj online .awaria
Szczęśliwy, że liczby są w cudzysłowie; więc potrzebuję tylko jednej akcji na raz.
Skrzypienie ASCII
Dodanie 3 myślników
$p
i usunięcie 2 dla[
, 4 dla]
dodaje jeden dla[
i usuwa jeden dla]
.źródło
Python 2,
6564 bajtówW tej chwili moja odpowiedź konsekwentnie zaczyna się bez myślników, więc
["foo", "bar"]
jest to:źródło
import sys, pprint; pprint.pprint(sys.argv)
ma 43 bajty, ale nie wiem czy łamie zasady gry w golfa.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)
ma wciąż 43 lata, ale mimo to jest dobrą sugestią; D Próbaimport sys.argv as v
wydłuża go nieco o około 48 bajtów. Gdyby można było wyeliminować sys.argv, zaoszczędziliby dużo, ale program staje się wtedy zupełnie bezużyteczny. Podejście rekurencyjne jest dość długiedef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~ 80 bajtów.Perl 5 , 55 bajtów
53 bajty kodu +
-nl
flagi.Wypróbuj online!
Nie jest optymalny dla wyrażenia regularnego z powodu pewnych ostrych przypadków, które mogą potencjalnie wystąpić (w szczególności, jeśli element tablicy zawiera nawiasy wewnątrz).
Rekurencyjna funkcja anonimowa byłaby jednak niewiele dłuższa (61 bajtów):
Wypróbuj online!
Ale sposób, w jaki Perl radzi sobie z parametrami, nie jest optymalny dla funkcji golfowych: brak parametrów opcjonalnych oznacza, że muszę wykonać drugą funkcję (anonimową), wywołując pierwszą i muszę jawnie uzyskać ostatni parametr o takiej długości
my$v=pop
.źródło
Rubin,
49 4546 bajtówPrzykład:
Wyjaśnienie:
Funkcja rekurencyjna: jeśli
x==[*x]
wtedy x jest tablicą i iterujemy nad nią. Jeśli nie, wcięcie.źródło
Haskell, 104 bajty
Haskell nie ma zagnieżdżonych list o różnych głębokościach, więc muszę samodzielnie parsować łańcuch wejściowy. Na szczęście funkcja biblioteki
reads
może analizować ciągi znaków (tj"
parsować ciągi znaków Zamknięta sekwencja znaków), więc mam tutaj małą pomoc.Przykład użycia:
Wypróbuj online!.
Jak to działa:
Funkcja
#
przechodzi przez ciąg char przez char i utrzymuje poziom zagnieżdżenia (pierwszy parametrl
) jako ciąg-
z końcowym>
. Jeśli nagłówek listy można przeanalizować jako ciąg, weźl
i ciąg, a następnie wywołanie rekurencyjne z usuniętym ciągiem. Jeśli pierwszym znakiem jest spacja, pomiń go. Jeśli tak,
, weź nowy wiersz i kontynuuj, jeśli tak]
, obniż poziom zagnieżdżania i idź dalej, a także (tylko w[
lewo) podnieś poziom zagnieżdżania i kontynuuj. Rekurencja kończy się pustym ciągiem wejściowym. Główna funkcja(">"#)
ustawia poziom zagnieżdżenia na">"
i wywołuje#
.źródło
SWI-Prolog, 115 bajtów
Dodano podział wiersza tylko dla czytelności, nieuwzględniony w liczbie bajtów.
p
predykat rekurencyjnie przechodzi przez tablice, dodając przedrostek „-”,F
gdy poziom jest głębszy.w
służy do zapisu tablicy wyjściowej, a także rzeczywistego elementu na wyjściu.Przykład:
źródło
Partia, 249 bajtów
Irytujące Batch ma problem z porównywaniem przecinków. Przykładowy przebieg:
źródło
Siatkówka ,
635452 bajtówZaoszczędzono 2 bajty dzięki Martinowi Enderowi
Wypróbuj online!
Wyjaśnienie
Po pierwsze, tablica jest dzielona przez zamianę każdego cytowanego łańcucha na wszystko, co było przed nim, a także na samą siebie i na nową linię. Dzieląc go w ten sposób, można znaleźć niedopasowane nawiasy otwierające przed każdym ciągiem.
Ta transliteracja zamieni
[
się na-
, pozostawi]
niezmienioną i usunie co drugi znak (-~
wszystkie ASCII można wydrukować). Zastępuje jednak tylko znaki pojawiające się przed końcowym ciągiem w każdej linii.Następnie wszystkie wystąpienia
-]
są usuwane. Odpowiadają one pasującym parom nawiasów i chcemy tylko niedopasowanych nawiasów. Po ich usunięciu każda linia ma liczbę-
s równą liczbie niepasujących nawiasów otwierających poprzedzających ją.Ostatni
-
przed a"
zastępuje się>
, tworząc strzałki.Wreszcie, wszystkie pozostałe
]
s i"
s są usuwane.źródło
Röda , 54 bajty
Wypróbuj online!
Jest to funkcja, która odczytuje tablicę wejściową ze strumienia. Dla każdego elementu wywołuje się rekurencyjnie lub drukuje element.
źródło
Python 3, 80 bajtów
Wydaje się, że lambda Pythona wspierają rekursję, kto wiedział?
Jest to kontrapunkt / komplement dla odpowiedzi orlp .
źródło
=
. Podejrzewam również, że możesz upuścić wszystkie pola po trzech)
, ale nie znam się na golfie w Pythonie.Groovy, 92 bajty
źródło
Ułożone , 27 bajtów
Wypróbuj online!
Pobiera dane wejściowe z góry stosu i pozostawia dane wyjściowe w STDOUT. Jest to proste, jak robienie mapy głębokości, powtarzanie
-
d
czasów, łączenie z „>” i samym elementem.źródło
Gema, 63 znaki
Podobnie jak inne rozwiązania analizujące, zakłada się, że w ciągach znaków nie będzie żadnych podwójnych cudzysłowów.
Przykładowy przebieg:
źródło
jq,
7067 znaków(
6764-znakowy kod + 3 znaki w wierszu poleceń)Przykładowy przebieg:
Test online
źródło