Verwandte, aber dies erfordert nur positive ganze Zahlen und muss nicht kommutativ sein
Die Cantor Pairing-Funktion wird in diesem Wikipedia-Artikel beschrieben . Im Wesentlichen handelt es sich um eine Operation, bei der bei Anwendung auf zwei Werte X und Y die ursprünglichen Werte X und Y erhalten werden können, wenn das Ergebnis angegeben wird.
Ihre Aufgabe ist es zwei Funktionen zu entwerfen: eine , die führt X, Y -> Z
und die andere , welche führt Z -> X, Y
. Hier ist der Haken: X, Y -> Z
Muss kommutativ sein. Dies bedeutet, dass Z -> X, Y
nicht festgestellt werden kann, ob die Eingabe X, Y
oder war Y, X
.
Die formale Definition dieser Herausforderung wäre:
Wählen Sie eine abzählbare unendliche Menge S von Zahlen.
Entwerfen Sie zwei Funktionen, die die folgenden Aufgaben ausführen:
- Geben Sie bei einem ungeordneten Wertepaar in S einen Wert in S zurück
- Wenn Sie einen Rückgabewert von der Anfangsfunktion erhalten, geben Sie das ungeordnete Wertepaar zurück, das bei der Übergabe durch die erste Funktion als Eingabe-Ganzzahl ausgewertet wird. Das Verhalten dieser Umkehrfunktion ist mir egal, wenn die Eingabe kein Rückgabewert aus der ersten Funktion ist.
Bedarf
- Das Ergebnis sollte zwischen den Läufen identisch sein.
{a, a}
ist ein ungeordnetes Paar
Hinweis: Ihre Antwort wird mit größerer Wahrscheinlichkeit von mir positiv bewertet, wenn Sie einen Beweis vorlegen. Ich werde die Antworten jedoch testen, wenn ich sie erhalte und positiv bewerten, sobald ich mir ziemlich sicher bin, dass sie funktioniert.
1,2
ist eines der Paare,1,3
kann auch ein potentielles Paar sein (beide verwenden1
)?f
und ihre Inverseg
,sorted((x, y))
sollte gleich seinsorted(g(f(x, y)))
Antworten:
Haskell , 65 + 30 = 95 Bytes
Probieren Sie es online!
Probieren Sie es online!
Hinweis: Wenn die beiden Funktionen Code gemeinsam nutzen können, sind dies nur 75 Byte:
Probieren Sie es online! Die Domäne sind die positiven ganzen Zahlen. Die Funktion
(#)
führt das Pairing durch, die Funktion(l!!)
das Inverse. Anwendungsbeispiel: Beides(#) 5 3
und(#) 3 5
Ertrag12
und(l!!) 12
Ertrag(5,3)
.Dies funktioniert, indem alle sortierten Paare explizit in einer unendlichen Liste aufgelistet werden
l
:Die Kodierung ist dann nur der Index in dieser Liste.
quelle
Pyth , 8 + 6 = 14 Bytes
Probieren Sie es online!
Probieren Sie es online!
Bereich: Positive ganze Zahlen.
quelle
2
und10
zum Beispiel (die in der Domäne sind)Jelly , 8 + 11 = 19 Bytes
Zurückgesetzt, da Rods Algorithmus nicht funktionierte.
Dies funktioniert im Bereich der positiven ganzen Zahlen.
Nimmt
x
undy
als 2 Argumente, egal in welcher Reihenfolge, zurückz
.Probieren Sie es online!
Nimmt
z
und kehrt zurück[min(x, y), max(x, y)]
Probieren Sie es online!
quelle
JavaScript (ES7), 44 Byte
Ordnet nicht negative ganze Zahlen einer Teilmenge davon zu.
quelle
C (gcc) , 36 + 39 = 75 Bytes
Vielen Dank an @tsh für das Speichern von zwei Bytes.
Die Domain besteht aus nicht negativen ganzen Zahlen.
Nimmt
x
undy
kehrt zurückz
.Nimmt ein
int
Array mit zwei Elementen an . Das zweite Element mussz
vor dem Aufruf auf gesetzt werden. Nach dem Anrufr
enthältx
undy
.Probieren Sie es online!
quelle
(x+1)
->-~x
Jelly ,
1311 BytesPaar positive ganze Zahlen bis positive ganze Zahl, 5 Bytes
Probieren Sie es online!
positive ganze Zahl bis Paar positiver ganzer Zahlen, 6 Bytes
Probieren Sie es online!
Algorithmus
Wenn wir die Menge aller ungeordneten Paare positiver Ganzzahlen nach ihrem Maximum und dann nach ihrer Summe sortieren, erhalten wir die folgende Reihenfolge.
{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},…
Die erste Funktion nimmt ein Paar {x, y} und findet ihren Index in dieser Reihenfolge.
Die zweite Funktion nimmt eine positive ganze Zahl z und gibt das z- te Element der Sequenz zurück.
Beachten Sie, dass diese Zuordnung mit der in @ EriktheOutgolfers Gelee-Antwort übereinstimmt .
Wie es funktioniert
quelle
c
undŒċ
... obwohl ich mich vielleicht irre. Übrigens, das war meine Antwort, die Sie übertroffen haben> _>Mathematica (35 + 53) = 78 Bytes
Dies ist die einzige bekannte quadratische Paarungsfunktion für Z <-> ZxZ, die mit Min und Max kombiniert wird, um die Ordnung zu verlieren.
quelle
Ruby, 66 Bytes
Ich versuche einen Weg zu finden, um geschickt eine unendliche Menge auszuwählen, um dies zu vereinfachen. Dies ist das Beste, was ich bisher habe.
Wir definieren f (x, y) = 2 x-1 bitweise oder 2 y-1 . Die Domain besteht aus der Menge, die rekursiv als 1,2 definiert ist, und allen Zahlen, die durch Aufrufen von f auf Zahlen in der Menge erzeugt werden können (beachten Sie, dass f (1,1) = 1 und f (2,2) = 2 ist, also 1 und 2 haben Inverse). Die resultierenden Zahlen haben entweder eine oder zwei Einsen in ihrer binären Erweiterung, wobei die Indizes der Einsen den Zahlen in der Menge entsprechen. Wir können das ursprüngliche ungeordnete Paar herausholen, indem wir die Indizes nehmen. Wenn es nur eine 1 gibt, bedeutet dies, dass die Elemente des Paares gleich sind.
Zum Beispiel ist f (3,5) 20, weil 20 in der Basis 2 10100 ist, was 1s an der 3. und 5. Stelle mit der geringsten Signifikanz hat.
quelle
Java 8,
153146141137 +268224216205 BytesPair-Funktion
Probieren Sie es online!
Depair-Funktion
Probieren Sie es online!
quelle
int i=(""+a[0]).length()
kann seinint i=(f+a[0]).length()
; der Raum zwischenc=0,j;i>0;
kann entfernt werden;a[0].parseInt
kann seinnew Integer
. In der Depair-Funktion: Alle dreir.parseInt
können seinr.decode
; und Sie könnten eine int-Variable für machent.length()
, da Sie es zweimal verwenden.05AB1E , 6 + 11 = 17 Bytes
Port meiner Gelee Antwort.
Bereich: positive ganze Zahlen.
Nimmt eine Liste
[x, y]
als Eingabe und kehrt zurückz
.Probieren Sie es online!
Übernimmt eine positive Ganzzahl
z
als Eingabe und gibt zurück[min(x, y), max(x, y)]
.Probieren Sie es online!
-5 danke an Emigna .
quelle
2ã€{RÙR
!JavaScript, 72 Bytes
Funktioniert für positive ganze Zahlen (theoretisch). Ganz einfach: Sortiere zwei Zahlen in einer (magischen) Reihenfolge, verbinde sie als Zeichenfolge mit einem Buchstaben
"a"
und analysiere sie als hexadezimale Ganzzahl.Code-Snippet anzeigen
quelle
MATL, 6 + 8 = 14 Bytes
Encoding-Funktion, nimmt zwei Eingänge n, m. Ausgangsprodukt aus n-ter und m-ter Primzahl.
Schritte:
,
- Mach es zweimali
- Eingang drückenYq
- Popeingang, drücke Eingangstaste]*
- Zweimal beenden, beide Primzahlen platzen lassen und Produkt drückenDekodierungsfunktion, nimmt eine Eingabe m. Gibt die Anzahl der Primzahlen unter jedem der Primfaktoren von n aus.
Schritte:
i
- Eingang drückenYf
- Pop-Eingabe, Push-Array von Primfaktoren"
- Für n im Array@Zq
- Array von Primzahlen unter n schiebenn
- Array öffnen, Länge des Arrays verschiebenDies ist kommutativ, weil die Multiplikation kommutativ ist, und injektiv, weil Primfaktoren eindeutig sind. Nicht, dass dies nicht auf die ganzen Zahlen zutrifft.
quelle
Schale , 5 + 3 = 8 Bytes
Ich hoffe wirklich, dass ich die Herausforderung richtig gelöst habe. Ich sehe einige gelöschte Antworten, die mir als gültig erscheinen ...
Paare positiver Ganzzahlen zu einer einzelnen positiven Ganzzahl:
Probieren Sie es online!
Es funktioniert, indem die Zahlen bei den gegebenen Indizes (1-indiziert) aus der Liste der Primzahlen genommen und multipliziert werden.
Ergebnis der ersten Funktion für Paare positiver Ganzzahlen:
Probieren Sie es online!
Wir faktorisieren die eingegebene Zahl und geben den Index in der Liste der Primzahlen aller (beider) Faktoren zurück.
Gearbeitetes Beispiel
Als Startpaar
(4,1)
nehmen wir die vierte und erste Primzahl(7,2)
und multiplizieren sie →14
. Diese Multiplikation macht die Funktion unabhängig von der Reihenfolge der beiden Elemente.Ausgehend von
14
faktorisieren wir es(2,7)
und geben die Indizes von2
und7
in der Liste der Primzahlen zurück →(1,4)
.quelle
C # , 80 Bytes (38 + 42)
Daten
Encoder
Int32
l
eine Zahl einInt32
r
eine Zahl einInt64
Beide Ints sind miteinander verschmolzenDecoder
Int32
v
Der WertInt32[]
Ein Array mit den beiden ursprünglichen Ints.Golf gespielt
Ungolfed
Ungolfed lesbar
Vollständiger Code
Releases
80 bytes
- Anfangslösung.Anmerkungen
quelle
Python: 41 + 45 = 86
Geber: 41
Decoder: 45
Älterer Versuch:
Python: 114: 30 + 84
Drehgeber: 30
Akzeptiert 2 Ganzzahlen und gibt einen String zurück
Decoder: 86
decoder2: 120
ein weiterer versuch mit generatorverständnis und summe
quelle
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO