Ta konstrukcja jest sposobem reprezentacji liczb naturalnych.
W tej reprezentacji 0 jest zdefiniowane jako pusty zbiór, a dla wszystkich innych liczb n oznacza połączenie {0} i {n-1}.
Na przykład, aby zbudować 3, możemy zastosować algorytm:
3 =
{ø, 2} =
{ø, {ø, 1}} =
{ø, {ø, {ø}}}
Zadanie
Jak można się domyślać, Twoim zadaniem jest przyjęcie liczby naturalnej (w tym zero) i wygenerowanie jej konstrukcji.
Możesz wyprowadzać dane jako ciąg znaków lub jako obiekt zestawu, jeśli wybrany język obsługuje takie obiekty.
Jeśli wybierzesz wyjście jako ciąg, powinieneś reprezentować zestaw z nawiasami klamrowymi ( {}
). Opcjonalnie możesz reprezentować pusty zestaw jako ø
(w przeciwnym razie powinien to być zestaw bez wpisów {}
). Możesz także dodać przecinki i białe znaki między wpisami w zestawie i po nim.
Kolejność nie jest ważna, jednak możesz nie mieć powtarzających się elementów w zestawach, które wysyłasz (np. {ø,ø}
)
To jest golf golfowy, więc celem jest jak najmniej bajtów
Przypadki testowe
Oto kilka przypadków testowych z przykładowymi danymi wyjściowymi.
0 -> {}
1 -> {{}}
2 -> {{}{{}}}
3 -> {{}{{}{{}}}}
4 -> {{}{{}{{}{{}}}}}
źródło
Odpowiedzi:
Python , 28 bajtów
Wypróbuj online!
Jest to dość nijakie rozwiązanie problemu. W przypadku liczb większych niż zero można uzyskać reprezentację za pomocą formuły ciągów
"{{}"*x+"}"*x
. Jednak to nie działa dla zera, gdy jest to pusty ciąg. Możemy wykorzystać ten fakt do zwarcia ior
zwrócenia pustego zestawu.Chciałem użyć obiektów wbudowanych w Pythona, aby rozwiązać ten problem, ale niestety:
Nie możesz umieszczać zestawów w zestawach w Pythonie.
źródło
x
do"{{}"*x+x*"}"or
zapisywania bajtuf=
można usunąć.frozenset
jednak nikt nie dostał bajtów na tym, że ...Haskell , 37 bajtów
Wypróbuj online!
Jeszcze 10 minut temu taka odpowiedź nie miałaby dla mnie żadnego sensu. Wszystkie kredyty przechodzą do odpowiedzi na te wskazówki .
Zasadniczo używamy
>>
jakoconcat $ replicate
(ale przekazując mu listę n elementów zamiast po prostu n) i=<<
jakoconcatMap
, replikując, a następnie n razy każdy ciąg z listy i łącząc wynik w pojedynczy ciąg.0
Przypadek jest traktowany osobno jako że zwróci pusty ciąg.źródło
f 1
również zrobić specjalny przypadek, aby działał poprawnieJavaScript, 28 bajtów
Reprezentuje zestawy za pomocą tablic. 38-bajtowe rozwiązanie nierekurencyjne:
Zwraca przykładowe ciągi wyjściowe.
źródło
Mathematica, 27 bajtów
Mam dwa rozwiązania w tej liczbie bajtów:
źródło
#//.{1->{{}},x_/;x>1->{{},x-1}}&
. Chociaż myślę, że to zakłóca wejście 0Perl 6 , 37 bajtów
Spróbuj
Rozszerzony:
źródło
:
czy jest to coś nowego w Perlu 6?05AB1E ,
65 bajtówKod
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe! .
Wyjaśnienie
źródło
F¯)
czy to nie działa?n=0
, ponieważ dane wyjściowe są puste (nie pusty zestaw).Siatkówka , 22 bajty
Wypróbuj online!
Wyjaśnienie
Przekształć dane wejściowe w jednoargumentowe.
Zastąp każdą pojedynczą cyfrę
{{}
znakiem i wydrukuj wynik bez końcowego linefeed (\
).Usuń otwory
{
s, aby pozostałe}
były dokładnie tymi, które wciąż musimy wydrukować, aby zamknąć wszystkie zestawy. Jednak powyższa procedura kończy się niepowodzeniem w przypadku danych wejściowych0
, w których niczego nie drukujemy. Więc...Jeśli ciąg jest pusty, zastąp go pustym zestawem.
źródło
n
w siatkówce ...Brain-Flak , 135 bajtów
Obejmuje +1 dla
-A
Wypróbuj online!
źródło
Röda , 37 bajtów
źródło
CJam , 11 bajtów
Drukuje obiekt podobny do zestawu składający się z list list. CJam drukuje puste listy jako puste ciągi, ponieważ listy i ciągi są prawie wymienne.
Wypróbuj online!
Wyjaśnienie
Stara odpowiedź,
2118 bajtówByło to przed potwierdzeniem, że wydrukowanie struktury listy zagnieżdżonej jest w porządku. Wykorzystuje algorytm powtarzania łańcucha.
Zaoszczędzono 3 bajty dzięki Martinowi Enderowi!
Wyjaśnienie
źródło
Galaretka , 6 bajtów
Jest to link zerowy, który odczytuje liczbę całkowitą ze STDIN i zwraca niewyrównaną tablicę.
Wypróbuj online!
Jak to działa
źródło
Python 3 , 32 bajty
Nie najkrótsza droga, ale musiałem to zrobić z rekurencją.
Wypróbuj online!
źródło
Kardynał ,
5150 bajtówWypróbuj online!
Wyjaśnienie
Odbierz dane wejściowe i wyślij w dół i w lewo od #
Wydrukuj „{” jeden raz, a następnie wydrukuj „{} {” n-1 razy, jeśli n> 1, a następnie wydrukuj „{}”, jeśli n> 0
Trzymaj wartość wejściową, aż pierwsza pętla się zakończy
Wydrukuj „}” raz, a następnie powtórz n-1 razy, jeśli n> 1
źródło
AHK, 55 bajtów
To nie jest najkrótsza odpowiedź, ale podobało mi się to, ponieważ osobliwości AutoHotkey sprawiają, że ta metoda rekurencji wygląda bardzo źle.
If
aLoop
instrukcje zakładają, że następny wiersz jest jedyną zawartą pozycją, jeśli nawiasy nie są używane. Nawiasy klamrowe to znaki specjalne, więc musisz użyć innych nawiasów klamrowych, aby użyć ich jako tekstu. Również zmienna1
jest również pierwszym przekazywanym argumentem. Kiedy czytam kod, nie znając tych ciekawostek, logika wygląda następująco:s
równą błędnej odpowiedziBez wszystkich znaków otwierających nawiasy wyglądałoby to tak:
źródło
JavaScript 50 bajtów
źródło
tinylisp , 52 bajty
Wypróbuj online! (uprząż testowa).
Wyjaśnienie
Zauważ, że w
(cons x (cons y nil))
ten sposób budujesz listę zawierającąx
iy
w Lisp.źródło
C (gcc) , 52 bajty
Wykorzystując pewną ocenę zwarcia i rekurencję.
Wypróbuj online!
źródło
Pure Bash ,
494841 bajtówWypróbuj online!
źródło
dc , 46 bajtów
Wypróbuj online!
Wejście na stdin, wyjście na stdout.
Działa to poprzez obliczenie formuły dla pożądanego wyniku jako liczby podstawowej-256. Komenda P w dc jest następnie używana do wypisania liczby base-256 jako łańcucha.
Dalsze wyjaśnienia:
Niech n będzie wejściem n. Program dc oblicza sumę
A = piętro (256 ^ n / 255) * 125 (BF jest interpretowane przez dc jako 11 * 10 + 15 = 125)
i
B = podłoga ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Dla:
Zauważ, że 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) równa się (256 ^ n-1) / 255 według wzoru dla postępu geometrycznego, a to równa się podłodze (256 ^ n / 255 ). Jest to więc liczba składająca się z n 1 w bazie 256.
Po pomnożeniu go przez 125, aby uzyskać A, wynikiem jest liczba składająca się z n 125 w podstawie 256 (oczywiście 125 jest pojedynczą cyfrą w podstawie 256). Prawdopodobnie lepiej jest zapisać cyfry w bazie 256 jako liczby szesnastkowe; 125 jest szesnastkowym 7D, więc A jest liczbą podstawową-256 składającą się z n 7D z rzędu.
B jest podobny:
Tym razem zauważ, że 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) równa się (16777216 ^ n - 1) / 16777215, a to równa się podłodze (16777216 ^ n / 16777215).
Teraz 256 ^ 3 = 16777216 i 8 ^ 8-1 = 16777215, więc to właśnie obliczamy jako floor ((256 ^ n) ^ 3 / (8 ^ 8-1)).
Z reprezentacji szeregów geometrycznych liczba ta w podstawie 256 wynosi 100100100 ... 1001, gdzie n cyfr to 1, a pozostałe cyfry to 0.
Mnożymy to przez 8092541, czyli 7B7B7D w systemie szesnastkowym. W bazie 256 jest to trzycyfrowa liczba składająca się z cyfr 7B, 7B i 7D (dla wygody zapisuje te cyfry szesnastkowo).
Wynika z tego, że produkt zapisany w bazie 256 jest liczbą 3n cyfr składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy.
Mnoży się to przez 256 ^ n, co daje 4n-cyfrową liczbę podstawową-256, składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy, po których następuje n 0. To jest B.
Dodanie A + B daje teraz 4n-cyfrową liczbę podstawową-256 składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy, a następnie n 7D. Ponieważ 7B i 7D są odpowiednio kodami ASCII
{
i}
jest to ciąg składający się z n kopii,{{}
a następnie n kopii}
, co jest dokładnie tym, czego chcemy dla n> 0. Polecenie P w dc wypisuje liczbę podstawową 256 jako ciąg, tak jak potrzebujemy.Niestety n = 0 należy traktować jako szczególny przypadek. Powyższe obliczenia dają wynik 0 dla n = 0; w takim razie właśnie zakodowałem wydruk napisu
{}
.źródło
Java 7, 61 bajtów
Wypróbuj online!
źródło
Partia, 88 bajtów
źródło
Brainf *** , 99 bajtów
(nowa linia dla estetyki) Ponieważ jest to mózg ***, przyjmuje dane jako kody znaków ascii (wejście „a” odpowiada 96)
Braineasy, 60 bajtów
Ponadto, w moim niestandardowym języku (na podstawie brainf **, tłumacz tutaj ):
Musisz na stałe zakodować wejście programu do interpretera, ponieważ jestem leniwy.
źródło
[]
? Wygląda na to, że można go usunąć05AB1E ,
53 bajtyWypróbuj online!
Ta wersja jest po tym, jak wyjaśnił, że zestawy są w porządku.
Stara wersja (wykorzystująca ø):
05AB1E ,
54 bajtówWypróbuj online!
Gdzie
1
jest równoważne zø
.źródło