Es kann gezeigt werden, dass die positiven rationalen Zahlen mit dem folgenden Verfahren numerierbar sind:
- Null hat die Ordnungszahl 0
- Ordnen Sie die anderen Zahlen in einem Raster so an, dass Zeile a, Spalte b a / b enthält
- Zeichnen Sie einen diagonalen Zickzack von rechts oben nach links unten
- Führen Sie eine fortlaufende Liste der eindeutigen Zahlen entlang des Zick-Zacks
Hier ist ein Bild vom Zick-Zack:
Die angetroffenen Zahlen sind also in der richtigen Reihenfolge
1/1, 2/1, 1/2, 1/3, 2/2, 3/1, 4/1, 3/2, 2/3, 1/4, 1/5, 2/4, 3/3, 4/2, 5/1, 6/1, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 2/6, 3/5, 4/4, 5/3 ...
Und die vereinfachten, eindeutigen Zahlen sind
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5, 5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3, ...
Herausforderung:
- Geben Sie die Ordnungszahl von p / q aus, wenn zwei ganze Zahlen größer als Null p und q gegeben sind
- p und q müssen nicht unbedingt co-prime sein
- Kürzester Code gewinnt
- Standardlücken sind verboten
Testfälle:
Hier sind die ersten 24 rationalen Zahlen und die gewünschte Ausgabe für jede:
1/1: 1
2/1: 2
1/2: 3
1/3: 4
2/2: 1
3/1: 5
4/1: 6
3/2: 7
2/3: 8
1/4: 9
1/5: 10
2/4: 3
3/3: 1
4/2: 2
5/1: 11
6/1: 12
5/2: 13
4/3: 14
3/4: 15
2/5: 16
1/6: 17
1/7: 18
2/6: 4
3/5: 19
Und für weitere Testfälle sind hier die 200 ersten positiven rationalen Zahlen in der Reihenfolge:
1, 2, 1/2, 1/3, 3, 4, 3/2, 2/3, 1/4, 1/5,
5, 6, 5/2, 4/3, 3/4, 2/5, 1/6, 1/7, 3/5, 5/3,
7, 8, 7/2, 5/4, 4/5, 2/7, 1/8, 1/9, 3/7, 7/3,
9, 10, 9/2, 8/3, 7/4, 6/5, 5/6, 4/7, 3/8, 2/9,
1/10, 1/11, 5/7, 7/5, 11, 12, 11/2, 10/3, 9/4, 8/5,
7/6, 6/7, 5/8, 4/9, 3/10, 2/11, 1/12, 1/13, 3/11, 5/9,
9/5, 11/3, 13, 14, 13/2, 11/4, 8/7, 7/8, 4/11, 2/13,
1/14, 1/15, 3/13, 5/11, 7/9, 9/7, 11/5, 13/3, 15, 16,
15/2, 14/3, 13/4, 12/5, 11/6, 10/7, 9/8, 8/9, 7/10, 6/11,
5/12, 4/13, 3/14, 2/15, 1/16, 1/17, 5/13, 7/11, 11/7, 13/5,
17, 18, 17/2, 16/3, 15/4, 14/5, 13/6, 12/7, 11/8, 10/9,
9/10, 8/11, 7/12, 6/13, 5/14, 4/15, 3/16, 2/17, 1/18, 1/19,
3/17, 7/13, 9/11, 11/9, 13/7, 17/3, 19, 20, 19/2, 17/4,
16/5, 13/8, 11/10, 10/11, 8/13, 5/16, 4/17, 2/19, 1/20, 1/21,
3/19, 5/17, 7/15, 9/13, 13/9, 15/7, 17/5, 19/3, 21, 22,
21/2, 20/3, 19/4, 18/5, 17/6, 16/7, 15/8, 14/9, 13/10, 12/11,
11/12, 10/13, 9/14, 8/15, 7/16, 6/17, 5/18, 4/19, 3/20, 2/21,
1/22, 1/23, 5/19, 7/17, 11/13, 13/11, 17/7, 19/5, 23, 24,
23/2, 22/3, 21/4, 19/6, 18/7, 17/8, 16/9, 14/11, 13/12, 12/13,
11/14, 9/16, 8/17, 7/18, 6/19, 4/21, 3/22, 2/23, 1/24, 1/25
Rufen Sie die umgekehrte Frage an , bei der der erste Zug fehlschlägt, sodass Sie die Antworten nicht verwenden können, um zusätzliche Testfälle zu generieren.
Antworten:
Jelly ,
21 bis20 BytesWahrscheinlich durch eine Anzahl von Bytes mit etwas kluger Mathematik zu schlagen ...
Ein monadischer Link, der eine Liste akzeptiert,
[p,q]
die die natürliche Nummer zurückgibt, die zugewiesen wurdep/q
.Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Wie?
Beachten Sie zunächst, dass die N- te Diagonale alle rationalen Zahlen des Gitters enthält, für die die Summe aus Zähler und Nenner gleich N + 1 ist. Wenn also eine Funktion gegeben ist, die ein
[p,q]
Paar auf die einfachste Form reduziert ([p/gcd(p,q),q/gcd(p,q)]
), können wir die Diagonalen so weit wie möglich bilden müssen * sein, alle Einträge reduzieren, Deduplizieren und den Index der vereinfachten Eingabe finden.* eigentlich noch ein weiteres hier um ein byte zu speichern
quelle
Perl 6 ,
9490 BytesProbier es aus
Probier es aus
Dies generiert im Grunde die gesamte Folge von Werten und stoppt, wenn eine Übereinstimmung gefunden wird.
Erweitert:
({1…($+=2)…1}…*)
erzeugt die unendliche Folge von Zählern (|(…)
wird oben zum Abflachen verwendet)(1,{1…(($||=1)+=2)…1}…*)
erzeugt die unendliche Folge von Nennernquelle
Python 2 ,
157144137134126125 BytesProbieren Sie es online!
4 Bytes gespart durch Mr. Xcoder ; 1 Byte von Jonathon Frech .
Wie Mr. Xcoder bemerkte, können wir in Python 3 etwas bessere Ergebnisse erzielen, da unter anderem die Ganzzahldivision standardmäßig Floating-Ergebnisse liefert und wir
list
s einfacher entpacken können :Python 3 , 117 Bytes
Probieren Sie es online!
quelle
**(j%-2|1)
undp-~q
.+1
am Ende, da1,1
muss man1
nicht geben0
.Python 3 ,
157,146,140133 BytesProbieren Sie es online!
gewann 11 Bytes dank Jonathan Frech
gewann 6 weitere Bytes und dann 7 dank Chas Brown
quelle
range(max(p,q)+1)
mitrange(p+q)
.{*a}
anstelle von verwendenset(a)
.J,
41,35, 30 Bytes-11 Bytes dank FrownyFrog
Probieren Sie es online!
original 41 bytes post mit erklärung
ungolfed
Erläuterung
Probieren Sie es online!
quelle
1+~.@;@([:<@|.`</.%~/~)@(1+i.@*)i.%
%i.~0~.@,@,[:]`|./.[:%/~1+i.@*
Python 3, 121 Bytes
quelle
Rust, 244 Bytes
Ich habe eine einfache Formel erstellt, um die "einfache" Ordnungszahl eines "einfachen" Zickzacks ohne die Einschränkungen des Puzzles zu finden. Dabei habe ich Dreieckszahlenformeln verwendet: https://www.mathsisfun.com/algebra/triangular-numbers.html . Dies wurde mit Modulo 2 modifiziert, um die Zick-Zack-Bewegungen in jeder diagonalen Reihe des Puzzles zu berücksichtigen. Das ist Funktion h ()
Dann zum Haupttrick dieses Puzzles: wie man bestimmte Wiederholungswerte, wie 3/3 gegen 1/1, 4/2 gegen 2/1, in der Zick-Zack-Spur nicht zählt. Ich habe die Beispiele 1-200 durchgesehen und festgestellt, dass der Unterschied zwischen einem einfachen Zick-Zack-Dreieck-Zähler und demjenigen, den das Puzzle haben möchte, ein Muster hat. Das Muster der "fehlenden" Zahlen ist 5, 12, 13, 14, 23 usw., was zu einem Treffer im OEIS führte. Es ist eines, das von Robert A Stump unter https://oeis.org/A076537 beschrieben wurde wurde. Um Zahlen wie 3/3, 4/2 und 1/1 zu "deduplizieren", können Sie überprüfen, ob GCD> 1 für die x, y aller "vorherigen" Ordnungszahlen im Zickzack. Dies ist die 'for'-Schleife und g () ist die gcd.
Ich denke, mit einem eingebauten gcd wäre es kürzer gewesen, aber ich konnte es irgendwie nicht leicht finden (ich bin ein bisschen neu bei Rust und Integer, verwirrt mich), und ich mag die Tatsache, dass dieses eine gerade Ganzzahl-Arithmetik verwendet, und keine eingebauten oder Bibliotheken jeglicher Art.
quelle
JavaScript (ES6), 86 Byte
Übernimmt Eingaben in der Currying-Syntax
(p)(q)
.Probieren Sie es online!
quelle
Javascript, 79 Bytes
(Ich bin neu im Code-Golfen, daher kann dies wahrscheinlich leicht verbessert werden.)
Erläuterung
quelle
(3,5)
führen soll19
(nicht24
) , da(1,1)==(2,2)==(3,3)
,(2,4)==(1,2)
,(4,2)==(2,1)
und(2,6)==(1,3)
. (dh(2,2)
sollte1
nicht5
usw. ergeben ...)