Fortgesetzte Brüche sind Ausdrücke, die Brüche iterativ beschreiben. Sie können grafisch dargestellt werden:
Oder sie können als Werteliste dargestellt werden: [a0; a1, a2, a3, ... an]
Die Herausforderung:
Nehmen Sie eine Basiszahl: und eine Liste von Nennerwerten: und vereinfachen Sie den fortgesetzten Bruch zu einem vereinfachten rationalen Bruch: Geben Sie Zähler und Nenner getrennt zurück oder drucken Sie sie aus.a0
[a1, a2, a3, ... an]
Beispiele:
√19 : [4;2,1,3,1,2]: 170/39
ℯ: [1;0,1,1,2,1,1]: 19/7
π: [3;7,15,1,292,1]: 104348/33215
ϕ: [1;1,1,1,1,1]: 13/8
Beispielimplementierung: (Python)
def foo(base, sequence):
numerator = 1
denominator = sequence[-1]
for d in sequence[-2::-1]:
temp = denominator
denominator = d * denominator + numerator
numerator = temp
return numerator + base * denominator, denominator
Gewinnen:
kürzester Code in Bytes: --keine eingebauten Elemente, die das gesamte Problem lösen, erlaubt--
code-golf
math
rational-numbers
Aaron
quelle
quelle
2.002
kann ausgedrückt werden als2002/1000
. Das ist technisch gesehen eine "einzelne Fraktion", Sie möchten wahrscheinlich sagen, "eine einzelne Fraktion in ihrer einfachsten Form".Antworten:
J,
85 BytesDas Gleiche wie hier , verwendet jedoch ein eingebautes Rationalisierungsmodul.
Das Argument ist {a0, a1, a2, a3, ...} als Liste von rationalen Zahlen mit erweiterter Genauigkeit. Ergebnis ist der Bruch als J erweiterte rationale Genauigkeitszahl.
(+%)
das plus-das-gegenseitige-von/
Reduktion vorbeiProbieren Sie es online!
-3 dank meilen .
quelle
∘
.Haskell,
373618 BytesDiese Funktion erwartet den
Ratio
Typ von Haskell als Eingabe. Anwendungsbeispiel:Hinweis: Ein expliziter
Ratio
Eintrag in der Eingabeliste (4%1
) reicht aus, das Typensystem erkennt, dass auch die anderenRatio
s sein müssen.Bearbeiten: @Lynn hat ein Byte gespeichert. Vielen Dank!
Edit II: entfernt die
import
(siehe diese Diskussion auf Meta ).quelle
import
. Um es jedoch aufzurufen, müssen Sie es mitRatio
s füttern , das das benötigtimport
. Soll ich dasimport
zur Byteanzahl hinzufügen oder nicht?from fractions import Fraction
Operationen mitFraction
Objekten auszuführen , wird auch die import-Anweisung gezählt.Ratio
angeben, die nur über erstellt werden können%
, was den Import erfordert. Normalerweise zählen wir keine Bytes für den Aufruf von Overhead, nur für die Funktion selbst.GolfScript , 13 Bytes
Probieren Sie es online!
Ja, für die versteckten Gründe von GolfScript . :)
Erläuterung
Der einzige "offizielle" Zahlentyp in GolfScript ist eine Ganzzahl. Der Exponentiationsoperator wandelt das Ergebnis jedoch nicht in eine Ganzzahl um. Praktischerweise ist das native Ergebnis einer Ganzzahl-Exponentiation in Ruby (der Sprache des GolfScript-Interpreters) eine rationale Zahl. So können wir leicht Brüche erhalten, indem wir etwas auf die Potenz von -1 erhöhen. Praktischerweise wollen wir sowieso Gegenseitigkeiten ...
quelle
Mathematica,
2322 BytesIm Wesentlichen ein Port meiner GolfScript-Antwort . Hier sind ein paar alternativen:
Für 24 Bytes können wir eine rekursive Variadic-Funktion schreiben:
Für 21 Bytes können wir sogar einen "variadischen Operator" definieren, aber seine Aufrufkonvention wäre so seltsam, dass ich diesen nicht zählen möchte:
Sie müssten dies mit einer Folge der Eingabewerte aufrufen , z . B.
±Sequence[3, 7, 15, 1, 292, 1]
oder±##&[3, 7, 15, 1, 292, 1]
.Und auch für 21 Bytes gäbe es das (verbotene) eingebaute:
quelle
LabVIEW, 36 äquivalente Bytes
Ziemlich einfache, naive Implementierung unter Verwendung des OP-Algorithmus. Gibt es eine schönere Möglichkeit, dies zu tun?
quelle
Dyalog APL , 10 Bytes
Verwendet nicht einmal ein eingebautes Rationalsystem.
Nimmt {a 0 , a 1 , a 2 , a 3 , ...} als Argument, gibt {Nenner, Zähler} zurück.
1(,÷∨)
1-vorangestellt-geteilt durch die GCD von 1 und+∘÷
plus-das-gegenseitige-von/
Reduktion vorbeiTryAPL online!
quelle
Python 2, 62 Bytes
Es ist leider nicht so golfig (siehe @ xnors Antwort für kürzere), aber es berechnet den Bruch, ohne die Eingabe umkehren zu müssen. Dies verwendet den "Zaubertabellen" -Ansatz für Konvergente - vorausgesetzt, die letzten beiden Fraktionen
a/c
undb/d
die nächste Fraktion sind(n*b+a)/(n*c+d)
.Zum Beispiel für pi:
Wir können sehen , dass
15*22 + 3 = 333
,15*7 + 1 = 106
,1*333 + 22 = 355
,1*106 + 7 = 113
etc.quelle
M, 5 Bytes
Die Eingabe ist eine Liste der Werte
[a0, a1, ..., aN]
und gibt eine rationale Zahl aus.Probieren Sie es online! oder Überprüfen Sie alle Testfälle.
Erläuterung
quelle
Haskell, 30 Bytes
Recursively fügt jede Schicht nach außen gehen, die Aktualisierung
n/d
aufh+(1/(n/d))
, die gleichh+d/n
oder(h*n+d)/n
. Die Fraktion wird als Tupel von gespeichert(num,denom)
. Der anfängliche Bruchteil der(1,0)
Flips, zu0/1
denen0
.quelle
Python, 50 Bytes
Erstellt den fortgesetzten Bruch ab dem Ende der Liste in umgekehrter Reihenfolge und aktualisiert wiederholt den Bruch
n/d
auf dem letzten Elementx
alsn/d -> 1+1/(n/d) == (x*n+d)/n
.quelle
Gemeiner Lisp, 54
Ein etwas wortreiches Fold-Right:
Tests
quelle
Julia (53 Bytes)
Dies ist das erste Mal, dass ich Julia verwende. Wenn ich einen Iterator übersehen hätte, mit dem ich mehr Bytes hätte verlieren können, lassen Sie es mich wissen. Hier ist ein Hinweis für alle, die nicht wissen, welche Sprache sie für diese spezielle Herausforderung wählen sollen: https://en.wikipedia.org/wiki/Rational_data_type
quelle
∘
) anstelle einer Funktion definierenx∘c=(a=0;while x!=[];a=1//(pop!(x)+a);end;a+c;)
x->foldr((x,y)->x+1//y,x)
(wie Haskell-Lösung). Nutzung:(x->foldr((x,y)->x+1//y,x))([4//1,2,1,3,1,2])
Javascript (ES6), 55 Byte
Testfälle
quelle
CJam ,
1816 BytesOnline-Dolmetscher .
quelle
05AB1E ,
1917 BytesErläuterung
Eingabe als Liste von Zahlen
Probieren Sie es online!
quelle
JavaScript (ES6), 44 Byte
quelle
Javascript (ES6), 50 Byte
Es ist Arnauld's Antwort zu verdanken, bevor ich es sah, blieb ich bei 66 Bytes:
Beispiel:
Aufruf:
f([1, 0, 1, 1, 2, 1, 1])
Ausgabe:
Array [ 19, 7 ]
quelle
Perl 6 , 24 Bytes
Erläuterung:
1 / * + *
ist ein Lambda mit zwei Parametern (*
), das den Kehrwert des ersten nimmt und den zweiten addiert. (gibt eine Ratte zurück )R[&(…)]
verwendet das als ob es ein Infix Operator wäre und kehrt es um.(einschließlich der richtigen Assoziation)
[…](@_)
Nimmt das und verwendet es, um die Eingabe zu reduzieren.… .nude
gibt die nu merator und de nominator der Ratte .{ … }
Machen Sie es zu einem Bare-Block-Lambda mit impliziten Parametern@_
.Verwendung:
quelle
Zephyr , 145 Bytes
Zephyr ist die erste Programmiersprache, die ich jemals erstellt habe. Es wurde so konzipiert, dass es intuitiv ist und eine saubere Syntax hat - eher auf Kosten der Kürze. Warum spiele ich damit Golf, fragst du? Denn im Gegensatz zu jeder Sprache, die ich seitdem geschrieben habe, ist ein
Fraction
Typ eingebaut . Sie können sogar den Divisionsoperator verwenden/
als unären Operator für "inverse" verwenden (eine Funktion, die ich für Pip ausgeliehen habe).Jetzt gibt es erhebliche Einschränkungen. Das größte Problem bei dieser Herausforderung besteht darin, dass Arrays mit fester Größe definiert werden müssen. Dies bedeutet, dass das Programm zunächst die Größe des Arrays vom Benutzer liest. (Ich hoffe, das ist in Ordnung; die Alternative ist das Hardcodieren der Größe.) Es gibt auch das kleinere Problem, dass keine Operator-Rangfolge besteht, dh Ausdrücke mit mehreren Operatoren müssen Klammern haben.
Hier ist ein Beispiellauf:
quelle
Ruby, 34 Bytes
Dies führt eine Rechtsfaltung durch (durch Umkehren und anschließende Linksfaltung), wobei jedes Element über die laufende Summe (die Elemente rechts) zu 1 addiert wird. Ruby hat den Rational-Typ, der wirklich nett ist. Und wörtliche Begründungen sind eine Zahl, an die angehängt wird
r
.quelle
Stax , 4 Bytes
Führen Sie es aus und debuggen Sie es
So klein es auch ist, es ist kein eingebautes Gerät. Die eingebauten Rationen helfen allerdings einiges. Entpackt nach ASCII ist das Programm
rksu+
.(a, b) => (a + 1/b)
.quelle
APL (NARS), 15 + 1 Zeichen, 30 + 2 Byte
Übersetzung in Apl (Nars) aus der Adam-J-Lösung ... Die für diese Funktion zulässige Eingabe ist eine Liste mit ganzen Zahlen, wobei das erste Element vom Typ rational ist. Prüfung:
es wären also 15 Zeichen als Länge der Funktion und 1 Zeichen für "x", um den gewünschten Eingabetyp einzugeben und den gewünschten Typ zu beenden ...
quelle