Wszyscy uwielbiają zagnieżdżone listy! Czasami jednak trudno jest utworzyć listę zagnieżdżoną. Musisz zdecydować, czy chcesz zagnieżdżać go głębiej, czy też chcesz zagnieżdżać go płytko. Aby podjąć wyzwanie, musisz „Autonestować” listę. Aby automatycznie przetestować listę, porównaj każdą parę elementów na liście.
Jeśli drugi element jest mniejszy, rozdziel dwa elementy, wstawiając między nimi klamry zamykające i otwierające:
} { {2 , 1}
Na przykład
{2, 1}
staje się{2}, {1}
i{3, 2, 1}
staje{3}, {2}, {1}
Jeśli drugi element jest taki sam, nic nie zmieniaj. Na przykład
{1, 1, 1}
pozostaje taki sam i{2, 1, 1, 1}
stałby się{2}, {1, 1, 1}
.Jeśli drugi element jest większy, zagnieżdż każdy następny element o jeden poziom głębiej. Na przykład
{1, 2}
stałby się{1, {2}}
i{1, 2, 3}
stałby się{1, {2, {3}}}
Wyzwanie
Musisz napisać program lub funkcję, która pobiera listę liczb i zwraca tę samą listę po automatycznym przetestowaniu. Weź to wejście w formacie natywnej listy języków (lub najbliższej alternatywy) lub jako ciąg. Nie musisz używać nawiasów klamrowych, jak ja w moich przykładach. Możesz użyć dowolnego rodzaju nawiasów, który jest najbardziej naturalny w twoim języku, o ile jest to spójne. Możesz bezpiecznie założyć, że lista będzie zawierać tylko liczby całkowite. Możesz również założyć, że lista będzie zawierać co najmniej 2 liczby. Oto kilka przykładowych IO:
{1, 3, 2} --> {1, {3}, {2}}
{1, 2, 3, 4, 5, 6} --> {1, {2, {3, {4, {5, {6}}}}}}
{6, 5, 4, 3, 2, 1} --> {6}, {5}, {4}, {3}, {2}, {1}
{7, 3, 3, 2, 6, 4} --> {7}, {3, 3}, {2, {6}, {4}}
{7, 3, 1, -8, 4, 8, 2, -9, 2, 8} --> {7}, {3}, {1}, {-8, {4, {8}, {2}, {-9, {2, {8}}}}}
Obowiązują standardowe luki, a najkrótsza odpowiedź w bajtach wygrywa!
[-100, 100]
ale nie planuję dawać gigantycznych danych wejściowych.{2, 1}
staje się{2}, {1}
” Jak to jest, że jeden poziom wyżej ? Byłby o jeden poziom wyżej{2}, 1
. To, co masz, to ten sam poziom.Odpowiedzi:
MATL ,
4843 bajtówWykorzystuje nawiasy kwadratowe na wejściu i wyjściu. Dane wyjściowe mają przecinki bez spacji jako separatory.
Zauważ, że dane wyjściowe nie będą interpretowane jako lista zagnieżdżona w MATL. Byłoby to w innych językach i spełnia specyfikację danych wyjściowych w wyzwaniu.
Wypróbuj online!
Wyjaśnienie
źródło
Haskell, 96 bajtów
Przykład użycia:
('{':).f $ [7,3,3,2,6,4]
->"{7},{3,3},{2,{6},{4}}"
.Ponieważ Haskell nie ma zagnieżdżonych list, zwracam wynik jako ciąg. Algorytm zagnieżdżania jest łatwy: a) wydrukuj numer, b) jeśli następny numer jest większy (mniejszy, równy), wydrukuj
,{
(},{
,,
), c) wykonaj rekurencyjne połączenie z resztą listy, d) wydrukuj,}
jeśli numer jest mniej niż następny, e) zamknij wszystko w{
i}
.źródło
Python 3, 98 bajtów
Przykład:
źródło
Java 8
197 187 193192 bajtówDzięki wszystkim komentatorom, którzy ze mną pracowali nad tą potwornością. Grał w golfa do 187 bajtów, aż znalazłem kosztowny błąd. Jednak ze względu na moc
Czarnej Magii„sprowadza się do” operatora ”->” liczba bajtów wynosi 192 bajty.źródło
length,
C,
145138 bajtówDzięki Giacomo za 7 bajtów!
Dane wejściowe są pobierane za pomocą argumentów wiersza poleceń, a dane wyjściowe są podawane przez stdout.
przykładowy przebieg:
źródło
t=atoi(*v);
zamiastsscanf(*v,"%d",&t);
źródłafor(;*++v;)
aby zapisać pierwsze 4, a następnie instancjęif(t<p)P"}{");if(t>p)P"{",n++);
użyciat>p?P"}{"):P"{",n++);
przez kolejne 10.CJam,
51494846 bajtówWykorzystuje fakt, że liczba ostatniego nawiasu jest o jeden większa niż liczba sąsiedniej pary, która rośnie w szyku.
I nie znam
ew
operatora wcześniej, że musiałem ponownie wdrożyć.Dane wejściowe to lista rozdzielona spacjami, oddzielona nawiasami kwadratowymi.
Wyjaśnienie
Dowiedzę się, jak to zrobić z rzeczywistą tablicą zagnieżdżoną, zamiast polegać na ładnym drukowaniu.
Wreszcie,
na równi zpobitą odpowiedzią MATL.źródło
Siatkówka,
7170 bajtówListy są spacjami, z klamrami:
{1 2 3}
. Liczby ujemne nie są obsługiwane, więc jeśli to problem, po prostu usunę moją odpowiedź. Siatkówka + liczby ujemne = nie warto.Wypróbuj online
źródło
JavaScript (ES6), 73 bajty
Objaśnienie: Przypadek kolejnych równych elementów jest łatwy; element jest właśnie dodawany do najbardziej wewnętrznej tablicy (tutaj reprezentowanej przez
m
zmienną;n
jest to tablica, która zawieram
jako ostatni element, ao
dane wyjściowe). W przypadku różnych przedmiotów element zawsze trafia do nowej najbardziej wewnętrznej tablicy, jedyną różnicą jest to, czy ta tablica jest rodzeństwem, czy dzieckiem z poprzedniej najbardziej wewnętrznej tablicy. Dla dodatkowej gry w golfa ustawiłem tablice, aby początkowy element liczył się jako kolejny równy element.źródło