Em um episódio recente de QI , os 5 primeiros múltiplos de 142857 foram descritos como anagramas do número original. É claro que qualquer pessoa com mais do que um conhecimento passageiro desse número saberá que esses números são realmente cíclicos, não apenas anagramas. Mas isso me fez pensar.
Escreva um programa ou função que produza todos os números de seis ou menos dígitos que possuam um fator adequado que seja um anagrama. A lista deve começar com os seguintes números:
3105 (divisible by 1035)
7128 (divisible by 1782)
7425 (divisible by 2475)
8316 (divisible by 1386)
8712 (divisible by 2178)
9513 (divisible by 1359)
9801 (divisible by 1089)
Se preferir, você pode encontrar números que tenham um anagrama que seja um fator adequado do número, mas lembre-se de excluir os zeros à esquerda dos seus anagramas.
Esse é o código golf, então o código mais curto em bytes que não quebra brechas padrão vence.
Respostas:
Mathematica (ambiente REPL),
7574 bytesAgradecemos à ngenisis por reforçar isso com um byte!
Sort/@IntegerDigits@Divisors@#
produz uma lista ordenada de dígitos para cada divisor de seu argumento; o próprio número de entrada é um divisor; portanto, sua lista ordenada de dígitos é o último.Most@#~MemberQ~Last
detecta se a última lista classificada de dígitos também aparece na lista anterior ao último elemento. ESelect[Range[10!],...]
retém apenas os números inteiros até 3.628.800 que passam neste teste (esse limite escolhido porque é um byte menor que 10 6 ). Ele roda em cerca de 5 minutos no meu computador, produzindo uma lista de 494 números, o maior dos quais é 3.427.191; existem 362 números até 10 6 , o maior dos quais é 989.901.fonte
IntegerDigits@Divisors@#
.Gelatina , 12 bytes
Experimente online! (usa cinco ou menos dígitos devido ao limite de tempo do TIO)
Verficação
Como funciona
fonte
ÆḌṢ€ċṢµȷ#
por 10. Demorou ~ 27 minutos para rodar em um núcleo i7 (não no unix, não é legaltime
); o maior resultado foi6671928
.Braquilog , 12 bytes
Experimente online!
Isso pode esgotar o tempo limite antes de imprimir qualquer coisa (e, se não ocorrer, será possível imprimir apenas 3105).
Explicação
Isso imprime esses números indefinidamente, pois o autor disse que era aceitável que o programa imprimisse números maiores que 6 dígitos.
Isso é muito lento; você pode usar este programa (e alterar
8300
por qualquerN
) para começar a imprimir a partir de números estritamente maiores queN
.Como @ ais523 apontou, precisamos de um corte para evitar a impressão de um número várias vezes se vários de seus fatores forem permutações dele.
fonte
JavaScript (ES6),
103…9694 bytesUma função anônima que retorna a matriz de números inteiros correspondentes.
Formatado e comentado
Estatísticas do divisor
Para inteiros seis dígitos, cada relação
2
da9
entre um número inteiro de harmonizaçãon
e a sua anagrama for encontrado pelo menos uma vez. Mas alguns deles aparecem apenas algumas vezes:Teste
O teste abaixo é limitado ao intervalo,
[1 ... 39999]
para que não demore muito tempo para concluir.Mostrar snippet de código
fonte
_=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1))
.2
a9
são necessários (8
sendo usados apenas duas vezes para911736
e931176
).Pyke, 14 bytes
Experimente aqui!
Deve gerar todos os números como esse, mas o tempo limite será excedido.
Teste o algoritmo aqui!
fonte
Perl 6 , 59 bytes
Solução terrivelmente lenta de força bruta.
Ele retorna uma sequência lenta, para que eu possa verificar os primeiros resultados, mas não alcançará todos os resultados em tempo razoável. (Devo marcar como não concorrente?)
fonte
Pure Bash ,
128126122121120 bytesExperimente online!
(Este programa é razoavelmente rápido - foram necessários apenas 14 minutos para percorrer todos os números de 6 dígitos do meu MacBook. Infelizmente, o TIO excede o tempo limite porque impõe um limite de tempo de execução de 1 minuto, o que é tempo suficiente para concluir os números de 5 dígitos ou mais.)
Utilitários Bash + Unix, 117 bytes
Isso é mais curto que a versão pura do bash, mas é um pouco mais lento, provavelmente devido em boa parte a todos os bifurcações.
fonte
05AB1E , 15 bytes
Explicação:
Experimente online! (isso não vai funcionar, o tempo limite será excedido)
fonte
Japonês , 23 bytes
Experimente online! Observe que o código vinculado calcula apenas até 1e4 porque 1e6 atinge o tempo limite no TIO.
fonte
Python 2, 98 bytes
fonte
10**6
?x%i==0
pode serx%i<1
.05AB1E ,
1210 bytesTempo limite excedido no TIO devido ao loop infinito.
Economizamos 2 bytes, pois poderíamos gerar mais de 6 dígitos, de acordo com o comentário dos OPs.
Experimente online!
Explicação
fonte
Lote, 263 bytes
Lento. Assim, leva mais de um dia para terminar no meu PC. Explicação: a
c
sub - rotina divide seus dois primeiros argumentos. Se o restante for zero, ele calculará o hash do resultado calculando a soma das enésimas potências de 8 para cada dígito. Essa função hash, roubada da resposta bash, apenas colide com anagramas. (Funcionaria para números de sete dígitos, mas não tenho quinze dias.) O terceiro argumento é subtraído e a sub-rotina sai com um resultado verdadeiro se este for zero. An
sub-rotina chama ac
sub - rotina uma vez para calcular o hash, depois mais oito vezes para comparar o hash; se encontrar uma colisão, imprimen
e sai da sub-rotina mais cedo.fonte