Die Stern-Brocot-Sequenz ist eine Fibonnaci-ähnliche Sequenz, die wie folgt konstruiert werden kann:
- Initialisieren Sie die Sequenz mit
s(1) = s(2) = 1
- Zähler setzen
n = 1
- Anhängen
s(n) + s(n+1)
An die Sequenz - Anhängen
s(n+1)
An die Sequenz - Inkrementieren
n
, kehren Sie zu Schritt 3 zurück
Dies ist äquivalent zu:
Unter anderem kann die Stern-Brocot-Sequenz verwendet werden, um jede mögliche positive rationale Zahl zu erzeugen. Jede rationale Zahl wird genau einmal generiert und erscheint immer in ihrer einfachsten Form. ist zum Beispiel 1/3
die 4. rationale Zahl in der Folge, aber die entsprechenden Zahlen 2/6
,3/9
usw. wird nicht angezeigt.
Wir können die n-te rationale Zahl als definieren r(n) = s(n) / s(n+1)
, wos(n)
oben beschrieben die n-te Stern-Brocot-Zahl ist.
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die die mit der Stern-Brocot-Sequenz erzeugte n-te rationale Zahl ausgibt.
- Die oben beschriebenen Algorithmen sind 1-indiziert; Wenn Ihr Eintrag 0-indiziert ist, geben Sie dies bitte in Ihrer Antwort an
- Die beschriebenen Algorithmen dienen nur zur Veranschaulichung. Die Ausgabe kann nach Belieben abgeleitet werden (außer durch Hardcodierung).
- Die Eingabe kann über STDIN, Funktionsparameter oder einen anderen sinnvollen Eingabemechanismus erfolgen
- Ausgang kann STDOUT, Konsole, Funktionsrückgabewert oder jeder andere sinnvolle Ausgabestream sein
- Ausgang muss als Zeichenkette in der Form sein
a/b
, in dera
undb
sind die entsprechenden Einträge in der Stern-Brocot Sequenz. Die Auswertung des Bruchs vor der Ausgabe ist nicht zulässig. Bei der Eingabe12
sollte die Ausgabe beispielsweise2/5
nicht sein0.4
. - Standardlücken sind nicht zulässig
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Testfälle
Die Testfälle sind hier 1-indiziert.
n r(n)
-- ------
1 1/1
2 1/2
3 2/1
4 1/3
5 3/2
6 2/3
7 3/1
8 1/4
9 4/3
10 3/5
11 5/2
12 2/5
13 5/3
14 3/4
15 4/1
16 1/5
17 5/4
18 4/7
19 7/3
20 3/8
50 7/12
100 7/19
1000 11/39
OEIS-Eintrag: A002487
Exzellentes Numberphile-Video zur Sequenz: Unendliche Brüche
True
s anstelle von1
s verwenden?True/2
ist kein gültiger Bruch (soweit es mich betrifft). ÜbrigensTrue
nicht immer1
- einige Sprachen verwenden-1
stattdessen, um mögliche Fehler beim Anwenden bitweiser Operatoren zu vermeiden. [Zitieren benötigt]True
gleichbedeutend mit1
undTrue/2
wäre1/2
.Antworten:
Jelly , 14 Bytes
Probieren Sie es online!
Ooh, looks like I can beat the accepted answer by @Dennis, and in the same language at that. This works using a formula from OEIS: the number of ways to express (the number minus 1) in hyperbinary (i.e. binary with 0, 1, 2 as digits). Unlike most Jelly programs (which work either as a full program or a function), this one works only as a full program (because it sends part of the output to stdout, and returns the rest; when used as a full program the return value is sent to stdout implicitly, so all the output is in the same place, but this wouldn't work for a function submission).
Diese Version des Programms ist sehr ineffizient. Sie können ein viel schnelleres Programm erstellen, das für alle Eingaben bis zu 2ⁿ funktioniert, indem Sie n direkt nach
ẋ
der ersten Zeile einfügen. Das Programm hat eine O ( n × 3ⁿ) -Leistung, daher ist es hier ziemlich wichtig , n klein zu halten . Das geschriebene Programm setzt n gleich der Eingabe, die eindeutig groß genug, aber in fast allen Fällen auch eindeutig zu groß ist (aber hey, es spart Bytes).Erläuterung
Wie in meinen Jelly-Erklärungen üblich, zeigt Text in geschweiften Klammern (z. B.
{the input}
) etwas, das Jelly aufgrund fehlender Operanden im Originalprogramm automatisch ausfüllt.Hilfsfunktion (berechnet den n- ten Nenner, dh den n + 1- ten Zähler):
Die ersten fünf Bytes erzeugen im Grunde genommen nur alle möglichen hyperbinären Zahlen bis zu einer bestimmten Länge, zB bei Eingabe 3 ist die Ausgabe von
Ḷ
[[0,1,2], [0,1,2], [0,1,2] ]] so ist das kartesische Produkt [[0,0,0], [0,0,1], [0,0,2], [0,1,0],…, [2,2,1], [2,2,2]].Ḅ
basically just multiplies the last entry by 1, the penultimate entry by 2, the antepenultimate entry by 4, etc., and then adds; although this is normally used to convert binary to decimal, it can handle the digit 2 just fine, and thus works for hyperbinary too. Then we count the number of times the input appears in the resulting list, in order to get an appropriate entry in the sequence. (Luckily, the numerator and denominator follow the same sequence).Main program (asks for the numerator and denominator, and formats the output):
Somehow I keep writing programs that take almost as many bytes to handle I/O as they do to solve the actual problem…
quelle
CJam (20 bytes)
Online demo. Note that this is 0-indexed. To make it 1-indexed, replace the initial
1_
byT1
.Dissection
This uses the characterisation due to Moshe Newman that
If
x = s/t
then we getNow, if we assume that
s
andt
are coprime thenSo
a(n+2) = a(n) + a(n+1) - 2 * (a(n) % a(n+1))
works perfectly.quelle
Haskell,
78 77 6558 bytesShamelessly stealing the optimized approach gives us:
Thanks to @nimi for golfing a few bytes using an infix function!
(Still) uses 0-based indexing.
The old approach:
Damn the output format... And indexing operators. EDIT: And precedence.
Fun fact: if heterogenous lists were a thing, the last line could be:
quelle
s!!n
should be one byte shorter:f n|x<-s!!n=x:x+x+1:f$n+1
s!!n+1
is not(s!!n)+1
buts!!(n+1)
which is why I can't do that :/s!!n
in there!++'/':(show.s$n+1)
inr
to save a byte.(s#t)0=show...
,(s#t)n=t#(s+t-2*mod s t)$n-1
,r=1#1
. You can even omitr
, i.e. the last line is just1#1
.Jelly, 16 bytes
Try it online! or verify all test cases.
How it works
quelle
05AB1E,
34332523 bytesExplanation
Try it online
Saved 2 bytes thanks to Adnan.
quelle
XX‚¹GÂ2£DO¸s¦ìì¨}R2£'/ý
.ý
can format a list. Nice.MATL, 20 bytes
This uses the characterization in terms of binomial coefficients given in the OEIS page.
The algorithm works in theory for all numbers, but in practice it is limited by MATL's numerical precision, and so it doesn't work for large entries. The result is accurate for inputs up to
20
at least.Try it online!
Explanation
quelle
Python 2,
8581 bytesThis submission is 1-indexed.
Using a recursive function, 85 bytes:
If an output like
True/2
is acceptable, here's one at 81 bytes:quelle
JavaScript (ES6), 43 bytes
1-indexed; change to
n=1
for 0-indexed. The linked OEIS page has a useful recurrence relation for each term in terms of the previous two terms; I merely reinterpreted it as a recurrence for each fraction in terms of the previous fraction. Unfortunately we don't have inline TeX so you'll just have to paste it onto another site to find out how this formats:quelle
Python 2, 66 bytes
Uses the recursive formula.
quelle
C (GCC), 79 bytes
Uses 0-based indexing.
Ideone
quelle
x?:y
is a gcc extension.Actually, 18 bytes
Try it online!
This solution uses Peter's formula and is likewise 0-indexed. Thanks to Leaky Nun for a byte.
Explanation:
quelle
MATL,
3230 bytesThis uses a direct approach: generates enough members of the sequence, picks the two desired ones and formats the output.
Try it online!
quelle
R, 93 bytes
Literally the simplest implementation. Working on golfing it a bit.
quelle
m4, 131 bytes
Defines a macro
r
such thatr(n)
evaluates according to the spec. Not really golfed at all, I just coded the formula.quelle
Ruby, 49 bytes
This is 0-indexed and uses Peter Taylor's formula. Golfing suggestions welcome.
quelle
><>, 34+2 = 36 bytes
After seeing Peter Taylor's excellent answer, I re-wrote my test answer (which was an embarrassing 82 bytes, using very clumsy recursion).
It expects the input to be present on the stack, so +2 bytes for the
-v
flag. Try it online!quelle
Octave, 90 bytes
quelle
C#,
9190 bytesCasts to
Func<int, string>
. This is the recursive implementation.Ungolfed:
Edit: -1 byte. Turns out C# doesn't need a space between
return
and$
for interpolated strings.quelle
Python 2, 59 bytes
Uses Peter's formula and is similarly 0-indexed.
Try it online
quelle
J, 29 bytes
Usage
Large values of n require a suffix of
x
which denotes the use of extended integers.quelle
100
counts as a "large value"?Mathematica,
108106101 bytesquelle
R, 84 bytes
Try it online!
The older R implementation doesn't follow the specs, returning a floating point rather than a string, so here's one that does.
quelle