Descrição do Desafio
Vamos pegar um número inteiro positivo n
, reverter seus dígitos para obter rev(n)
e obter o valor absoluto da diferença desses dois números: |n - rev(n)|
(ou abs(n - rev(n))
).
Exemplo:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Depois de repetir essa operação várias vezes, a maioria dos números se tornará 0
(terminando assim o loop) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... embora alguns números (como 1584
) fiquem presos em um loop infinito:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Seu trabalho é determinar se um número inteiro fica preso em um loop infinito.
Descrição da entrada
Um número inteiro positivo.
Descrição da saída
Um valor verdadeiro ( True
, 1
) se o número ficar preso em um loop infinito, um valor falso ( False
, 0
) caso contrário.
Notas
- Zeros à direita devem ser omitidos. ie
rev(5020) = 205
. - Lembre-se de que isso é código-golfe , portanto, faça seu código o mais curto possível!
- Sequência relevante: A072140
code-golf
number-theory
shooqie
fonte
fonte
Respostas:
Pitão, 5 bytes
4 bytes graças a FryAmTheEggman
Suíte de teste.
O valor de verdade é um dos números no loop.
O valor de falsey é
0
.Explicação
fonte
Mathematica,
3937 bytesSimplesmente aplica os
n
tempos de transformação de reversão / subtração à entradan
e verifica se o resultado é0
. Nunca é possível10n
executar mais do que etapas para alcançar um loop, porque a transformação não pode aumentar o número de dígitos e há menos do que10n
números com não mais do que dígitosn
. Veja a prova de Dennis para saber como reduzir esse limiten
.fonte
Gelatina ,
65 bytesExperimente online!
fundo
Isso usa o limite superior de 10n iterações do @ MartinEnder e as seguintes observações.
Existem 9 × 10 k - 1 inteiros positivos n com k dígitos.
A diferença de um número e seu reverso é sempre um múltiplo de 9 , portanto, apenas 10 k - 1 deles podem ocorrer após a primeira iteração.
Dos múltiplos, mais de 1/10 perderá um dígito na próxima iteração (para iniciantes, tudo o que começa e termina com os mesmos dígitos, e aproximadamente o dobro se o primeiro dígito não é 1 nem 9 ), então são necessários no máximo 9 × 10 k - 2 para inserir um loop ou perder um dígito.
Aplicando o mesmo raciocínio ao número inteiro resultante de k - 1 dígitos e assim por diante, são necessárias no máximo 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iterações para inserir um loop ou alcance 0 .
Como funciona
fonte
Oracle SQL 11.2, 136 bytes
Sem golfe
fonte
APL, 26 caracteres
Usamos o argumento esquerdo como acumulador dos valores que já vimos. Nós o inicializamos para "0", que é uma das duas condições de terminação. O guarda
⍵∊⍺:×⍵
é lido: "o argumento certo é algo que já vimos (e inclui o zero)? Nesse caso, retorne o sinal do número, que é 1 ou 0". Caso contrário, vamos recuar chamando a nós mesmos com o valor absoluto da subtração depois de ter catenado o valor atual para o argumento esquerdo.Uma reformulação da solução Mathematica de Martin Ender teria um clock de 21 caracteres :
Lê: "qual é o sinal do resultado após a aplicação das 10n vezes desejadas"?
fonte
Python 2, 50 bytes
Teste em Ideone .
fundo
Isso usa o limite superior de 10n iterações do @ MartinEnder e as seguintes observações.
Existem 9 × 10 k - 1 inteiros positivos n com k dígitos.
A diferença de um número e seu reverso é sempre um múltiplo de 9 , portanto, apenas 10 k - 1 deles podem ocorrer após a primeira iteração.
Dos múltiplos, mais de 1/10 perderá um dígito na próxima iteração (para iniciantes, tudo o que começa e termina com os mesmos dígitos, e aproximadamente o dobro se o primeiro dígito não é 1 nem 9 ), então são necessários no máximo 9 × 10 k - 2 para inserir um loop ou perder um dígito.
Aplicando o mesmo raciocínio ao número inteiro resultante de k - 1 dígitos e assim por diante, são necessárias no máximo 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n iterações para inserir um loop ou alcance 0 .
fonte
CJam,
1513 bytesTeste aqui.
O mesmo que minha resposta do Mathematica.
fonte
Python,
12912096 bytesSe uma exceção for capturada (normalmente a única exceção que pode ser lançada com essa função é um RuntimeError, devido à recursão infinita), imprima 1. Caso contrário, imprima o resultado, 0.
Obrigado a @LeakyNun
Obrigado a @shooqie
fonte
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
. Além disso, o nome do curta método de algo (comor
em vez derev
)Python,
10198 bytesAlgoritmo de tartaruga e lebre.
Verdade é qualquer valor em loop, é Falsey
0
.Ideone it!
fonte
Python 2,
858483 bytesOutra resposta Python. Ele adiciona n a uma lista para cada iteração e, se n já estiver na lista, ele gera
False
. Caso contrário, ele funcionará até 0.Obrigado @NonlinearFruit por um byte.
fonte
print n<1
obras (uma vez quen
é sempre não-negativo) e ele salva um bytedef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
salva 5 bytes05AB1E,
1186 bytesExplicado
O valor de verdade é um número do loop.
O valor da falsidade é 0.
Experimente online
Usa o limite superior explicado na resposta de Dennis 'Jelly
Guardado 2 bytes graças a @Adnan
Na versão 7.9 de 05AB1E, as seguintes soluções de 5 bytes funcionam conforme observado por @Adnan
fonte
DFÂ-Ä
funciona na versão 7.9, mas não na versão atual. Na versão atual, você precisa convertê-lo para um int primeiro (como esteDFÂï-Ä
), mas pode usar a versão 7.9 para obter 5 bytes: p.Java 7, 161 bytes
Isso requer uma importação, mas eu a escrevi como uma função. Grite comigo nos comentários se um programa completo for preferido nesse cenário. Produz 1 se houver um loop infinito e 0 se o valor chegar a 0.
fonte
1
verdade?Brachylog ,
493223 bytesRetorna
true
para loops infinitos efalse
caso contrário.Esta é uma adaptação vergonhosa do algoritmo de Martin Ender.
Resposta anterior, 32 bytes
Explicação da resposta anterior
fonte
PowerShell v2 +, 94 bytes
Recebe entrada
$n
, inicia umfor
loop infinito , com$a=,0
como condição inicial (isso usa o operador de vírgula para definir$a
uma matriz de um elemento0
). Este$a
é o nosso conjunto de valores já vistos.Cada iteração de loop, verificamos um
if
. A condição primeiro define o próximo valor do$n
uso de reversão de string e a[math]::Abs
chamada do .NET e verifica se esse valor já está-in
$a
. Se sim, produzimos$n
eexit
. Caso contrário, adicionamos esse valor à matriz e continuamos o loop.Saídas
0
para valores de entrada em que não entra em um loop infinito (que é falsey no PowerShell) e gera o valor em que o loop foi encontrado de outra forma (números inteiros diferentes de zero são verdadeiros). Por exemplo, saídas2178
para entrada1584
.fonte
Haskell, 65 bytes
Retorna
0
para Falso e1
Verdadeiro. Exemplo de uso:([]#) 1584
->1
.A abordagem óbvia: mantenha uma lista com todos os resultados vistos até o momento. Calcule o próximo número até
0
ou esteja na lista.fonte
JavaScript (ES6), 75 bytes
n<0?n=-n:n
en*=n>0||-1
também trabalho. O algoritmo se assemelha um pouco à resposta do PowerShell, embora essa seja uma formulação recursiva.fonte
Ruby, 57 bytes
A matriz inicialmente vazia
h
rastreia valores anteriormente atingidos. Nós iteramos o número até atingirmos um valor anterior e depois verificamos o valor na última iteração. Como 0 é um ciclo de 1, será 0 se e somente se não houver um ciclo maior. Tomo 2 bytes extras para converter isso em um booleano porque 0 é verdade em Ruby.fonte
Perl 6
58 53 3330 bytesExplicação:
(conta com a observação anterior de que você só precisa fazer essa transformação na maioria das
n
vezes)fonte
Perl 5,
3129 bytesEle itera
n=|n-rev(n)|
n vezes, então a saída é 0 se não houver loop,> 0 caso contrário. Dennis já provou que isso é suficiente.A nova versão usa
eval
ex
repete o operador em vez dofor
loop.fonte
-p
opção,-l
não é necessário para uma única entradaMatlab,
8984 bytesAbordagem simples - empilha todos os números e verifica se um número apareceu antes.
Explicação
fonte