Introducción
Un decimal está terminando si tiene un número finito de dígitos decimales. Por ejemplo, 0.4 (2/5) está terminando porque tiene un dígito decimal.
Un decimal es puramente periódico si tiene un número infinito de dígitos decimales y no tiene dígitos decimales antes de su arrepentimiento (la parte del decimal que se repite). Por ejemplo, 0.142857142857142 ... (1/7) es puramente periódico porque tiene un repetido 142857, que comienza a repetirse inmediatamente después del punto decimal.
Un decimal es eventualmente periódico si tiene un número infinito de dígitos decimales y tiene un número finito de dígitos decimales antes de su arrepentimiento (la parte del decimal que se repite). Por ejemplo, 0.166666666666666 ... (1/6) es eventualmente periódico porque su repetir 6 comienza a repetirse después de un 1.
Tu tarea
Escriba un programa o función que, cuando se le dan los números p y q (enteros, 0 <= p < q <= 100), determinará si la representación decimal de p / q está terminando, es puramente periódica o eventualmente periódica.
Debe de salida a
si se trata de terminación (es decir, 0,1), b
si es puramente periódica (es decir, 0,333 ...), o c
si es el tiempo periódica (es decir, 0,166 ...), donde a
, b
y c
son las cadenas constantes, distintas de su elección.
Casos de prueba
0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic
Puede encontrar todos los casos de prueba aquí .
Se le permite elegir sus propios 3 valores para la salida, pero debe quedar claro cuál es.
Recuerde, este es el código de golf , por lo que gana el código con el menor número de bytes.
Consejos
Terminando:
La factorización prima del denominador de un decimal final en la forma más simple consiste solo en 2s y 5s.
Puramente Periódico:
La factorización prima del denominador de un decimal puramente periódico en la forma más simple no incluye ningún 2s o 5s.
Eventualmente periódico:
La factorización prima de un denominador decimal eventualmente periódico en la forma más simple incluye al menos un 2 o 5, pero también incluye otros números.
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respuestas:
Jalea , 10 bytes
Acepta denominador y numerador (en ese orden) como argumentos. Devuelve 0 para terminar, 1 para puramente periódico y 2 para eventualmente periódico. Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
JavaScript (ES6),
70..6853 bytesDevuelve 0 para terminar, verdadero para puramente periódico y falso para eventualmente periódico.
Cómo funciona
Lo que estamos haciendo aquí es simular una división a mano:
a?...:0
- Si el numerador es cero, nos detenemos aquí y regresamos0
. La secuencia está terminando .(s[a]^=a)?...:x==a
- Si ya hemos encontrado este numerador antes, significa que la secuencia es periódica y se repetirá para siempre. Nos detenemos aquí y devolvemostrue
sia
es igual al primer valorx
de la secuencia ( puramente periódico ) ofalse
si no lo es ( eventualmente periódico ).f(a*10%b,b,s,x||a)
- De lo contrario, multiplicamos el numeradora
por 10. Calculamos el resto de la división por el denominadorb
. Y repetimos el proceso usando este resto como el nuevo numerador. (También pasamosa
como primer valor de la secuencia si aún no está almacenadax
).Ejemplo
fuente
Python,
626159 bytesImprime 1 para eventualmente periódico, 2 para puramente periódico y 4 para terminar.
Verificar todos los casos de prueba en repl.it .
fuente
*r
hacer?f(1, *(2, 3), 4)
es equivalente af(1, 2, 3, 4)
.f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
in
tiene un propósito muy diferente en JS que en Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)
que también funcionaría.Perl,
494645 bytesIncluye +3 para
-p
Basado en la elegante idea de Dennis , pero implementado de manera perniciosa
Dar números de entrada en STDIN
termninating.pl
:Imprime un 2 si termina. 1 si es periódico y nada si eventualmente es periódico
fuente
Lote, 247 bytes
Utiliza mi truco rápido gcd10 de Fracción a decimal exacto . Obviamente, podría guardar un montón de bytes utilizando un formato de salida personalizado.
fuente
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
para guardar 42 bytes?JavaScript (ES6),
91888579757478 bytesSalidas
NaN
para terminación,1
puramente periódicas yInfinity
eventualmente periódicas.Fragmento de prueba
Mostrar fragmento de código
Explicación
En primer lugar, dividimos ambos n y d por gcd (d, n) , para reducir la fracción a su forma más simple. Esto nos permite evitar situaciones como 2/6 donde el resultado se calcularía como puramente periódico. También definimos la variable t como mcd (d, 10) ; esto se usará más tarde.
La primera comprobación es si n es 0 o d es 1 . Si n * (d-1) es 0, retornamos
+f
o NaN : la fracción está terminando .La siguiente comprobación es si t es 1 . Si es así, devolvemos 1 : la fracción es puramente periódica .
Si t no es 1 , dividimos d entre t , ejecutamos toda la función nuevamente y dividimos entre 0. Si n / (d / t) está terminando, esto devuelve NaN / 0 = NaN : la fracción está terminando . De lo contrario, devuelve 1/0 = Infinito : la fracción es eventualmente periódica .
fuente
Infinity
para todos esos valores.n
... Gracias por señalarlo.Mathematica, 41 bytes
Emite
{3,1,2}
si la entrada tiene una expansión decimal final,{2,3,1}
si la entrada tiene una expansión decimal puramente periódica y{3,2,1}
si la entrada tiene una expansión decimal periódica eventual.Basado en el truco disimulado: si
d
es el denominador de una fracción en los términos más bajos, entonces el máximo común divisord
e10^d
iguald
sid
tiene solo 2s y 5s en su factorización prima; es igual1
sid
no tiene ni 2 ni 5 en su factorización prima; e iguala algún número entero entre sid
tiene 2s / 5s y otros primos.La
Ordering
función solo informa dónde están los elementos más pequeños, siguientes más pequeños y más grandes del triple, con lazos rotos de izquierda a derecha.Defecto: devuelve la salida variante en
{1,2,3}
lugar de{3,1,2}
si la entrada es 0.Mathematica, 46 bytes, perverso
Devuelve
a[[1]]
si la entrada tiene una expansión decimal final,b[[1]]
si la entrada tiene una expansión decimal puramente periódica yb[a]
si la entrada tiene una expansión decimal eventualmente periódica. Lanza un error en todos los casos!Como arriba, queremos saber si ese máximo divisor común es igual a 1, d, o en algún punto intermedio. El logaritmo base-d de ese mcd es igual a 0, 1 o algo intermedio.
Ahora comenzamos a torturar a Mathematica.
b[a][[n]]
denota lan
parte th de la expresiónb[a]
. Entoncesb[a][[1]]
vuelvea
;b[a][[0]]
retornosb
; yb[a][[x]]
, dondex
hay un número entre 0 y 1, hace que Mathematica arroje el error "Parte :: pkspec1: La expresiónx
no puede usarse como una especificación de parte". y vuelve sinb[a][[x]]
evaluar.Esto ya distingue los tres casos de manera apropiada, excepto que la salida para el caso eventualmente periódico
b[a][[x]]
es no constante porquex
es el logaritmo real de algo. Entonces aplicamos[[1]]
a las salidas ya descritas. Debido a cómo Mathematica representa internamenteb[a][[x]]
, el resultado deb[a][[x]][[1]]
es simplementeb[a]
. Por otro lado, aplicar[[1]]
a losa
resultados un error diferente "Parte :: partd: Especificación de parte a [[1]] es más larga que la profundidad del objeto". y devuelve sina[[1]]
evaluar (y de manera similar parab
).Defecto: mentiras sobre la entrada 0, que regresan
b[a]
en lugar dea[[1]]
.fuente
C 173 Bytes
Toma dos enteros de stdin, imprime 1 para puramente periódico, -1 para eventualmente periódico y 0 para terminar.
Sin golf:
Medio golf:
fuente
En realidad , 15 bytes
Esto se basa en la respuesta de Dennis 'Jelly . 0 está terminando, 1 es puramente periódico y 2 eventualmente es periódico. Sugerencias de golf bienvenidas. Pruébalo en línea!
Ungolfing
fuente
Mathematica, 44 bytes
Devoluciones
Null
por terminación,True
por puramente periódicas, yFalse
eventualmente periódicas.Explicación
Encuentre la expansión decimal de N. (los dígitos repetidos están rodeados por una cabeza adicional
List {}
).Compruebe si el último elemento de la expansión decimal es a
List
.Si la condición anterior es
True
, verifique si toda la expansión decimal consiste en una cosa. (AList
cuenta como una entidad). (vuelveTrue
oFalse
)(Si la condición es
False
, entoncesNull
se devuelve a porque no hay un tercer argumento paraIf
)fuente
Pyth ,
3127 bytesEntrada
Puedes probarlo aquí . Imprime 1 para eventualmente periódico, 2 para puramente periódico y 0 para terminar. Esta es la primera vez que respondo en codegolf. Cualquier sugerencia es bienvenida.
Explicación
Tenga en cuenta que [2,3] filtrado por [2,5] = [2] pero [2,3,5] - [2,5] = [3].
fuente
PARI / GP, 64 bytes
No genera nada para terminar, 0 para puramente y 1 para eventualmente periódico.
No muy elegante, esperaba algo mejor cuando comencé.
fuente
05AB1E ,
1611 bytes¡Guardado 5 bytes gracias a @Adnan!
Imprime 0 para puramente periódico, 1 para terminar y 10 para eventualmente periódico.
Explicación:
La entrada se toma como p nueva línea q .
Pruébalo en línea!
fuente
I
. Además, una constante predefinida para10
esT
. Lo mismo para2B
, que esb
:).¿²r/fTrÖbÙJ
como el código final :).PHP, 126 bytes
Imprime 0 para terminado y 1 para puramente periódico 2 para eventualmente. Permítanme explicar si un numerador está dos veces en la matriz, aquí comienza la sesión periódica si se termina, el
echo end($a);
valor es0
Si no confía en mí, ponga$t=count($a)>$d?2:0;
en el buclePara que quede más claro por favor agregue
print_r($a);
ovar_dump($a);
ojson_encode($a);
después del buclepuede ver un numerador dos veces o un cero al final de la matriz si un numerador cuenta dos veces los elementos entre los dos elementos y puede obtener la longitud del periódico y puede ver la posición del primer numerador donde comienza el periódico
Entonces, después de eso, podemos encontrar la posición y la longitud de la secuencia periódica con
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Visualiza el periódico
La salida visualiza el término periódico
Otra forma con 130 Bytes
Versión ampliada
fuente
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]