En la representación decimal de cada número racional p/q, tiene una cola periódica, una cabeza no periódica y una sección antes del punto decimal en el siguiente formato:
(before decimal point).(non-periodic)(periodic)
Algunos ejemplos incluyen:
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)
El desafío es intercambiar las partes periódicas y no periódicas, dejando las before decimal pointsolas, para crear un nuevo número. Por ejemplo:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Si un número no tiene una parte periódica como 0.25convertir ese número en un nuevo número periódico, y 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
El reto
- Tome una fracción
xcomo entrada, como una cadena, dos entradas, un número racional o cualquier método que se adapte a su idioma. - Cambie las partes periódicas y no periódicas de la representación decimal de
xpara crear un nuevo número, dejando solo la parte anterior al decimal. La parte periódica siempre comienza lo antes posible para que la parte no periódica sea lo más corta posible. Los ejemplos están abajo. - Devuelve el número intercambiado como una nueva fracción. La entrada no se reduce necesariamente aunque la salida debería serlo. El formato de entrada puede diferir del formato de salida.
- El numerador
pdexserá un número entero con un valor absoluto de un millón o menos y el denominadorqdexserá un número entero distinto de cero con un valor absoluto de un millón o menos. - No se garantiza que el numerador
ry el denominadorsdel resultado sea inferior a un millón. Dada la longitud de las partes periódicas de estos números, se recomienda evitar la conversión directa a flotantes. - Este es el código de golf. La respuesta más corta en bytes gana.
Ejemplos
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/7podría ser representado como (0).()(142857) o (0).(1)(428571), 1podría ser representado como (1).()(), (0).()(9), (0).()(99), (0).(9)(9), etc.
0al final del caso de prueba 2 (10/7):1428571/100000debería ser1428571/1000000.