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 pointsolo, 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.25trasformare 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
xcome 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
xper 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
pdixsarà un numero intero con un valore assoluto di un milione o meno e il denominatoreqdixsarà un numero intero diverso da zero con un valore assoluto di un milione o meno. - Non è garantito che il numeratore
re il denominatoresdel 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/7potrebbe essere rappresentato come (0).()(142857) o (0).(1)(428571), 1potrebbe essere rappresentato come (1).()(), (0).()(9), (0).()(99), (0).(9)(9), ecc
0Alla fine del test case 2 (10/7) manca :1428571/100000dovrebbe essere1428571/1000000.