In der Dezimaldarstellung jeder rationalen Zahl p/q
haben Sie ein periodisches Ende, einen nichtperiodischen Kopf und einen Abschnitt vor dem Dezimalpunkt im folgenden Format:
(before decimal point).(non-periodic)(periodic)
Einige Beispiele sind:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
Die Herausforderung besteht darin, die periodischen und nichtperiodischen Teile auszutauschen und dabei die before decimal point
Ruhe zu lassen, um eine neue Nummer zu erstellen. Beispielsweise:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Wenn eine Zahl keinen periodischen Teil wie hat, 0.25
verwandle diese Zahl in eine neue periodische Zahl und umgekehrt.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
Die Herausforderung
- Nehmen Sie einen Bruch
x
als Eingabe, eine Zeichenfolge, zwei Eingaben, eine rationale Zahl oder eine andere Methode, die zu Ihrer Sprache passt. - Tauschen Sie den periodischen und den nichtperiodischen Teil der Dezimaldarstellung aus
x
, um eine neue Zahl zu erstellen, und lassen Sie den Teil vor der Dezimalstelle allein. Der periodische Teil beginnt immer so schnell wie möglich, damit der nichtperiodische Teil so kurz wie möglich ist. Beispiele sind unten. - Geben Sie die getauschte Nummer als neuen Bruch zurück. Die Eingabe wird nicht unbedingt reduziert, obwohl die Ausgabe sein sollte. Das Eingabeformat darf vom Ausgabeformat abweichen.
- Der Zähler
p
vonx
ist eine ganze Zahl mit einem absoluten Wert von einer Million oder weniger und der Nennerq
vonx
ist eine ganze Zahl ungleich Null mit einem absoluten Wert von einer Million oder weniger. - Der Zähler
r
und Nenners
des Ergebnisses beträgt garantiert nicht weniger als eine Million. Angesichts der Länge der periodischen Teile dieser Zahlen wird empfohlen, keine direkte Konvertierung in Gleitkommazahlen vorzunehmen. - Das ist Code Golf. Kürzeste Antwort in Bytes gewinnt.
Beispiele
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
quelle
quelle
0
Ende von Testfall 2 (10/7
) fehlt :1428571/100000
sollte sein1428571/1000000
.1/7
könnte wie folgt dargestellt werden(0).()(142857)
oder(0).(1)(428571)
,1
kann dargestellt werden(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
etc.Antworten:
Python 2, 292 Bytes
Ungolfed-Version, funktioniert sowohl in Python 2 als auch in Python 3. Druckt auch die Dezimaldarstellung.
quelle
d=10**len(p+a)
if n==0: p=''
, die Verwendung``
in jedem Ort , den Sie verwendenstr
, wie zum Beispiel`n/d`
stattstr(n/d)
, und Umbenennungslen
zuL
mitL=len;
am Anfang der Funktion.n=int(b+p+a);d=10**L(p+a)
undimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Außerdem erhalte ich 295 Bytes für Ihre aktuelle Bearbeitung. Gibt es einen zusätzlichen Zeilenumbruch, den Sie nicht auslassen dürfen?Jelly ,
1021018987838179787774 BytesEs hat viel zu lange gedauert, um es zu schreiben, viel zu lange, um es zu debuggen, und es erfordert definitiv viel Golf (
acht, sieben, sechs,fünf,vier Glieder, heilige Kuh), aber es ist nach meinem besten Wissen korrekt. Vielen, vielen Dank an Dennis für seine Hilfe, insbesondere bei den ersten beiden Links. Vielen Dank auch an Rainer P., der mir letztendlich einen Großteil des Algorithmus in seine Python-Antwort geliehen hat.Golf Änderungen: -1 Byte dank Xanderhall. Fehlerkorrektur, da nicht das richtige logische NOT eingebaut wurde. -13 Bytes vom Golfen der Zählerverbindungen. +1 Byte vom Beheben eines Fehlers für Negative
d
dank Dennis. Die Links wurden neu strukturiert, sodass die Zählergenerierung in einem Link enthalten ist. -2 Bytes aus der Kombination der zweiten und dritten Verbindung. -4 Bytes von dem Verschieben einiger gemeinsamer Elemente der dritten und vierten Verbindung zu der zweiten Verbindung und der Hauptverbindung. -2 Bytes beim Entfernen einiger überflüssiger Kettenoperatoren. -2 Bytes von der Neuordnung der Zähler-Verbindung. -1 Byte vom VerschiebenḢ€
zum Ende der zweiten Verbindung. Ein Fehler im Hauptlink wurde behoben. -1 Byte vom ÄndernṪ ... ,Ḣ
zuḢ ... ṭ
. -3 Bytes vom Verschieben des Zählerlinks in den Hauptlink.Golfvorschläge willkommen! Probieren Sie es online!
Erläuterung
Zuerst erkläre ich den Hauptlink , der die anderen Links aufruft.
Dann der erste Link , der die Ziffern erhält.
Jetzt das zweite Glied , das die periodischen und nichtperiodischen Teile von
n/d
und eine Menge anderer schwerer Lasten abruft.Das dritte Glied , das unseren neuen Nenner ergibt.
quelle