Todos sabemos que cada vez que se escribe un número racional en decimal, el resultado termina o es (eventualmente) periódico. Por ejemplo, cuando 41/42 se escribe en decimal, el resultado es
0.9 761904 761904 761904 761904 761904 761904 761904 ...
con una secuencia inicial de dígitos 0.9
seguida por la secuencia 761904
repetida una y otra vez. (Una notación conveniente para esto es 0.9(761904)
donde los paréntesis rodean el bloque de dígitos repetidos).
Su objetivo en este desafío es tomar un número racional positivo, eliminar el primer dígito que forma parte de la secuencia repetitiva y devolver el número racional resultante. Por ejemplo, si hacemos esto a 41/42, obtenemos
0.9 61904 761904 761904 761904 761904 761904 761904 ...
o 0.9(619047)
para abreviar, que es 101/105.
Si el número racional tiene una expansión decimal final, como 1/4 = lo 0.25
hace, no debería pasar nada. Puede pensar en 1/4 como 0.250000000...
o como, 0.249999999...
pero en cualquier caso, eliminar el primer dígito de la parte que se repite deja el número sin cambios.
Detalles
- La entrada es un número racional positivo, ya sea como un par de enteros positivos que representan el numerador y el denominador, o (si su lenguaje de elección lo permite y desea) como algún tipo de objeto de número racional.
- La salida también es un número racional, también en cualquier forma. Si el resultado es un entero, puede devolver el entero en lugar de un número racional.
- Si toma un par de números como entrada, puede suponer que son relativamente primos; si produce un par de números como salida, debe hacer que sean relativamente primos.
- Tenga cuidado de encontrar el primer dígito que comienza un bloque repetitivo. Por ejemplo, uno podría escribir 41/42 como
0.97(619047)
pero eso no hace que 2041/2100 (con la expansión decimal0.97(190476)
) sea una respuesta válida. - Puede suponer que en la entrada que obtiene, el primer dígito periódico va después del punto decimal, haciendo
120/11
=10.909090909...
entrada no válida: (su primer dígito periódico podría considerarse el0
in10
). Puede hacer lo que quiera en dicha entrada. - Este es el código de golf : la solución más corta gana.
Casos de prueba
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
fuente
2017
lugar de2017/1
?(2017,1)
.)2/4
suceder en la entrada?120/11
la respuesta correcta111/11
o210/11
?111/11
que la respuesta más altamente votada en este momento regresa210/11
, así que te dejaré elegir para evitar invalidar las respuestas existentes.Respuestas:
Wolfram Language (Mathematica) , 59 bytes
Pruébalo en línea!
Explicación
Encuentra los dígitos decimales de la entrada.
Si hay dígitos repetidos,
RotateLeft
ellos. (List@@#
evita que el código intente rotar el último dígito decimal si el número racional está terminando).Convierte a racional.
fuente
Gelatina ,
36323130 bytes-1 byte gracias a Erik the Outgolfer !
Pruébalo en línea!
Debe ser correcto La imprecisión de coma flotante agrega 3 bytes para
+.Ḟ
.Se basa en que la entrada sea irreducible.
Explicación
Esto se basa en:
n/d
en su forma más simple. Luego, el enlaceọ2,5Ṁ
aplicadod
dará el número de dígitos no periódicos después del punto de la raíz.fuente
Python 2 ,
237235214 bytes-21 bytes gracias al Sr. Xcoder
Pruébalo en línea!
La entrada se realiza como una tupla
(numerator, denominator)
; La salida es unfractions.Fraction
objeto.Esto usa un método de estilo de división larga para obtener los dígitos iniciales y repetitivos de la respuesta, luego mueve el primer dígito repetitivo al final y usa la manipulación de cadenas y la
fraction.Fraction
convierte nuevamente a una proporción.Versión sin golf:
fuente
Python 3 ,
177173169 bytesPruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
7067 bytes¡Gracias a este consejo (ahora eliminado) por -3 byte!
Pruébalo en línea!
Un puerto de mi respuesta Jelly . Más largo que la respuesta existente de Mathematica en 8 bytes ...
La función toma 2 entradas
[denominator, numerator]
, de modo queGCD[denominator, numerator] == 1
.fuente
Perl 6 , 102 bytes
Intentalo
Toma un número racional y devuelve un número racional o int .
Expandido:
Note manejará denominadores hasta
uint64.Range.max
para manejar denominadores más grandes .FatRat(9 x$1.chars)
Pruébalo .fuente