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 point
solas, 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.25
convertir 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
x
como 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
x
para 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
p
dex
será un número entero con un valor absoluto de un millón o menos y el denominadorq
dex
será un número entero distinto de cero con un valor absoluto de un millón o menos. - No se garantiza que el numerador
r
y el denominadors
del 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
code-golf
math
number
rational-numbers
Sherlock9
fuente
fuente
0
al final del caso de prueba 2 (10/7
):1428571/100000
debería ser1428571/1000000
.1/7
podría ser representado como(0).()(142857)
o(0).(1)(428571)
,1
podría ser representado como(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
, etc.Respuestas:
Python 2, 292 bytes
Versión sin golf, funciona tanto en python 2 como en 3. También imprime la representación decimal.
fuente
d=10**len(p+a)
if n==0: p=''
, su uso``
en todos los lugares se utilizastr
, por ejemplo`n/d`
en lugar destr(n/d)
y de cambio de nombrelen
aL
laL=len;
al comienzo de la función.n=int(b+p+a);d=10**L(p+a)
y coma: yimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Además, obtengo 295 bytes para su edición actual. ¿Hay una nueva línea adicional que te olvides de dejar?Jalea ,
1021018987838179787774 bytesEsto tomó mucho tiempo para escribir, demasiado tiempo para depurar, y definitivamente necesita mucho golf (
ocho siete seiscincocuatro enlaces, vaca sagrada), pero es, a mi leal saber y entender, correcto. Muchas, muchas gracias a Dennis por su ayuda aquí, especialmente con los dos primeros enlaces. Muchas gracias a Rainer P. también, ya que terminé tomando prestado mucho del algoritmo en su respuesta de Python.Ediciones de golf: -1 byte gracias a Xanderhall. Corrección de errores por no usar la lógica NO correcta incorporada. -13 bytes de golfing los enlaces del numerador. +1 byte por arreglar un error negativo
d
con gracias a Dennis. Reestructurado los enlaces para que la generación del numerador sea todo en un enlace. -2 bytes de la combinación del segundo y tercer enlace. -4 bytes de mover algunos elementos comunes de los enlaces tercero y cuarto al segundo enlace y al enlace principal. -2 bytes de eliminar algunos operadores de cadena superfluos. -2 bytes de reorganizar el enlace del numerador. -1 byte desde el movimientoḢ€
hasta el final del segundo enlace. Se corrigió un error en el enlace principal. -1 byte de cambiarṪ ... ,Ḣ
aḢ ... ṭ
. -3 bytes de mover el enlace del numerador al enlace principal.Sugerencias de golf bienvenidas! Pruébalo en línea!
Explicación
Primero, explicaré el enlace principal , que llama a los otros enlaces.
Luego, el primer enlace que obtiene los dígitos.
Ahora, el segundo enlace que obtiene las partes periódicas y no periódicas
n/d
, y muchos otros trabajos pesados.El tercer enlace , que produce nuestro nuevo denominador.
fuente