Erstellen Sie eine Funktion, die eine natürliche Zahl (beginnend mit 0 einschließlich) annimmt und ein Paar positiver Ganzzahlen zurückgibt, die der Zähler bzw. der Nenner sind. Verwenden Sie die diagonale Durchquerung. Zuvor gezählte Nummern müssen übersprungen werden. (Sie können sich die übersprungenen Werte merken)
Diagramm:
Rot sind übersprungene Werte
Werte:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (beachten Sie das Überspringen)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2, 3
- f (8) = 1, 4
- f (9) = 1, 5
- f (10) = 5, 1 (beachten Sie das Überspringen)
Sie können die Rational-Datenstruktur und ihre Operationen verwenden, falls vorhanden. Der kürzeste Code gewinnt.
code-golf
rational-numbers
Ming-Tang
quelle
quelle
Antworten:
J,
4136 ZeichenNimmt eine ganze Zahl und gibt einen Vektor zurück, der zwei ganze Zahlen umfasst. Meine erste Lösung, die weder ganz stillschweigend noch ganz explizit ist.
Hier ist die Lösung mit gegebenenfalls eingefügten Leerzeichen:
Eine Erklärung:
x (, % +.) y
–Ein Vektor der Länge 2, der den Bruch darstellt, wobei Zählerx
und Nennery
auf den kleinsten Nenner reduziert sind1 + i. 1 + y
–Ein Vektor von ganzen Zahlen von1
bisy + 1
(, % +.)"0/~ 1 + i. 1 + y
–Eine Matrix aller reduzierten Brüche mit nicht reduziertem Nenner und Zähler im Bereich von1
bisy + 1
.<`(<@|.)/. y
–Eine Anordnung der schrägen Diagonalen der Matrixy
, die diagonal umgedreht sind~. ; y
–Eine Anordnung von Diagonalen kollabierte zu einem Vektor von Elementen, wobei Duplikate entfernt wurdenx { y
–Der Gegenstand an Positionx
iny
(u v) y
–Das gleiche wiey u v y
. In diesem speziellen Anwendungsfallu
ist{
undv
ist3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
quelle
Haskell, 78 Zeichen
Probelauf:
cycle
und Funktionen zum Wechseln der Zeilenreihenfolgecycle
die handgefertigte unendliche Liste ersetzend
gcd
Identität, wie von Matías vorgeschlagenquelle
gcd (r-b) b == gcd r b
Sie vier weitere Zeichen rasieren.Python, 144 Zeichen
quelle
Ruby 1.9,
109106quelle
OCaml + Batterien,
182168 ZeichenDies wäre in Haskell natürlich, in OCaml jedoch kaum möglich:
Bearbeiten: Die Diagonale ist nicht erforderlich
quelle
Perl 6 , 75 Bytes
Probier es aus
Dies erzeugt im Grunde die gesamte Folge von rationalen Werten und stoppt erst, wenn der indizierte Wert erzeugt wurde.
(Basierend auf meinem Golf zu einer anderen Herausforderung.)
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