Powiązane, ale wymaga to tylko dodatnich liczb całkowitych i nie musi być przemienne
Funkcję parowania kantora opisano w tym artykule w Wikipedii . Zasadniczo jest to operacja taka, że po zastosowaniu do dwóch wartości X i Y można uzyskać oryginalne wartości X i Y, biorąc pod uwagę wynik.
Twoim zadaniem jest zaprojektowanie dwóch funkcji: jednej, która wykonuje, X, Y -> Z
a drugiej, która wykonuje Z -> X, Y
. Oto haczyk: X, Y -> Z
musi być przemienny. Oznacza to, że Z -> X, Y
nie będzie w stanie ustalić, czy dane wejściowe były X, Y
lub Y, X
.
Formalna definicja tego wyzwania brzmiałaby:
Wybierz policzalny nieskończony zbiór S liczb.
Zaprojektuj dwie funkcje, które wykonują następujące zadania:
- Biorąc pod uwagę nieuporządkowaną parę wartości w S, zwróć wartość w S
- Biorąc pod uwagę wartość zwracaną z funkcji początkowej, zwróć nieuporządkowaną parę wartości, która ocenia na wejściową liczbę całkowitą po przejściu przez pierwszą funkcję. Nie obchodzi mnie zachowanie tej funkcji odwrotnej, jeśli dane wejściowe nie są wartością zwracaną z pierwszej funkcji.
Wymagania
- Wynik powinien być identyczny między seriami.
{a, a}
jest nieuporządkowaną parą
Uwaga: twoja odpowiedź jest bardziej prawdopodobna, jeśli dostaniesz ode mnie głos, jeśli dostarczysz dowód, ale przetestuję odpowiedzi, kiedy do niego dojdę, i głosuję, gdy będę dość pewny, że zadziała.
1,2
jest jedna z tych par,1,3
może być również potencjalną parą (obie wykorzystują1
)?f
i jej odwrotnościg
,sorted((x, y))
powinna być taka sama jaksorted(g(f(x, y)))
Odpowiedzi:
Haskell , 65 + 30 = 95 bajtów
Wypróbuj online!
Wypróbuj online!
Uwaga: Gdy dwie funkcje mogą współdzielić kod, jest to tylko 75 bajtów:
Wypróbuj online! Domena to dodatnie liczby całkowite. Funkcja
(#)
wykonuje parowanie, funkcja(l!!)
jest odwrotna. Przykład użycia: Zarówno(#) 5 3
i(#) 3 5
plon12
, jak i(l!!) 12
plon(5,3)
.Działa to poprzez jawne wyświetlanie wszystkich posortowanych par na nieskończonej liście
l
:Kodowanie jest wtedy tylko indeksem na tej liście.
źródło
Pyth , 8 + 6 = 14 bajtów
Wypróbuj online!
Wypróbuj online!
Domena: dodatnie liczby całkowite.
źródło
2
i10
na przykład (które są w domenie)Galaretka , 8 + 11 = 19 bajtów
Wycofano, ponieważ algorytm Rod nie działał.
Działa to w domenie liczb całkowitych dodatnich.
Bierze
x
iy
jako 2 argumenty, nie ma znaczenia, w jakiej kolejności zwracaz
.Wypróbuj online!
Bierze
z
i wraca[min(x, y), max(x, y)]
Wypróbuj online!
źródło
JavaScript (ES7), 44 bajty
Mapy od liczb całkowitych nieujemnych do ich podzbiorów.
źródło
C (gcc) , 36 + 39 = 75 bajtów
Dzięki @tsh za zapisanie dwóch bajtów.
Domena to nieujemne liczby całkowite.
Bierze
x
iy
zwracaz
.Przyjmuje
int
tablicę dwuelementową . Drugi element musi być ustawionyz
przed wywołaniem. Po połączeniur
zawierax
iy
.Wypróbuj online!
źródło
(x+1)
->-~x
Galaretka ,
1311 bajtówpara dodatnich liczb całkowitych do dodatniej liczby całkowitej, 5 bajtów
Wypróbuj online!
dodatnia liczba całkowita do pary dodatnich liczb całkowitych, 6 bajtów
Wypróbuj online!
Algorytm
Jeśli posortujemy zestaw wszystkich nieuporządkowanych par liczb całkowitych dodatnich według ich maksimum, a następnie według ich sumy, otrzymamy następującą sekwencję.
{1,1}, {1,2}, {2,2}, {1,3}, {2,3}, {3,3}, {1,4}, {2,4}, {3 , 4}, {4,4}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5},…
Pierwsza funkcja bierze parę {x, y} i znajduje swój indeks w tej sekwencji.
Druga funkcja przyjmuje dodatnią liczbę całkowitą z i zwraca z th element sekwencji.
Zauważ, że to mapowanie jest takie samo jak w odpowiedzi Jelly @ EriktheOutgolfer .
Jak to działa
źródło
c
iŒċ
... chociaż mogę się mylić. BTW, to była moja odpowiedź, że wygraliście> _>Mathematica (35 + 53) = 78 bajtów
Jest to jedna dobrze znana funkcja parowania kwadratowego dla Z <--> ZxZ w połączeniu z Min i Max, dzięki czemu jest bez porządku.
źródło
Rubin, 66 bajtów
Próbuję znaleźć sposób, aby sprytnie wybrać nieskończony zestaw, aby to ułatwić, jest to najlepsze, jakie do tej pory miałem.
Definiujemy f (x, y) = 2 x-1 bitowo-lub 2 y-1 . Domena składa się ze zbioru zdefiniowanego rekurencyjnie jako zawierającego 1,2 oraz wszystkich liczb, które można uzyskać, wywołując f na numerach w zestawie (zwróć uwagę, że f (1,1) = 1 i f (2,2) = 2, więc 1 i 2 mają inwersje). Wszystkie wynikowe liczby mają jeden lub dwa jedynki w rozwinięciu binarnym, przy czym indeksy jedności odpowiadają liczbom w zbiorze. Możemy wyciągnąć oryginalną nieuporządkowaną parę, biorąc indeksy. Jeśli jest tylko jeden 1, oznacza to, że elementy pary są równe.
Na przykład f (3,5) wynosi 20, ponieważ 20 to 10100 w bazie 2, która ma 1 w 3 i 5 najmniej znaczących miejscach.
źródło
Java 8,
153146141137 +268224216205 bajtówFunkcja parowania
Wypróbuj online!
Funkcja Depair
Wypróbuj online!
źródło
int i=(""+a[0]).length()
może byćint i=(f+a[0]).length()
; przestrzeń międzyc=0,j;i>0;
można usunąć;a[0].parseInt
może byćnew Integer
. W funkcji depair: wszystkie trzyr.parseInt
mogą byćr.decode
; i możesz stworzyć zmienną intt.length()
, ponieważ używasz jej dwa razy.05AB1E , 6 + 11 = 17 bajtów
Port mojej galaretki odpowiedzi.
Domena: dodatnie liczby całkowite.
Pobiera listę
[x, y]
jako dane wejściowe, zwracaz
.Wypróbuj online!
Pobiera na
z
wejściu dodatnią liczbę całkowitą , zwraca[min(x, y), max(x, y)]
.Wypróbuj online!
-5 dzięki Emignie .
źródło
2ã€{RÙR
!JavaScript, 72 bajty
Działa dla dodatnich liczb całkowitych (w teorii). Całkiem prosty pomysł: posortuj dwie liczby w jakiejś (magicznej) kolejności, połącz je jako ciąg literowy
"a"
, parsuj jako liczbę całkowitą w postaci heksadecymalnej.Pokaż fragment kodu
źródło
MATL, 6 + 8 = 14 bajtów
Funkcja kodowania zajmuje dwa wejścia n, m. Produkuje iloczyn n-tej i pierwszej-tej liczby pierwszej.
Kroki:
,
- Zrób dwa razyi
- Wejście pushYq
- Pop wejście, push wejście czwarta liczba pierwsza]*
- Zakończ dwa razy, pop obu liczb pierwszych i wypchnij produktFunkcja dekodowania zajmuje jedno wejście m. Podaje liczbę liczb pierwszych poniżej każdego z czynników pierwszych n.
Kroki:
i
- Wejście pushYf
- Pop wejście, push tablica czynników pierwszych"
- Dla nw tablicy@Zq
- Wciśnij tablicę liczb pierwszych poniżej nn
- Pop tablica, push długość tablicyJest to przemienne, ponieważ mnożenie jest przemienne, a iniekcyjne, ponieważ czynniki pierwsze są unikalne. Nie to, że nie jest to na liczbach całkowitych.
źródło
Łuska , 5 + 3 = 8 bajtów
Naprawdę mam nadzieję, że dobrze podjąłem wyzwanie. Widzę kilka usuniętych odpowiedzi, które wydają mi się ważne ...
Pary dodatnich liczb całkowitych do jednej dodatniej liczby całkowitej:
Wypróbuj online!
Działa poprzez pobranie liczb z podanych indeksów (1-indeksowanych) z listy liczb pierwszych i pomnożenie ich.
Wynik pierwszej funkcji dla par dodatnich liczb całkowitych:
Wypróbuj online!
Faktoryzujemy liczbę wejściową i zwracamy indeks na liście liczb pierwszych wszystkich (obu) jego czynników.
Przykład działał
Biorąc pod uwagę,
(4,1)
jako para wyjściowej, bierzemy czwarty i pierwszych liczb pierwszych(7,2)
i pomnożyć je →14
. To zwielokrotnienie sprawia, że funkcja jest niezależna od kolejności dwóch elementów.Zaczynamy od
14
faktoryzacji(2,7)
i zwracamy indeksy2
oraz7
na liście liczb pierwszych →(1,4)
.źródło
C # , 80 bajtów (38 + 42)
Dane
Enkoder
Int32
l
liczbę A.Int32
r
liczbę A.Int64
Oba zespoły zostały połączoneDekoder
Int32
v
wartośćInt32[]
Tablica z dwoma oryginalnymi liczbami całkowitymi.Grał w golfa
Bez golfa
Nieczytelny czytelny
Pełny kod
Prasowe
80 bytes
- Wstępne rozwiązanie.Notatki
źródło
Python: 41 + 45 = 86
enkoder: 41
dekoder: 45
Starsza próba:
Python: 114: 30 + 84
enkoder: 30
akceptuje 2 liczby całkowite, zwraca ciąg znaków
dekoder: 86
dekoder2: 120
kolejna próba ze zrozumieniem generatora i sumą
źródło
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO