Biorąc pod uwagę tablicę o dowolnej głębokości, narysuj jej zawartość obramowaniami +-|
wokół każdej podtablicy. Są to znaki ASCII dla potoku plus, minus i potoku pionowego.
Na przykład, jeśli tablica jest [1, 2, 3]
, narysuj
+-----+
|1 2 3|
+-----+
W przypadku zagnieżdżonej tablicy, takiej jak [[1, 2, 3], [4, 5], [6, 7, 8]]
rysuj
+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+
W przypadku nierównej tablicy, takiej jak [[[1, 2, 3], [4, 5]], [6, 7, 8]]
remis
+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5|| ||
||+-----+---+| ||
|+-----------+-----+|
+-------------------+
Zauważ, że po rysowaniu jest więcej miejsca [6, 7, 8]
. Możesz narysować zawartość na najwyższej, środkowej lub najniższej linii, ale cokolwiek wybierzesz, musisz zachować spójność.
To wyzwanie zostało zainspirowane czasownikiem pudełkowym<
J.
Zasady
- To jest golf golfowy, więc wygrywa najkrótszy kod.
- Wbudowane rozwiązania tego problemu są niedozwolone.
- Tablica wejściowa będzie zawierać tylko nieujemne wartości całkowite lub tablice. Każda tablica będzie jednorodna, co oznacza, że jej elementy będą albo tylko tablicami, albo tylko liczbami całkowitymi, ale nigdy nie będą mieszanką obu.
- Każda podtablica może być zagnieżdżona na dowolnej głębokości.
- Dane wyjściowe mogą być albo jako ciąg, albo jako tablica ciągów, gdzie każdy ciąg jest linią wyjściową.
Przypadki testowe
[]
++
||
++
[[], []]
+---+
|+++|
|||||
|+++|
+---+
[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+
[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+|| | ||
||||+-------+|||+-------+| | ||
|||+---------+|| | | ||
||+-----------+| | | ||
|+-------------+---------+-----+-+|
+---------------------------------+
-1
Ponieważ ograniczyłem również liczby całkowite, aby nie były ujemne. Następnie musiałbym wyczyścić dane wyjściowe dla tych niepoprawnych wartości.Odpowiedzi:
Dyalog APL , 56 bajtów
Dzięki ngn za pomoc w usuwaniu około jednej trzeciej bajtów.
TryAPL
Zdefiniuj funkcję , a następnie uruchom każdy przypadek testowy i porównaj z wbudowanym
]Display
narzędziem.[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
Wyjaśnienie
Ogólnie rzecz biorąc, jest to anonimowa funkcja
{...}
na szczycie załącznika⊂
. Ta ostatnia dodaje tylko kolejny poziom zagnieżdżania, zachęcając pierwszą do dodania zewnętrznej ramki.Funkcja anonimowa z białą spacją (
⋄
jest separatorem instrukcji):Oto znowu, ale z oddzielnymi funkcjami narzędziowymi:
Teraz pozwól mi wyjaśnić każdą funkcję:
CloseBox
pobiera tabelę i zwraca tę samą tabelę, ale z pierwszą kolumną tabeli dołączoną po prawej stronie tabeli. Tak więc, biorąc pod uwagę tabelę 1 na 3XYZ
, ta funkcja zwraca tabelę 1 na 4XYZX
w następujący sposób:⊢
argument (lit. co jest po prawej),
poprzedzony do⊣/
lewej kolumny (lit. Zmniejszenie każdej z lewej strony rząd)CreateVertical
bierze tabelę i zwraca ciąg znaków składający się ze znaków, które pasowałyby|
s po bokach stołu, ale z dwoma+
s poprzedzonymi, aby dopasować dwa rzędy-
. Ostatecznie stół będzie cyklicznie obracany o jeden rząd, aby uzyskać pojedynczy+---...
rząd powyżej i poniżej. Tak więc, biorąc pod uwagę dowolną tabelę z trzema wierszami , funkcja ta zwraca++|||
następująco:'++' ,
dwie plusy poprzedzone'|' ⍴⍨
słupkiem przekształconym przez sumę≢
(wierszy) argumentuAddHorizontals
pobiera listę list, przekształca ją w tabelę, dodaje dwa wiersze-
s na górze, dodaje odpowiadające znaki lewej krawędzi po lewej stronie, a następnie obraca jeden wiersz na dole, dzięki czemu tabela ma ramkę na górze , lewy i dolny. W następujący sposób:1 ⊖
obróć jeden wiersz (górny wiersz przechodzi na dół)CreateVertical ,
ciągu++|||...
poprzedzającego (jako kolumnę), aby'-' ⍪⍣2
dodać minus dwa razy na początku↑
argumentu przekształconego z listy list do tabeli{
Funkcja anonimowa}
: jeśli argument jest prostą (nie zagnieżdżoną) listą, przekształć go w tablicę znaków (w ten sposób, biorąc pod uwagę listę 3-elementową1 2 3
, funkcja zwraca wizualnie identyczną tabelę 1 na 5 znaków1 2 3
). Jeśli argument nie jest prostą listą, upewnij się, że elementy są prostymi tablicami znaków; wyrównać je do równej wysokości; obramuj je u góry, u dołu i po lewej; połączyć je; i w końcu weź pierwszą kolumnę i dodaj ją po prawej stronie. W następujący sposób:{
rozpocząć definicję funkcji anonimowej⍵ ≡ ∊⍵:
jeśli argument jest identyczna jak ta spłaszczona argumentu (czyli jest to prosta lista), a następnie:⍉
transponowania⍪
w układzie kolumnowym⍉
transpozycji⍕ ⍵
stringified argumentu; else:CloseBox
dodaj lewą kolumnę po prawej stronie⊃ ,/
ujawniony (ponieważ zakrywa redukcja) łączone przekrojowegoAddHorizontals¨
add-
a na górze i na dole każdej↓ ↑ ↓¨
wyściełanej do takiej samej wysokości * z∇¨ ⍵
anonimowych funkcji stosuje się do każdej z argumentów}
końca definicji funkcji anonimowego* Lit. ułóż każdą tabelę w listę list, połącz listy list (wypełnienie pustymi ciągami w celu wypełnienia krótkich wierszy) w tabelę, a następnie podziel tabelę na listę list
źródło
JavaScript (ES6),
223203 bajtówPort rozwiązania Ruby @ MitchSchwartz. Poprzednia wersja, która działała przez rekurencyjne owijanie tablic (i dlatego działała dla dowolnych treści, nie tylko liczb całkowitych):
Uwaga: Mimo że używam operatora rozkładania na mojej liście argumentów, aby uzyskać pożądane dane wyjściowe, podaj jeden parametr oryginalnej tablicy, a nie próbuj rozszerzyć tablicę; powoduje to zawijanie wyjścia w pożądane pudełko zewnętrzne. Niestety zewnętrzna skrzynka kosztuje mnie 18 bajtów, a rozdzielenie spacjami liczb całkowitych kosztuje mnie 8 bajtów, w przeciwnym razie dla 197 bajtów wystarczyłaby następująca wizualizacja:
źródło
Cannot read property 'map' of undefined
przypadku pustych tablic, takich jak[]
. Bo[1,2,[]]
ostatnia podtablica nie jest dla mnie wyświetlana.[1,2,[]]
ponieważ przykłady pokazują tylko tablice zawierające liczby całkowite lub tablice, ale nie oba.Rubinowy, 104 bajty
Anonimowa funkcja oczekująca ciągu. Na przykład
{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}
produkujeMożesz użyć tego kodu do testowania:
Zaczyna się od środkowego rzędu i działa na zewnątrz. Po pierwsze, wystąpienia
}{
są zastępowane przez|
. Następnie, podczas gdy nadal istnieją nawiasy klamrowe, wszystkie najbardziej wewnętrzne{...}
ciągi są przekształcane w odpowiednie+-
sekwencje, a znaki inne niż|{}
w spacje. Na końcu stężenia pośrednie zamienia się w rury.źródło
Brainfuck, 423 bajty
Sformatowane z kilkoma komentarzami:
Wypróbuj online.
Oczekuje danych wejściowych sformatowanych jak
(((((4 3 2 1))))(((3 2 1)))((2 1))(1))
z końcowym znakiem nowej linii i generuje wynik formularza:Podstawową ideą jest obliczenie, który znak ma zostać wydrukowany na podstawie głębokości zagnieżdżenia. Format wyjściowy jest taki, że indeks wiersza górnej ramki pola jest równy głębokości odpowiedniej tablicy, przy symetrii w środkowym rzędzie.
Taśma jest podzielona na 7-komórkowe węzły, przy czym każdy węzeł reprezentuje kolumnę na wyjściu.
Pierwsza pętla zużywa dane wejściowe i inicjuje węzły, śledząc głębokość i czy kolumna odpowiada nawiasowi (tj. Czy kolumna zawiera pionową ramkę), oraz zwijając występowanie
)(
pojedynczych węzłów.Następna pętla generuje jeden wiersz na iterację. W obrębie tej pętli inna pętla przechodzi przez węzły i drukuje jeden znak na iterację; tutaj odbywa się większość pracy.
Podczas pętli inicjalizacji układ pamięci węzła na początku iteracji wynosi
x d 0 c 0 0 0
gdzie
x
jest flagą logiczną określającą, czy poprzedni znak był zamykającym nawiasiem,d
jest głębią (plus jeden) ic
jest bieżącym znakiem.Podczas pętli drukowania znaków układ pamięci węzła na początku iteracji wynosi
0 0 d1 d2 c p y
gdzie
d1
wskazuje głębokość w porównaniu ze wskaźnikiem wiersza dla górnej połowy;d2
jest podobny dod1
dolnej połowy;c
jest znakiem wejściowym dla tej kolumny, jeżeli jest cyfrą lub spacją, w przeciwnym razie zero;p
wskazuje fazę, tj. górną połowę, środkową lub dolną połowę; iy
jest flagą, która rozprzestrzenia się od lewej do prawej, śledząc, czy dotarliśmy już do środkowego rzędu. Zauważ, że ponieważy
staje się zero po przetworzeniu węzła, możemy użyćy
komórki poprzedniego węzła, aby uzyskać więcej przestrzeni roboczej.Ta konfiguracja pozwala nam uniknąć jawnego obliczania maksymalnej głębokości podczas fazy inicjalizacji;
y
flaga jest back-propagowane zaktualizowaćp
komórki odpowiednio.Po
-1
lewej stronie węzłów znajduje się komórka ułatwiająca nawigację, a po prawej stronie węzłów znajduje się komórka, która śledzi, czy wydrukowaliśmy jeszcze ostatni wiersz.źródło
PHP + HTML, nie konkuruje (
170141135130 bajtów)zapisano 29 bajtów zainspirowanych przez SteeveDroz
nie konkuruje, ponieważ nie ma wyjścia ascii i ponieważ pozwalam przeglądarce wykonać całą interesującą pracę
źródło
<b>
tagi<div>
i nie musisz określać koloruborder
. (Zapisywanie 9 bajtów)<b>
, mogę również usunąćwhite-space
atrybut, oszczędzając kolejne 19 bajtów. świetny! I mogę wymienićpadding
zmargin
JavaScript (ES6), 221
Funkcja nierekurencyjna zwracająca tablicę ciągów znaków (wciąż wykorzystująca wewnątrz podfunkcję rekurencyjną)
Działa to w 2 krokach.
Krok 1: rekurencyjnie zbuduj ciąg reprezentujący zagnieżdżoną tablicę wejściową. Przykład:
[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]
->"OOO1 2 3,,4 5C,6 7 8CC"
O
iC
zaznacz otwieranie i zamykanie podtablicy. Proste tablice numeryczne są renderowane z elementami oddzielonymi spacją, natomiast jeśli elementy tablicy są podarunkami, są rozdzielane przecinkami. Ten ciąg śledzi wielopoziomowej struktury tablicy wejściowej, natomiast mogę środkowym rzędzie wyjście tylko wymianieOC,
z|
. Podczas rekurencyjnego budowania tego łańcucha temp, znajduję również maksymalny poziom głębokości i inicjalizuję tablicę pustych łańcuchów, które będą zawierać górną część wyniku.Uwaga: pudełko zewnętrzne jest trudne, zagnieżdżam dane wejściowe w innej tablicy zewnętrznej, a następnie upuszczam pierwszy wiersz danych wyjściowych, który nie jest potrzebny
Krok 2: zeskanuj łańcuch tymczasowy i skompiluj dane wyjściowe
Teraz mam tablicę pustych ciągów, po jednym dla każdego poziomu. Skanuję łańcuch temp, śledząc bieżący poziom, który rośnie dla każdego
O
i maleje dla każdegoC
. Wizualizuję to w ten sposób:Plus plusy rosną i maleją zgodnie z bieżącym poziomem
Dla każdego znaku dodaję znak do każdego wiersza wyniku, przestrzegając następujących zasad:
- jeśli cyfra lub spacja, wstaw „-” na bieżącym poziomie i poniżej, umieść spację powyżej
- w przeciwnym razie umieść „+” na aktualny poziom, wpisz „-”, jeśli poniżej, i wpisz „|” jeśli powyżej
Podczas skanowania tymczasowego buduję również środkowy wiersz, zastępując
OC,
go|
Na końcu tego kroku mam górną połowę i środkowy rząd, muszę tylko odbić lustrzaną górę, aby uzyskać dolną połowę i gotowe
Kod mniej komentowany
)
Test
źródło
Rubinowy,
245241 bajtówKoszty ogólne potrzebne do zawinięcia wszystkiego w pudełka, a także wyrównania wszystkiego, są dość ciężkie ...
Generuje tablice ciągów, z jednym ciągiem na linię, zgodnie ze specyfikacją. Wyrównane do dołu zamiast wyrównanych do góry przypadków testowych, ponieważ pozwala zaoszczędzić 1 bajt.
Wypróbuj online!
źródło
PHP, 404 bajtów
Wszystkie rozwiązania działają z maksymalną głębokością tablicy mniejszą niż 10. dla większych wartości głębokość musi być przechowywana w tablicy, a nie w ciągu.
Rozszerzony
za 425 bajtów możemy to zrobić za pomocą REGEX
Rozszerzony
455 bajtów dla rozwiązania rekurencyjnego
Rozszerzony
źródło
$j!="]"?:$c--;
->$c-=$j=="]";
(-2). 2)($l=="]"?"":" ")
->" "[$l==$j]
(-5). Prawdopodobnie podobne podstawienia w drugiej pętli. 3)if($r!=""){$n.=$r;$d.=+$c;}
->$n.=$r;if($r>"")$d.=+$c;
(-3). 4)$l=$j;$j!="["?:$c++;
->$c+="["==$l=$j;
(-5). 5)$x=0
nie jest potrzebny (-4). 6)for($y=0;$y<$m;$y++)
->for($y=$m;$y--;)
(-4). 7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));
->join("\n",array_merge($z,[$n],array_reverse($z)));
(-4) 8) niepotrzebne białe znaki:foreach($e[0]as$f)
(-1)($j==",")
(-2). 10)if($r>"")$d.=+$c;
->$d.=$r>""?+$c:"";
(-0)$d.=$l?$t;
jest przestarzała (-10) 2)$s.=$l?"|":"";return$s;
->return$s."|"[$l];
(-6). 3) przestarzałe nawiasy klamrowe{$e=v($v,$t+1,$k+1==$c);}
(-2). 4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
->$d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);
(-5).