Wir alle wissen, dass jedes Mal, wenn eine rationale Zahl dezimal geschrieben wird, das Ergebnis entweder terminierend oder (irgendwann) periodisch ist. Wenn zum Beispiel 41/42 dezimal geschrieben wird, ist das Ergebnis
0.9 761904 761904 761904 761904 761904 761904 761904 ...
mit einer anfänglichen Folge von Ziffern, 0.9
gefolgt von der Folge, die 761904
immer und immer wieder wiederholt wird. (Eine bequeme Schreibweise hierfür ist, 0.9(761904)
wenn die Klammern den Ziffernblock umschließen.)
Ihr Ziel bei dieser Herausforderung ist es, eine positive rationale Zahl zu nehmen, die erste Ziffer zu löschen, die Teil der Wiederholungssequenz ist, und die resultierende rationale Zahl zurückzugeben. Wenn wir dies beispielsweise mit 41/42 tun, erhalten wir
0.9 61904 761904 761904 761904 761904 761904 761904 ...
oder 0.9(619047)
kurz: 101/105.
Wenn die rationale Zahl eine endende Dezimalerweiterung wie 1/4 = 0.25
hat, sollte nichts passieren. Sie können sich 1/4 entweder als 0.250000000...
oder als 0.249999999...
vorstellen, aber in beiden Fällen bleibt die Zahl unverändert, wenn Sie die erste Ziffer des sich wiederholenden Teils löschen.
Einzelheiten
- Die Eingabe ist eine positive rationale Zahl, entweder als Paar positiver Ganzzahlen, die Zähler und Nenner darstellen, oder (wenn Ihre Sprache dies zulässt und Sie möchten) als eine Art rationales Zahlenobjekt.
- Die Ausgabe ist auch eine rationale Zahl, auch in jeder Form. Wenn das Ergebnis eine Ganzzahl ist, können Sie die Ganzzahl anstelle einer rationalen Zahl zurückgeben.
- Wenn Sie ein Zahlenpaar als Eingabe verwenden, können Sie davon ausgehen, dass diese relativ prim sind. Wenn Sie ein Zahlenpaar als Ausgabe erzeugen, müssen Sie dafür sorgen, dass sie relativ prim sind.
- Achten Sie darauf, dass Sie die erste Ziffer finden, die einen Wiederholungsblock startet. Zum Beispiel könnte man 41/42 schreiben,
0.97(619047)
aber das macht 2041/2100 (mit der Dezimalerweiterung0.97(190476)
) nicht zu einer gültigen Antwort. - Sie können davon ausgehen , dass Sie in der Eingabe zu erhalten, die erste periodische Ziffer nach dem Komma, so dass
120/11
=10.909090909...
ungültige Eingabe: (seine erste periodische Ziffer könnte die in Betracht gezogen wird0
in10
). Sie können an solchen Eingaben alles tun, was Sie möchten. - Das ist Code-Golf : Die kürzeste Lösung gewinnt.
Testfälle
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
quelle
2017
statt2017/1
?(2017,1)
.)2/4
in der Eingabe passieren?120/11
die richtige Antwort111/11
oder210/11
?111/11
außer dass die derzeit am höchsten bewertete Antwort zurückkommt210/11
. Ich werde Sie also auswählen lassen, um zu vermeiden, dass vorhandene Antworten ungültig werden.Antworten:
Wolfram Language (Mathematica) , 59 Bytes
Probieren Sie es online!
Erläuterung
Suchen Sie die Dezimalstellen der Eingabe.
Wenn es sich wiederholende Ziffern gibt,
RotateLeft
diese. (List@@#
Verhindert, dass der Code versucht, die letzte Dezimalstelle zu drehen, wenn die rationale Zahl endet.)Konvertieren Sie zu rational.
quelle
Jelly ,
36323130 Bytes-1 Byte Danke an Erik den Outgolfer !
Probieren Sie es online!
Sollte stimmen. Gleitkomma-Ungenauigkeit addieren 3 Bytes für
+.Ḟ
.Verlässt sich darauf, dass der Eingang nicht reduzierbar ist.
Erläuterung
Dies setzt voraus:
n/d
in seiner einfachsten Form. Dann gibt der Link, auf denọ2,5Ṁ
angewendet wurded
, die Nummer der nichtperiodischen Ziffer nach dem Radixpunkt an.quelle
Python 2 ,
237235214 Bytes-21 Bytes dank Mr. Xcoder
Probieren Sie es online!
Die Eingabe erfolgt als Tupel
(numerator, denominator)
; output ist einfractions.Fraction
Objekt.Hierbei wird eine Methode mit langer Teilung verwendet, um die Start- und Wiederholungsziffern der Antwort abzurufen. Anschließend wird die erste Wiederholungsziffer an das Ende verschoben und mithilfe der Zeichenfolgenmanipulation
fraction.Fraction
wieder in ein Verhältnis umgewandelt.Ungolfed-Version:
quelle
Python 3 ,
177173169 BytesProbieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
7067 BytesDanke an diesen (jetzt gelöschten) Tipp für -3 Byte!
Probieren Sie es online!
Ein Port meiner Gelee-Antwort . Länger als die existierende Mathematica-Antwort um 8 Bytes ...
Die Funktion nimmt 2 Eingänge auf
[denominator, numerator]
, so dassGCD[denominator, numerator] == 1
.quelle
Perl 6 , 102 Bytes
Versuch es
Nimmt eine Rational- Nummer und gibt eine Rational- oder Int- Nummer zurück.
Erweitert:
Hinweis behandelt Nenner bis
uint64.Range.max
zu größeren Nennern verwendenFatRat(9 x$1.chars)
Try it .quelle