Lista nieważnych jest listą, która na żadnym poziomie nie zawiera żadnych obiektów nie będących listami. Lub jeśli wolisz definicję rekurencyjną
Pusta lista jest nieważna
Lista zawierająca tylko inne listy nieważnych jest nieważna
Wszystkie listy pustek mają skończoną głębokość.
Oto kilka przykładów pustych list (przy użyciu składni python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Oto kilka przykładów rzeczy, które nie są pustymi listami:
["a"]
[[...]]
[1]
2
[[],([],[])]
Zadanie
Napisz dwie oddzielne funkcje (lub programy, jeśli wolisz). Jedna powinna przyjąć dodatnią liczbę całkowitą (możesz również podać zero, jeśli chcesz) jako argument i zwrócić listę nieważnych, druga powinna wziąć listę nieważnych i zwrócić ją jako liczbę całkowitą. Te dwie funkcje powinny zawsze być odwrotnymi względem siebie. To znaczy, jeśli przekazujesz wyjście f
do g
, powinieneś otrzymać oryginalne wejście f
w wyniku g
. Oznacza to, że mapowanie musi wynosić 1: 1, tzn. Dla każdej liczby całkowitej może istnieć tylko jedna lista nieważności, dla której g
ta liczba całkowita jest określona, a dla każdej listy nieważności powinna istnieć dokładnie jedna liczba całkowita, dla której f
ta lista nieważności.
Zasadniczo tworzysz Bijection
Możesz wybrać ciąg znaków reprezentujący pustą listę (z przecinkami lub spacjami lub bez nich) zamiast rodzimego typu listy języków.
Punktacja
Twój wynik będzie równy długości twoich dwóch funkcji razem. To jest golf golfowy, więc powinieneś dążyć do zminimalizowania tej sumy.
Odpowiedzi:
Pyth, 27 + 29 = 56 bajtów
f
:Zestaw testowy
g
:Zestaw testowy
System jest bardzo prosty: generuję wszystkie możliwe listy z nie więcej niż określoną liczbą
[
. Następnie sortuję je w taki sposób, aby listy, których jeszcze nie wygenerowałem, były blisko końca. Wszystko to wykonuje funkcjay
identyczna w obu programach. Jest napisane jakoNastępnie indeksuję tę listę
f
i wyszukuję jąg
.Liczba generowanych przeze mnie list jest tak duża, że wygenerowałem wszystkie możliwe listy, które pojawią się w lub przed żądaną lokalizacją na nieskończonej posortowanej liście.
Programy dopuszczają / zwracają 0 jako opcję.
źródło
Python 2 , 96 bajtów
Wypróbuj online! przetestować bijection.
Usuwa listy nieujemnych liczb całkowitych. 42 bajty.
Bierze nieujemne liczby całkowite do unieważnienia list. 54 bajty. Bardziej rekurencyjna próba dała tę samą długość.
źródło
Java 7, 725 bajtów
f(int)
( 325 bajtów ):g(String)
( 75 + 325 bajtów ):Ponieważ metoda
g
używa metodyf
do obliczenia wyniku, zapętlając nad możliwą listą pustek, aż znajdzie jeden równy wprowadzonemu, bajty zf
są liczone dwukrotnie (ponieważ obie metody powinny być w stanie działać bez drugiej dla tego wyzwania).Wyjaśnienie:
Ogólnie metoda
f
po prostu zapętla wszystkie binarne reprezentacje ciągu liczb całkowitych i zwiększa licznik za każdym razem, gdy zostanie znaleziona poprawna. Prawidłowe ciągi binarne dla tego wyzwania są zgodne z następującymi zasadami: zaczynają się na1
, a kończą na0
; mają taką samą liczbę 1 i 0; i za każdym razem, gdy usuniesz pierwszy1
i0
ponownie zweryfikujesz to, co zostało, te dwie reguły nadal obowiązują. Po licznik jest równy wkład, to zamienia to binarny string na ciąg pustych liście, zastępując wszystko1
z[
a wszystko0
z]
.Jeśli chodzi o metodę
g
: zaczynamy od"[]"
(reprezentuje listę pustek0
), a następnie kontynuujemy używanie metodyf
, zwiększając liczbę całkowitą, aż do dopasowania ciągu wejściowego.Przykładowe przypadki wejścia i wyjścia:
Wypróbuj tutaj. (UWAGA: w ostatnich kilku przypadkach testowych jest dość wolny. Dla wszystkich zajmie to około 10-15 sekund.)
źródło
[][]
to lista. Być może nie rozumiem, w jaki sposób Java robi cokolwiek. Dodanie ich[...]
wszystkich i posiadanie 0 map[]
powinno załatwić sprawę.K (ngn / k) , 49 bajtów
Wypróbuj online!
używa wzoru z przykładu w Bijection: listy drzewiaste - liczby naturalne
źródło
JavaScript (Node.js) , 82 bajty
Wypróbuj online!
pomysł xnora
źródło
Python 3 - znak / abs, 73 bajty
Wypróbuj online!
Prosta implementacja, obsługuje liczby ujemne.
Liczba całkowita
i
jest zakodowana[sign(i), abs(i)]
, gdziesign(i)=[] if i > 0 else [[]]
iabs(i)=[[]] * i
tj. Lista pustych list o długości abs (i).Python 3 - binarny, 126 bajtów
Jest to bardziej rozbudowana wersja (i znacznie dłużej ...), w której wartość bezwzględna jest zakodowana w reprezentacji listy binarnej.
Wypróbuj online!
źródło
Stax , 33 bajtów ogółem
Te programy są odwrócone względem siebie. Konwertują do i ze wszystkich pustych list i wszystkich nieujemnych liczb całkowitych, więc zawiera 0. Wygląda na to, że jest to może znana funkcja z jakiejś algebry, której nie znam. Aby owinąć głowę, najpierw zaimplementowałem programy jako funkcje w Pythonie.
Programy stax mają takie samo zachowanie.
Nieujemna liczba całkowita → Lista pustych, 15 bajtów
Uruchom i debuguj
Lista pustek → Nieujemna liczba całkowita, 18 bajtów
Uruchom i debuguj
źródło