Biorąc pod uwagę dodatnią liczbę całkowitą k > 1
i nieujemną liczbę całkowitą i
, wygeneruj k
-tuple (lub k
-wymiarowy wektor) liczb całkowitych nieujemnych. Dla każdego k
, mapa z ℕ do ℕ k , musi być bijective . Oznacza to, że każde wejście i
powinno dawać inną krotkę, a każda możliwa krotka musi być wytworzona przez jakiś wkład i
.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Możesz użyć dowolnego wygodnego, jednoznacznego, płaskiego formatu listy wyników.
Rozwiązanie powinno nakładać żadnych sztucznych limitów k
i i
ale można założyć, że pasują one do natywnej wielkości całkowitej Twojego języka. Przynajmniej musisz obsługiwać wartości 255
, ale nawet Twoja natywna liczba całkowita jest mniejsza.
Dla każdego 1 < k < 32
, Twój kod powinien produkować wynik w ciągu kilku sekund (oczywiście, jeśli odpowiedź nie obsługuje tak duże ze względu na poprzedniej reguły limit zostanie odpowiednio skorygowana). Nie powinno to stanowić problemu: możliwe jest rozwiązanie tego problemu tak, aby działało do 2 128 w ciągu kilku sekund, ale limit polega na unikaniu odpowiedzi, które faktycznie powtarzają się w celu znalezienia wyniku.i < 231
i
0
i
Podaj w odpowiedzi opis wybranego mapowania i uzasadnienie, dlaczego jest ono bijective (nie musi to być formalny dowód).
To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Powiązane wyzwania
źródło
q~2bW%1$Te]/zWf%2fbp
(odwrotna kolejność wprowadzania)CJam, 18 bajtów
Używa bardziej głupiej formuły.
Wypróbuj tutaj .
Wyjaśnienie
Podsumowując, odwzorowuje dodatnią liczbę całkowitą na:
źródło
Python 2, 62
Ten kod jest brzydki i nadaje się do gry w golfa, ale pomysł jest bardzo prosty.
Zapakuj
k
binarne rozszerzenia w jedno, odczytując każdąk
cyfrę z różnymi przesunięciami. Na przykład zak=3
pomocą danych wejściowych357
odwzorowuje się na(3,0,7)
:Ponowne skompresowanie liczb odwraca je, więc jest to bijection. Czyniąc to, pomyśl o rozszerzeniach binarnych jako mających nieskończoną liczbę zer wiodących.
źródło
J,
382827 bajtówTo jest milcząca, dwójkowym czasownik że trwa I i K jako argumenty lewych i prawych. Spróbuj go online z J.js .
Pomysł
Definiujemy mapę f: N → N K przez F (I): (a = 1 , ... a k-1 , p 1 α k ... s 2 a k + 1 ... - 1) , gdzie ⟨p n ⟩ jest ciąg liczb pierwszych i i + 1 = p 1 α 1 p 2 α 2 … .
Według Podstawowego Twierdzenia Arytmetycznego mapa g: N → N ω zdefiniowana przez g (i): = (α 1 , α 2 ,…) (wykładniki pierwszej faktoryzacji i + 1 ) jest bijectywna.
Ponieważ f (i) = (g 1 (i),… g k-1 (i), g -1 (g k (i), g k + 1 (i),…)) , mapa f jest dwuskładnikowa, ponieważ dobrze.
Kod
źródło
Python 2, 72
Funkcja
q
działa na liczby binarne, biorąc co drugi bit, zaczynając od końca. W rezultacieq(z), q(z>>1)
podaje dwie liczby, których cyfry binarne przeplatają się, aby daćz
. Na przykład 594 dzieli się na 12 i 17.To jest bijection, ponieważ możemy spakować liczby z powrotem, aby odzyskać oryginalny numer.
Funkcja
g
stosuje tek-1
czasy wstrząsów , rozszerzając się z jednego elementu do pary do potrójnego ... dok
-pleple. Za każdym razem ostatni element jest rozszerzany do dwóch elementów. Odbywa się to rekurencyjnie poprzez mapowanie danych wejściowych na parę poprzez bijection, pobranie pierwszego elementu pary do pierwszego wejścia danych wyjściowych i zastosowanie funkcji rekurencyjniek-1
do drugiego elementu w celu uzyskania pozostałych wpisów.źródło