Alice , 14 12 bajtów
/O
\i@/t&Yd&
Wypróbuj online!
Funkcja odwrotna (nie golfowa):
/o Q
\i@/~~\ /dt&Z
Wypróbuj online!
Wyjaśnienie
Alice ma wbudowany bijection między ℤ i ℤ 2 , który można obliczyć za pomocą Y
(rozpakuj) i jego odwrotność Z
(spakuj). Oto fragment dokumentów wyjaśniających bijection:
Szczegóły bijectcji są prawdopodobnie nieistotne w większości przypadków użycia. Najważniejsze jest to, że pozwala to użytkownikowi zakodować dwie liczby całkowite w jednym i wyodrębnić później dwie liczby całkowite. Przez wielokrotne stosowanie polecenia pack całe listy lub drzewa liczb całkowitych mogą być przechowywane w jednym numerze (choć nie w sposób szczególnie wydajny pod względem pamięci). Odwzorowanie obliczone przez operację spakowania jest funkcją bijectywną ℤ 2 → ℤ (tj. Mapowanie jeden na jeden). Po pierwsze, liczby całkowite {..., -2, -1, 0, 1, 2, ...} są mapowane na liczby naturalne (w tym zero), takie jak {..., 3, 1, 0, 2, 4 , ...}(innymi słowy, ujemne liczby całkowite są odwzorowane na nieparzyste liczby naturalne, a nieujemne liczby całkowite są odwzorowane na liczby parzyste). Dwie liczby naturalne są następnie mapowane na jedną za pomocą funkcji parowania Cantora , która zapisuje liczby naturalne wzdłuż przekątnych pierwszej ćwiartki siatki liczb całkowitych. W szczególności {(0,0), (1,0), (0,1), (2,0), (1,1), (0,2), (3,0), ...} są odwzorowany na {0, 1, 2, 3, 4, 5, 6, ...} . Wynikowa liczba naturalna jest następnie odwzorowywana z powrotem na liczby całkowite przy użyciu odwrotności wcześniejszego bjectu. Polecenie rozpakuj oblicza dokładnie odwrotność tego odwzorowania.
Jak wspomniano powyżej, możemy użyć tej operacji rozpakowania również do mapowania ℤ do ℤ k . Po zastosowaniu go do początkowej liczby całkowitej możemy ponownie rozpakować drugą liczbę całkowitą wyniku, co daje nam listę trzech liczb całkowitych. W rezultacie aplikacje k-1Y
dają nam k liczb całkowitych.
Możemy obliczyć odwrotność, pakując listę Z
od końca.
Sam program ma następującą strukturę:
/O
\i@/...d&
Jest to tylko podstawowy szablon dla programu, który odczytuje zmienną liczbę liczb całkowitych dziesiętnych jako dane wejściowe i drukuje zmienną liczbę jako wynik. Tak więc rzeczywisty kod jest po prostu:
t Decrement k.
& Repeat the next command k-1 times.
Y Unpack.
Jedną z rzeczy, o których chciałbym się odnieść, jest „dlaczego Alice miałaby wbudowaną funkcję bijectji ℤ → ℤ 2 , czy to nie terytorium golfa”? Podobnie jak w przypadku większości dziwniejszych wbudowanych Alice, głównym powodem jest zasada projektowa Alice, że każde polecenie ma dwa znaczenia, jedno dla trybu Kardynał (liczba całkowita) i jedno dla Tryb porządkowy (łańcuch), a te dwa znaczenia powinny być w jakiś sposób powiązane z podaniem Tryb kardynalny i porządkowy daje poczucie, że są lustrzanymi wszechświatami, w których rzeczy są w pewnym sensie takie same, ale także różne. I dość często miałem polecenie dla jednego z dwóch trybów, które chciałem dodać, a następnie musiałem dowiedzieć się, z jakim innym poleceniem je sparować.
W przypadku Y
i Z
trybie porządkową było pierwsze: Chciałem mieć funkcję do przeplatania dwóch ciągów (zip) i oddzielić je ponownie (Rozpakuj). Jakość tego, co chciałem uchwycić w trybie kardynalnym, polegało na utworzeniu jednej liczby całkowitej z dwóch i możliwości późniejszego wyodrębnienia dwóch liczb całkowitych, co sprawia, że taki bijection jest naturalnym wyborem.
Doszedłem również do wniosku, że byłoby to bardzo przydatne poza golfem, ponieważ pozwala przechowywać całą listę, a nawet drzewo liczb całkowitych w jednej jednostce pamięci (element stosu, komórka taśmy lub komórka siatki).
k
ix
zamiast liczb całkowitych?