Introdução
Um decimal é finalizado se tiver um número finito de dígitos decimais. Por exemplo, 0,4 (2/5) está sendo finalizado porque possui um dígito decimal.
Um decimal é puramente periódico se tiver um número infinito de dígitos decimais e não tiver dígitos decimais antes de sua repetição (a parte do decimal que se repete.) Por exemplo, 0.142857142857142… (1/7) é puramente periódico porque possui repetição 142857, que começa a se repetir imediatamente após o ponto decimal.
Um decimal é eventualmente periódico se tiver um número infinito de dígitos decimais e tiver um número finito de dígitos decimais antes de sua repetição (a parte do decimal que se repete). Por exemplo, 0,166666666666666… (1/6) é eventualmente periódico porque seu repetir 6 começa a repetir após 1.
Sua tarefa
Escrever um programa ou função que, quando dadas números de p e de q (inteiros, 0 <= p < q <= 100), vai determinar se a representação decimal de p / q é que encerra, puramente periódica, ou, eventualmente, periódica.
Você deve saída a
se de terminação (ou seja, 0,1), b
se é puramente periódica (ou seja, 0,333 ...), ou c
se é Eventualmente periódica (ou seja, 0,166 ...), onde a
, b
e c
existem, cordas constantes distintos de sua escolha.
Casos de teste
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
Você pode encontrar todos os casos de teste aqui .
Você tem permissão para escolher seus próprios 3 valores para a saída, mas deve ficar claro qual é.
Lembre-se de que isso é código-golfe , portanto o código com o menor número de bytes vence.
Dicas
Terminando:
A fatoração primária de um denominador decimal de terminação na forma mais simples consiste apenas em 2s e 5s.
Puramente Periódico:
A fatoração primária de um denominador decimal puramente periódico na forma mais simples não inclui 2s ou 5s.
Eventualmente Periódico:
A fatoração primária de um denominador decimal eventualmente periódico da forma mais simples inclui pelo menos um 2 ou 5, mas também inclui outros números.
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Respostas:
Gelatina , 10 bytes
Aceita denominador e numerador (nessa ordem) como argumentos. Retorna 0 para finalização, 1 para puramente periódico e 2 para eventualmente periódico. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
JavaScript (ES6),
70..6853 bytesRetorna 0 para finalização, verdadeiro para puramente periódico e falso para eventualmente periódico.
Como funciona
O que estamos fazendo aqui é simular uma divisão manualmente:
a?...:0
- Se o numerador for zero, paramos aqui e retornamos0
. A sequência está terminando .(s[a]^=a)?...:x==a
- Se já encontramos esse numerador antes, significa que a sequência é periódica e será repetida para sempre. Paramos aqui e retornamostrue
sea
for igual ao primeiro valorx
da sequência ( puramente periódico ) oufalse
se não for ( eventualmente periódico ).f(a*10%b,b,s,x||a)
- Caso contrário, multiplicamos o numeradora
por 10. Calculamos o restante da divisão pelo denominadorb
. E repetimos o processo usando esse restante como o novo numerador. (Também passamosa
como o primeiro valor da sequência, se ainda não estiver armazenadox
.)Exemplo
fonte
Python,
626159 bytesImprime 1 para eventualmente periódico, 2 para puramente periódico e 4 para finalização.
Verifique todos os casos de teste em repl.it .
fonte
*r
faz?f(1, *(2, 3), 4)
é 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
serve a um propósito muito diferente em JS e em 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)
iria funcionar também.Perl,
494645 bytesInclui +3 para
-p
Baseado na idéia elegante de Dennis , mas implementado de maneira perniciosa
Forneça números de entrada no STDIN
termninating.pl
:Imprime um 2 se terminar. 1 se periódico e nada se eventualmente periódico
fonte
Lote, 247 bytes
Usa meu truque rápido do gcd10 de Fração para o decimal exato . Obviamente, eu poderia salvar um monte de bytes usando um formato de saída personalizado.
fonte
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
para salvar 42 bytes?JavaScript (ES6),
91888579757478 bytesSaídas
NaN
para finalização,1
puramente periódicas eInfinity
eventualmente periódicas.Snippet de teste
Mostrar snippet de código
Explicação
Primeiro, dividimos n e d por gcd (d, n) , para reduzir a fração à sua forma mais simples. Isso nos permite evitar situações como 2/6 em que o resultado seria calculado como puramente periódico. Também definimos a variável t como gcd (d, 10) ; isso será usado mais tarde.
A primeira verificação é se n é 0 ou d é 1 . Se n * (d-1) for 0, retornamos
+f
ou NaN : a fração está terminando .A próxima verificação é se t é 1 . Nesse caso, retornamos 1 : a fração é puramente periódica .
Se t não for 1 , dividimos d por t , executamos toda a função novamente e dividimos por 0. Se n / (d / t) estiver terminando, isso retornará NaN / 0 = NaN : a fração está terminando . Caso contrário, ele retornará 1/0 = Infinito : a fração é eventualmente periódica .
fonte
Infinity
para todos esses valores.n
... Obrigado por apontar isso.Mathematica, 41 bytes
Saída
{3,1,2}
se a entrada tiver uma expansão decimal final,{2,3,1}
se a entrada tiver uma expansão decimal puramente periódica e{3,2,1}
se a entrada tiver uma expansão decimal eventualmente periódica.Baseado no truque furtivo: se
d
é o denominador de uma fração em termos mais baixos, então o maior divisor comum ded
e10^d
igual ad
sed
tem apenas 2s e 5s em sua fatoração primária; é igual a1
sed
não tem 2s nem 5s em sua fatoração primária; e é igual a um número inteiro intermediário sed
tiver 2s / 5s e outros números primos.A
Ordering
função apenas informa onde estão os menores, os menores e os maiores elementos do triplo, com os vínculos quebrados da esquerda para a direita.Falha: retorna a saída variante em
{1,2,3}
vez de{3,1,2}
se a entrada for 0.Mathematica, 46 bytes, perverso
Devoluções
a[[1]]
se a entrada tiver uma expansão decimal final,b[[1]]
se a entrada tiver uma expansão decimal puramente periódica eb[a]
se a entrada tiver uma expansão decimal eventualmente periódica. Lança um erro em todos os casos!Como acima, queremos saber se esse maior divisor comum é igual a 1, d ou em algum ponto intermediário. O logaritmo base-d desse MDC é igual a 0, 1 ou algo no meio.
Agora começamos a torturar o Mathematica.
b[a][[n]]
indica an
parte th da expressãob[a]
. Entãob[a][[1]]
retornaa
;b[a][[0]]
retornosb
; eb[a][[x]]
ondex
há um número entre 0 e 1, faz com que o Mathematica gere o erro "Part :: pkspec1: a expressãox
não pode ser usada como uma especificação de peça". e retornosb[a][[x]]
não avaliados.Isso já distingue os três casos adequadamente, exceto que a saída do caso eventualmente periódico é
b[a][[x]]
, o que não é constante, porquex
é o logaritmo real de algo. Então, aplicamos[[1]]
as saídas já descritas. Por causa de como o Mathematica representa internamenteb[a][[x]]
, o resultadob[a][[x]][[1]]
é simplesb[a]
. Por outro lado, aplicar[[1]]
aa
resultados resulta em um erro diferente "Part :: partd: especificação de peça a [[1]] é maior que a profundidade do objeto". e retorna sem avaliaçãoa[[1]]
(e da mesma forma parab
).Falha: está na entrada 0, retornando em
b[a]
vez dea[[1]]
.fonte
C 173 bytes
Pega dois números inteiros de stdin, imprime 1 para puramente periódico, -1 para eventualmente periódico e 0 para finalização.
Ungolfed:
Meia-golfe:
fonte
Na verdade , 15 bytes
Isto é baseado na resposta de Dennis 'Jelly . 0 está terminando, 1 é puramente periódico e 2 é eventualmente periódico. Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
Mathematica, 44 bytes
Retorna
Null
para rescisão,True
por puramente periódica e,False
eventualmente, periódica.Explicação
Encontre a expansão decimal de N. (dígitos repetidos são cercados por uma cabeça extra
List {}
).Verifique se o último elemento da expansão decimal é a
List
.Se a condição acima for
True
, verifique se a expansão decimal inteira consiste em uma coisa. (AList
conta como uma entidade). (retornaTrue
ouFalse
)(Se a condição for
False
, então aNull
é retornado porque não há terceiro argumento paraIf
)fonte
Pitão ,
3127 bytesEntrada
Você pode tentar aqui . Imprime 1 para eventualmente periódico, 2 para puramente periódico e 0 para finalização. Esta é a minha primeira vez respondendo em codegolf. Todas as sugestões são bem-vindas.
Explicação
Observe que [2,3] filtrou por [2,5] = [2], mas [2,3,5] - [2,5] = [3].
fonte
PARI / GP, 64 bytes
Não produz nada para terminar, 0 para puramente e 1 para eventualmente periódico.
Não é muito chique, eu esperava algo melhor quando comecei.
fonte
05AB1E ,
1611 bytesGuardado 5 bytes graças a @Adnan!
Imprime 0 para Puramente Periódico, 1 para Terminar e 10 para Eventualmente Periódico.
Explicação:
A entrada é tomada como p nova linha q .
Experimente online!
fonte
I
. Além disso, uma constante predefinida para10
éT
. Mesmo para2B
, que éb
:).¿²r/fTrÖbÙJ
como o código final :).PHP, 126 bytes
Imprime 0 para terminado e 1 para 2 puramente periódicos para eventualmente. Deixe-me explicar se um numerador está duas vezes na matriz aqui inicia a sessão periódica se tiver terminado o
echo end($a);
valor é0
Se você não confia em mim, insira$t=count($a)>$d?2:0;
o loopPara tornar mais claro, adicione
print_r($a);
ouvar_dump($a);
oujson_encode($a);
após o loopvocê pode ver um numerador duas vezes ou zero no final da matriz, se um numerador contar duas vezes os itens entre os dois itens e conseguir o comprimento do periódico, além de ver a posição do primeiro numerador em que o periódico começa.
Então, depois disso, podemos encontrar a posição e o comprimento da sequência periódica com
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Visualize o periódico
Saída visualizar o termo periódico
Outra maneira com 130 bytes
Versão expandida
fonte
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]