Ihre Aufgabe ist gegeben x
, Ausgabe 2*x
. Einfach richtig!? Aber es gibt einen Haken: x
Wird als (möglicherweise unendlicher) fortgesetzter Bruch angegeben , und die Ausgabe muss ein fortgesetzter Bruch sein. Die Eingabe ist garantiert eine echte algebraische Zahl, deren Grad höchstens 2 beträgt.
Eingabe : Der fortgesetzte Bruchteil von x
. Dies ist in drei Teile unterteilt: den ganzzahligen Teil, das Präfix und den sich wiederholenden Teil. Der ganzzahlige Teil besteht aus einer einzelnen ganzen Zahl. Das Präfix und der Wiederholungsteil sind (möglicherweise leere) Arrays positiver Ganzzahlen, die das Präfix und den Wiederholungsteil des fortgesetzten Bruchs beschreiben. Beispielsweise (3, [1], [2, 4])
repräsentiert die Eingabe den fortgesetzten Bruch [3; 1, 2, 4, 2, 4, ...]
.
Wenn der Wiederholungsteil leer ist, gibt dies eine rationale Zahl an. Zum Beispiel (3, [1, 2], [])
repräsentiert [3; 1, 2] = 11/3
. Sie müssen beide Formen einer rationalen Zahl akzeptieren (dh (3, [1, 1, 1], [])
die muss [3; 1, 1, 1] = 11/3
auch eine gültige Eingabe sein).
Ausgabe : Gibt den fortgesetzten Bruchteil der doppelten Eingabe im gleichen Format wie die Eingabe aus. Wenn die Ausgabe rational ist, können Sie jede Form des fortgesetzten Bruchs ausgeben. Solange die Antwort der richtigen entspricht, ist sie in Ordnung. es ist keine "Komprimierung" erforderlich, so dass der unendliche Teil möglicherweise ein wenig "abgerollt" wird (z. B. [1; 4, 2, 3, 2, 3...]
geschrieben (1, [4], [2, 3])
oder (1, [4, 2, 3], [2, 3])
). Alle Antworten müssen exakt sein.
Testfälle : Der Einfachheit halber wird die genaue Formularspalte angegeben.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
Und schließlich ein etwas größerer Testfall Präzision zu gewährleisten: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
.
Kürzester Code gewinnt!
Tipp : Sie können mit fortlaufenden Brüchen, wie hier beschrieben, auf einfache Weise rechnen . Das Verdoppeln eines fortgesetzten Bruchs ist nur ein Sonderfall dieses Algorithmus (obwohl es schwierig sein kann, herauszufinden, wann sich der fortgesetzte Bruch wiederholt).
quelle
Sqrt[2]
.[3; 1, 1, 1]
würde(3, [1, 1, 1], [])
in dem Eingabeformat sein, das wir verwenden - daher sollte die Frage es wahrscheinlich in diesem Format erwähnen (im dritten Absatz), nur um Klarheit zu gewährleisten.(-2, [1, 5, 2], [6, 2])
eine akzeptable Ausgabe für die Eingabe(-1, [2], [2, 1])
? Wie wäre es(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?Antworten:
Wolfram-Sprache (Mathematica) , 44 Byte
Probieren Sie es online!
Mathematica hat eine eingebaute! Yay! Die eingebaute Mathematica ist super lang. Aww.
Die fortgesetzten Brüche von Mathematica sehen aus wie
{integer, ...prefix, {...repeating}}
-1 dank JungHwan Min
quelle
*
das Standardtrennzeichen von Mathematica weglassen , wenn es keines gibtTimes
.JavaScript (ES6), 267 Byte
Akzeptiert 3 Argumente (n = ganzzahliger Teil, f = Präfix, r = sich wiederholender Teil). Gibt die drei Teile in einem Array aus.Probieren Sie es online!
Erläuterung
Es ist eine ziemlich direkte Implementierung des Algorithmus zum Berechnen der fortgesetzten Brucharithmetik, die in der Herausforderung hier verknüpft ist . Wiederholende Terme werden behandelt, indem Zwischenmatrizen in einer Nachschlagetabelle gespeichert werden, auf ein Duplikat gewartet wird und die Terme bis zum nächsten Auftreten dieses Duplikats ausgegeben werden. Es ist unelegant und verdoppelt fast die Bytes, die benötigt werden, um fortgesetzte Brüche zu verarbeiten, aber ich könnte mir keine bessere Alternative vorstellen.
Der führende Term wird separat berechnet, um sicherzustellen, dass negative fortgesetzte Brüche positive Werte für alle Terms behalten, mit Ausnahme des ersten.
Um Fehlalarme beim Warten auf einen wiederholten Zyklus zu vermeiden, werden die Daten in der Nachschlagetabelle wie folgt gespeichert:
<index of input repeating part><delimiter><matrix values>
.Beachten Sie, dass die Golf-Version verwendet
eval
, um 1 Byte zu sparen.quelle