Nella rappresentazione decimale di ogni numero razionale p/q
, hai una coda periodica, una testa non periodica e una sezione prima del punto decimale nel seguente formato:
(before decimal point).(non-periodic)(periodic)
Alcuni esempi includono:
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)
La sfida è scambiare le parti periodiche e non periodiche, lasciando il before decimal point
solo, per creare un nuovo numero. Per esempio:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Se un numero non ha parti periodiche come 0.25
trasformare quel numero in un nuovo numero periodico e viceversa.
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
La sfida
- Prendi una frazione
x
come input, come una stringa, due input, un numero razionale o qualunque metodo si adatti alla tua lingua. - Scambia le parti periodiche e non periodiche della rappresentazione decimale
x
per creare un nuovo numero, lasciando la parte prima del solo decimale. La parte periodica inizia sempre il più presto possibile in modo che la parte non periodica sia il più breve possibile. Gli esempi sono di seguito. - Restituisce il numero scambiato come nuova frazione. L'input non è necessariamente ridotto, sebbene dovrebbe essere l'output. Il formato di input può differire dal formato di output.
- Il numeratore
p
dix
sarà un numero intero con un valore assoluto di un milione o meno e il denominatoreq
dix
sarà un numero intero diverso da zero con un valore assoluto di un milione o meno. - Non è garantito che il numeratore
r
e il denominatores
del risultato siano inferiori a un milione. Data la lunghezza delle parti periodiche di questi numeri, si consiglia di evitare la conversione diretta in float. - Questo è il codice golf. Vince la risposta più breve in byte.
Esempi
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
1/7
potrebbe essere rappresentato come (0).()(142857)
o (0).(1)(428571)
, 1
potrebbe essere rappresentato come (1).()()
, (0).()(9)
, (0).()(99)
, (0).(9)(9)
, ecc
0
Alla fine del test case 2 (10/7
) manca :1428571/100000
dovrebbe essere1428571/1000000
.