Sie können eine Liste aller Rationen 0 <r ≤ 1 erstellen, indem Sie sie zuerst nach Nenner und dann nach Zähler sortieren:
1 1 1 2 1 3 1 2 3 4 1 5 1 2 3 4 5
- - - - - - - - - - - - - - - - -
1 2 3 3 4 4 5 5 5 5 6 6 7 7 7 7 7
Beachten Sie, dass wir alle rationalen Zahlen überspringen, die bereits zuvor vorkamen. ZB 2/4 wird übersprungen, weil wir bereits 1/2 aufgelistet haben.
In dieser Herausforderung interessieren uns nur die Zähler. Schreiben Sie in der obigen Liste eine Funktion oder ein Programm mit einer positiven Ganzzahl n , die den n-ten Zähler aus der Liste zurückgibt .
Testfälle:
1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15
(0,1]
Antworten:
MATL ,
1713 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Die Eingabegröße kann durch die Gleitkommagenauigkeit begrenzt sein. Alle Testfälle liefern das richtige Ergebnis.
Erläuterung
Dies erzeugt alle Brüche
k/m
mitk
,m
in[1 2 ...n]
, alsn
×n
Matrix. Die Zeile gibt den Zähler und die Spalte den Nenner an. Tatsächlich enthält der Matrixeintragm/k
stattdessen den inversen Bruch ,k/m
was jedoch irrelevant ist und in der weiteren Erläuterung ignoriert werden kann.Matrixeinträge gelten implizit als in der Reihenfolge des Spaltenhauptteils sortiert. In diesem Fall entspricht dies der erforderlichen Reihenfolge: Nenner, dann Zähler.
Drei Arten von Einträgen müssen in dieser Matrix nicht berücksichtigt werden:
k/m
,k>m
die den gleichen Wert haben wie ein vorheriger Eintrag (wird beispielsweise2/4
ignoriert, weil es der gleiche ist wie1/2
)k/k
,k>1
. Einträge, deren Zähler den Nenner überschreitetk/m
,k<m
(diese sind nicht Teil des Problems).Das Ignorieren von Einträgen erfolgt mit einer
unique
Funktion, die doppelte Werte stabil entfernt und die Indizes der überlebenden Einträge ausgibt. Einträge vom Typ 1 werden dabei automatisch entfernt. Für die Typen 2 und 3 werden die Matrixeinträge in der Diagonale und darunter auf gesetzt0
. Auf diese Weise werden alle Null-Einträge mit Ausnahme des ersten entfernt (entsprechend dem gültigen Bruch1/1
).Betrachten Sie die Eingabe
4
als Beispiel.quelle
Jelly ,
119 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Mathematica, 53 Bytes
quelle
Haskell, 40 Bytes
Eine anonyme Funktion. Ziemlich einfach: Verwendet ein Listenverständnis, um eine unendliche Liste zu generieren, die alle Zähler
n
und relativ primitiven Nenner durchläuftd
. Um einen Index von Null in einen Index von Eins zu konvertieren, stellen wir ein voran0
, das4
Bytes benötigt.quelle
n<-[0..d]
fügt die Null auf kürzere Weise hinzu und speichert die 4 BytesPyth, 13 Bytes
Probieren Sie es online aus. Testsuite.
quelle
Pyth, 11 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
Eigentlich 15 Bytes
Diese Antwort basiert auf Dennis 'Jelly-Antwort . Ich benutze
HN
am Ende, um Probleme mit der 0-Indizierung zu vermeiden und n zu dekrementieren und am Anfang oder Ende zu tauschen.H
Ruft die erstenn
Mitglieder der Liste der Zähler ab, die sich ergeben, undN
ruft das letzte Mitglied dieser Auswahl ab, dh denn
dritten Zähler, ohne sich um Stapeloperationen zu kümmern. Golfvorschläge sind willkommen. Probieren Sie es online!Ungolfing
quelle
Python,
111 -110 BytesDer Bruch ist mit dargestellt
x/y
. Das Argumentn
wird dekrementiert, wenn ein neuer passender Bruch gefunden wird (diegcd
fromfractions
checks können den Bruch reduzieren). In jeder Iteration der Schleifex
erhöht wird, dann, wennx>=y
eine neue Serie von Fraktionen mity+1
gestartet wird,>
wegen des „Sonderfalls“(x,y)=(2,1)
, golfed zux>y
.Ich bin mir sicher, dass man mehr Golf spielen kann, aber ich vermisse, wo ich es verbessern könnte.Fand es.Link zu Code und Testfällen
quelle
JavaScript (ES6), 95 Byte
Erzeugt alle
n²
Brüche mit Zählern und Nennern von1
bisn
und filtert diejenigen heraus, die größer als1
oder zuvor gesehen wurden, und nimmt dann denn
th.quelle
Perl, 82 + 2 (
-pl
Flag) = 84 BytesUngolfed:
quelle
JavaScript (ES6), 76
Weniger golfen
Prüfung
quelle
Clojure, 85 Bytes
Verwendet das Listenverständnis, um eine Liste aller Rationalitäten zu erstellen, und filtert sie dann, um nur bestimmte zu erhalten. Nimmt
nth
den Listeneintrag und gibt seinen Zähler zurück. Für das erste Element ist auch eine separate Bedingung erforderlich, da Clojure den Zähler einer Ganzzahl nicht übernehmen kann. (Aus welchem Grund auch immer, wenn eine Ganzzahl nicht Rational ist - https://goo.gl/XETLo2 )Sehen Sie es online - https://ideone.com/8gNZEB
quelle