Wyzwanie to zostało zainspirowane pytaniem na Mathematica.SE .
Załóżmy, że masz zagnieżdżoną listę / tablicę o dowolnej strukturze (listy na każdym poziomie niekoniecznie mają taką samą długość). Dla uproszczenia założymy, że węzły to nieujemne liczby całkowite lub puste tablice. Jako przykład
[[[1, 3], 2], [1, 4], 12, [[0, [], 0], [5, [7]]]]
Czasami wygodniej jest spłaszczyć tę listę, aby wykonać pewne manipulacje węzłami, np
--> [1, 3, 2, 1, 4, 12, 0, 0, 5, 7]
--> [1, 1, 0, 1, 0, 0, 0, 0, 1, 1]
Ale ostatecznie chcesz zachować oryginalną strukturę, więc chcesz z powrotem to zmienić
--> [[[1, 1], 0], [1, 0], 0, [[0, [], 0], [1, [1]]]
Twoim zadaniem jest wykonanie ostatniego kroku.
Biorąc pod uwagę zagnieżdżoną listę dowolnych nieujemnych liczb całkowitych, która reprezentuje pożądaną strukturę wyniku, oraz płaską listę nieujemnych liczb całkowitych, które reprezentują pożądane wartości, przekształca płaską listę w formę listy strukturalnej. Możesz założyć, że obie listy zawierają tę samą liczbę liczb całkowitych.
Jak zwykle nie musisz radzić sobie z nieprawidłowymi danymi wejściowymi (np. Druga lista nie jest płaska, dane wejściowe są zniekształcone składniowo, nie mają liczb całkowitych jako węzłów itp.). Możesz modyfikować tablice wejściowe w swoim kodzie.
Możesz napisać funkcję lub program, przyjmując dane wejściowe przez STDIN, argument wiersza poleceń lub argument funkcji, i możesz zwrócić wynik lub wydrukować go do STDOUT. Możesz użyć dowolnego wygodnego formatu listy lub łańcucha do reprezentowania danych wejściowych i wyjściowych (o ile format jest jednoznaczny, a dane wejściowe nie są przetwarzane wstępnie). Ponadto format obu danych wejściowych musi być spójny (na przykład nie można traktować jednego wejścia jako ciągu, a drugiego jako listy). Możesz wziąć listy wprowadzania w dowolnej kolejności, ale proszę podać dokładną metodę wprowadzania w odpowiedzi.
Jeszcze jedno ograniczenie: nie wolno używać wyrażeń regularnych. Jest to wyzwanie manipulacji tablicą, a nie wyzwanie manipulacji ciągiem.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Structure Values Result
[[[1,3],2],[1,4],12,[[0,0],[5,[7]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[[[0,0],0],[0,0],0,[[0,0],[0,[0]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[] [] []
[[]] [] [[]]
[0,1,2,3] [5,1,0,5] [5,1,0,5]
[[[[[0]]]]] [123] [[[[[123]]]]]
[0,[1,[]],[[]],[2,3],[]] [1,6,1,8] [1,[6,[]],[[]],[1,8],[]]
źródło
Odpowiedzi:
CJam,
18 1613 bajtówPobiera dane wejściowe przez STDIN w tym samym formacie, co poprzednia odpowiedź CJam:
i przekazuje ciąg wynikowy do STDOUT
Po prostu traktuję pierwszy wiersz jako ciąg, przekształcam wszystkie znaki cyfrowe na znaki nowej linii, dzielę na jedno lub więcej wystąpień nowych linii, umieszczam drugą linię jako tablicę na stosie, zawijam tablicę i spakowujemy razem dwie tablice (rzędy). Drukowanie jest automatyczne, a ponieważ pierwszy wiersz został potraktowany jako ciąg znaków, zachowuje nawiasy.
Rozszerzenie kodu
Dzięki @ user23013 za zapisanie 3 bajtów.
Wypróbuj online tutaj
źródło
/La-
:%
.%
jest to również do podziału, i dzieli się również na wiele wystąpień!JavaScript, ES6, 44 bajty
Tworzy to funkcję,
f
którą można wywołać jaktj. tablica zagnieżdżona i tablica wartości jako argumenty wejściowe. Dane wyjściowe funkcji to przekonwertowana tablica zagnieżdżona.
To pytanie jest bardzo miłe dla rekurencji, dlatego odpowiedź jest zgrabną i słodką funkcją rekurencji. Tworzę funkcję,
f
która konwertuje pierwszy argument za pomocąmap
metody. Dla każdego elementu, jeśli element jest tablicą, wywołujef
ponownie, w przeciwnym razie, dla liczb całkowitych, pobiera ity element i zwraca go, zwiększając wartośći
. Wartośći
jest przekazywana w każdym wywołaniu rekurencyjnym, aby utrzymać prawidłową kolejność.Wykrywanie tablic vs. liczby całkowite jest ponownie wykonywane przy użyciu tej
map
metody. Dla zmiennej tablicowejmap
jest prawidłową funkcją, podczas gdy dla zmiennych całkowitych nie ma właściwości ani funkcji wywoływanejmap
zdefiniowanej dla zmiennej.Działa to w najnowszej przeglądarce Firefox (z powodu ES6).
źródło
.map
w kodzie istnieją 2 . Czy jest jakiś sposób, aby go jeszcze skrócić? W każdym razie fajny kod!map
jest powiązany z kontekstem, więc do pierwszej mapy należy,a
podczas gdy kolejna mapa należy do każdejx
z iteracji. Nie ma też innego krótszego sposobu na odniesieniemap
, ani na odróżnienie tablicy od liczb całkowitychJavaScript, ES6, 41 bajtów
Byłem pod wrażeniem odpowiedzi Optimizera , zrobiono to bardzo sprytnie i wiele się nauczyłem. Jednak po przejrzeniu go znalazłem sposób, aby go nieco skrócić i naprawić mały błąd:
Wyjąłem
i
zmienną i zastąpiłem jąshift()
. To sprawia, że jest nieco krótszy i rozwiązuje problem z faktem, żei
jest przekazywany przez wartość, a nie przez odniesienie, co spowodowało, że niektóre liczby z końcowej tablicy powtórzyły się, a niektóre na końcu nie były używane. Znów odpowiedź Optimizera była naprawdę dobrze przemyślana, lepiej niż mogłem to zrobić, po prostu trochę ją naprawiłem.źródło
Dyalog APL, 14 znaków
To nie myślenia:
(∊a)←b
.Zwykle
∊a
oznaczaa
spłaszczony, ale gdy pojawia się po lewej stronie zadania, robi dokładnie to, o co prosi ten problem. Aby spełnić wymóg bycia funkcją, potrzebuje kilku dodatkowych zawijasów:{a←⍺⋄(∊a)←⍵⋄a}
(nawiasy klamrowe dla lambda;⍺
oraz⍵
dla lewego i prawego argumentu;⋄
dla separatora instrukcji).Przetestuj na tryapl.org. Zauważ, że w APL pusty wektor numeryczny jest oznaczony przez
⍬
(„zilde”). Wektory jednoelementowe są konstruowane za pomocą,(,A)
ponieważ(A)
oznaczałoby skalar. W danych wyjściowych ta rzecz:reprezentuje pusty wektor numeryczny.
0
W środku pokazuje „prototypowy elementu”, który nie jest elementem macierzy.źródło
(,1)
i(1)
czy właśnie ostatni bit jest prezentowany jako[1|1]
zamiast[1|[1]]
?]box on
) nie rozróżnia ich. W Dyalog (display
oddfns.dws
) jest inna funkcja , która czyni rozróżnienie, ale niestety tryapl ogranicza ładowanie dodatkowych obszarów roboczych (tj. Bibliotek). :(∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(∇¨⍵)']'}a
. Albo tak:∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(1↓,'|',[1.5]∇¨⍵)']'}a
jeśli nalegać na separatorze|
.]display a
w tryapl. Daje pełną informację o strukturze. Przepraszam, nie zdawałem sobie z tego sprawy.Python, 51
Przykład:
źródło
Python 2, 50
To był bardzo piękny problem. Pracując nad tym, zdałem sobie sprawę, że fragmenty mojego kodu były niepotrzebne, a logika zamieniła się w proste wyrażenie. Większość golfa polegała na znalezieniu odpowiedniego algorytmu.
s
to struktura iv
płaska lista. Chodzi o to, aby sprawdzić, czys
jest liczbą całkowitąs<[]
(Python 2 traktuje liczby jako mniejsze niż listy). Jeśli tak, po prostu weź i zwróć pierwszy elementv
, usuwając gov
. W przeciwnym razie wróć na listy podrzędnes
.pop
Jest kawałek bezwzględnej magii w kodzie bardzo funkcjonalnym stylu. Ponieważ wszystkiev
wskazują na to samo wystąpienie, usunięcie elementu z jednego powoduje usunięcie go zv
całego drzewa wykonania, więc każda liczba wv
jest używana tylko raz. Zrozumienie listy[f(x,v)for x in s]
tworzy drzewo wywołań, które jest rozszerzane w pierwszej kolejności i od lewej do prawej, powodując, że elementyv
są rozmieszczane we właściwej kolejności.Napisałem to niezależnie od odpowiedzi grc , ale okazało się, że aż do przeniesienia jednego
[
(i nazw zmiennych). Ruch zapisuje znak z powodu odstępów. Przesunięcie nawiasu oznacza natychmiastowe rozpatrzenie przypadku węzła w funkcji, a nie w ramach zrozumienia listy, którego nie wziąłem pod uwagę.Możemy zapisać znak dla 49, jeśli rozciągniemy wymagania wejściowe, aby pobrać wartość ze STDIN i struktury jako argument funkcji. To pozwala nam korzystać
map
.źródło
Ruby, 39 lat
Powtarza się, dopóki element na liście nie będzie liczbą całkowitą.
Ponieważ wywołanie Integer.map daje wyjątek,
przechodzi do części ratunkowej, która „wyskakuje / przesuwa” pierwszy element z drugiej listy.
Regex soln ... trochę dłużej:
Wypróbuj z niektórymi przypadkami testowymi
źródło
CJam,
43 37 3533 bajtówTen jest bezpośrednią konwersją mojej odpowiedzi JS . Trochę długi, z których większość jest zajęta przez wykrywanie typu.
Bierze dwie tablice wejściowe na dwóch liniach STDIN jak
i wyjścia jak STDOUT
Wypróbuj online tutaj
źródło
Haskell,
113104 bajty (86 + 18 z deklaracji typu danych)Haskell nie ma wbudowanego typu danych z zagnieżdżonej tablicy, więc musiałem rzucić własny. Z tego powodu program zawiera tylko dopasowanie wzorca i wyraźną rekurencję strukturalną. Ostatni przypadek testowy brzmi
i ocenia
źródło
Mathematica, 41 bajtów
Jest to funkcja bez nazwy, która przyjmuje strukturę jako pierwszy argument, a listę wartości jako drugi argument (i zwraca listę).
To jest golfowa wersja zaakceptowanej odpowiedzi na pytanie, które zainspirowało to wyzwanie. Ja to piszę i nie zaakceptuję tej odpowiedzi (jeśli rzeczywiście pozostanie najkrótsza, w co wątpię). Ma to na celu zapobieżenie wygraniu wyzwania przez inne osoby poprzez skopiowanie odpowiedzi.
Jak to działa:
Listable
czystą. Funkcje listowane są automatycznie stosowane do elementów argumentu listy (rekurencyjnie) zamiast samej listy, więc wywołanief
listy strukturalnej w zasadzie zwróci listę tej samej struktury z każdą liczbą całkowitąi
zastąpioną przezf[i]
.m
i licznik wi
.f
(niezależnie od argumentu), zwracamy następny elementm
.źródło
Rebol -
87 6660Nie golfowany:
Przykład:
źródło
C #,
225 + 13 = 239185 + 35 = 220172 + 35 = 207 bajtówWymaga tego:
Akceptuje
object[]
s jako argumenty.Nieskluczony kod:
źródło
using o=System.Object
i zastępującobject
po prostu wszystkie wystąpieniao
. msdn.microsoft.com/en-us/library/sf0df423.aspxClone
jest płytki. Jeśli modyfikacja danych wejściowych jest dozwolona, nie trzeba wcale klonować. Jeśli nie jest to dozwolone, potrzebujesz odpowiedniego klonowania.Python 2, 64 bajty
Słyszałem, że lubisz listy na listach, więc umieściłem funkcje w funkcjach.
Edycja: Patrząc teraz na odpowiedź grc, zdaję sobie sprawę, że było to całkowicie niepotrzebne. No cóż...
źródło
SWI-Prolog 82
Przykładowy przebieg:
Ostatnie
[]
w zapytaniu dotyczy sprawdzenia niedopasowanej liczby elementów, co nie wydaje się konieczne w tym pytaniu.źródło
is_list
) są konieczne?Erlang,
11693 bajtówUżywa dwóch nieczystych funkcji
f
ig
.f
manipuluje słownikiem procesów, ustawiającn
go na płaską listę i odwzorowując każdy element listy zagnieżdżonejg(X)
.g
następnie ustawian
się na końcu płaskiej listy za każdym razem, gdy napotyka wartość inną niż lista i zwraca nagłówek płaskiej listy.źródło
Perl 5, 49 bajtów
Pierwszy argument to struktura szablonu, drugi to wartości.
Program testowy
źródło
PowerShell: 115
tablica wejściowa to $ i, mapowanie to $ m, wyjście to $ o
$ h jest ciągiem zawierającym funkcję rekurencyjną i można wykonać kod zawarty w ciągu za pomocą. $ h ... I byłby o 30 bajtów krótszy, gdyby PowerShell nie nalegał na spłaszczanie tablic pojedynczej wartości do skalarów i tablicy z pojedynczą wartością null na null
oraz przydatna przeglądarka struktury tablic do weryfikacji wyników
edycja: 149
zapisz jako unflatten.ps1:
edycja: 136, tworzenie wbudowanej tablicy wyjściowej i zapisywanie-wyprowadzanie
wywołanie z. \ unflatten.ps1 [tablica wejściowa] [tablica mapowania]
dane wyjściowe są zapisywane w potoku, więc uruchom najpierw:
i biegnij z
źródło
C #, (40 + 123) = 163 bajty LUB (67 + 81) = 148 bajtów
C # cierpi z powodu swojego statycznego pisania i długich przestrzeni nazw tutaj.
Metoda tablicowa
Za pomocą instrukcji:
Kod:
Metoda stosu (używa struktury stosu zamiast tablic)
Za pomocą instrukcji:
Kod:
Pierwsze próby, pierwszy golf tutaj.
źródło