Por que o número 6174 é tão interessante? Conforme definido pela Wikipedia
- Pegue qualquer número de quatro dígitos, usando pelo menos dois dígitos diferentes. (Zeros à esquerda são permitidos.)
- Organize os dígitos em ordem crescente e depois em ordem decrescente para obter dois números de quatro dígitos, adicionando zeros à esquerda, se necessário.
- Subtraia o número menor do número maior.
- Volte para a etapa 2.
O processo acima, conhecido como rotina de Kaprekar, sempre alcançará 6174 em no máximo 7 iterações. Quando 6174 for alcançado, o processo continuará produzindo-o.
Escreva um programa que execute a rotina do Kaprekar em relação a um determinado número de quatro dígitos (veja a definição acima) imprimindo cada etapa da rotina.
Regras:
- As inscrições devem ser programas completos.
- A entrada deve ser lida a partir da entrada padrão. A tubulação do eco está OK.
- A entrada deve estar na forma numérica.
- É necessário imprimir zeros à esquerda. (Veja exemplos abaixo.)
- A última linha deve dizer quantas iterações foram necessárias. A pontuação é necessária.
Exemplos:
> 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.
> 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.
> 6174
7641 - 1467 = 6174
Iterations: 1.
Qualquer linguagem de programação é bem vinda. Pontos extras para os esotéricos + uma pequena recompensa.
Atualização 1 : já existe uma pergunta semelhante .
Atualização 2 : Exemplo adicionado para 6174 como entrada. Obrigado a Peter Taylor pelo aviso.
code-golf
repeated-transformation
sequence
lunohodov
fonte
fonte
Respostas:
Perl -
147143134130129126129128126EDIT: agora está em conformidade com 6174 caso, ao custo de alguns caracteres ... executado com
echo -n <number> | perl kaprekar.pl
EDIT: Finalmente de volta para onde eu estava antes: D
fonte
Ruby 1.9, 122 caracteres
Exemplo de invocação:
Eu contei a
-ln
bandeira como 4 caracteres (diferença entre a invocação normalruby kaprekar.rb
eruby -ln kaprekar.rb
).fonte
ruby -lp kaprekar.rb
. Digite um número e pressione <Enter>, mas a saída é o próprio número digitado. Claramente estou perdendo alguma coisa ... Por favor, informe como usar o script.6174
entrada, o que infelizmente traz essa solução para até 128 caracteres.echo 1234 | ruby kaprekar.rb
gera um aviso e termina com um erroundefined method 'chars' for nil:NilClass (NoMethodError)
. A execuçãoecho 1234 | ruby -lp kaprekar.rb
emite apenas um aviso e se comporta conforme o esperado. A saída não é o esperado, uma vez que contém uma mensagem de avisokaprekar.rb:3: warning: regex literal in condition
Python, 141 caracteres
fonte
;
s.while n-6174
. Não há espaço entreprint
e a cotação.Golfscript, 74 caracteres
fonte
Haskell,
197192182181 caracteresfonte
r
es
salvar 2 caracteres. Além disso, "000" é redundante. "0" é suficiente. Isso nos leva a 188 caracteres. Estou surpresointeract
não ajuda aqui. Geralmente faz.show x++s
porshows x s
ganha mais 2 bytes. 186 agora.|k>0
), é possível se livrarf
. Além disso renomeaçãog
para%
nós chega a 182 caracteres.> <> -
268308Não é um grande candidato ao golfe, mas foi divertido escrever. :)
Execute com./fish.py kaprekar.fish -v <number>
EDIT: agora recebe entrada do STDIN.
fonte
JavaScript,
189182165 caracteresCrédito para DocMax:
Original:
Ungolfed:
fonte
n != 6174
para,n-6174
pois retornará zero, o que é falso (pelo menos em C e Python).while(n.length<4)
porwhile(!n[3])
.n+'\n'
é adicionado para evitar o condicional e um extra\n
, c) usa um temp para evitar uma sequência de junção-divisão-junção, d) tira proveito do fato de que sempre é necessário adicionar um único '0' para preenchimento:for(n=prompt(i=0,o=e='');n-6174;i++,o+=(n=(b=n.split(e).sort(),a=b.join(e),b).reverse().join(e))+' - '+a+' = '+(n=('0'+(n-a)).slice(-4))+'\n');alert(o+"Iterations: "+i+'.')
que deve ser 172 caracteres.i
é 0 (+4), mas combinada com ai++
. Infelizmente, isso resulta em um erro, por isso mudei o incremento para um decréscimo e depois usei um pouco de truque bit a bit no final (-1). Então mudeii=0,o=e=''
parai=o=e=''
(-2), reformatei ofor
loop para evitar parênteses extras (-1),(b=...,a=...,b)
bit expandido (-2) e entrei furtivamentea=b.join
nareverse()
chamada (-1). Então, 169, nada mal!PowerShell, 125
128130131Passa todos os casos de teste da pergunta.
fonte
JavaScript, 260 bytes
fonte
Clojure, 256 caracteres
fonte
Scala 2.9, 194 caracteres
Utiliza o recurso App do Scala 2.9.
Editar: fornece a saída correta para a entrada inicial de 6174.
fonte
PHP, 215
259276personagensUngolfed:
fonte
abs
,max
emin
, pois o tipo sempre significa que$b
é maior que$a
. Isso pode economizar 20 caracteres. Além disso, acho que colocar o tipo dentro do loop no topo significará que você só precisa inseri-lo em seu código uma vez, o que lhe poupará mais nove.<?function k($c){echo"> $c\n";$n=str_split(str_pad($c,4,0,0));for(;$k-6174;$z++){sort($n);$a=join($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";}
Você pode salvar 12 caracteres alterando suafor
instrução, chamando isso de função e usando emjoin
vez deimplode
.CoffeeScript,
233225 caracteresExperimente aqui ou com instruções aqui .
fonte
0
(conforme sugerido pelo prompt) ou clicar no botão Cancelar faz com que o Safari congele.Scala 276
Scala 283
diff:
fonte
GAWK - 152 caracteres
Esta é uma versão do GNU awk. Pode não funcionar com outras versões que não sejam gnu.
fonte
awk: calling undefined function asort
. A versão do awk é 20070501 em execução no OSX 10.6.7. Não esqueça o.
depois do número de iterações.9992 - 2999 = 6993
Ruby, 179 caracteres, mas postando assim mesmo
fonte
PERL
fonte
K, 104
Casos de teste
fonte
Mathematica,
314291 caracteresEste é o programa, kaprekar.m: -
Configurando o caminho antes da execução: -
Executando o programa: -
fonte
PHP , 160 bytes
Experimente online!
Programa completo, a entrada é
STDIN
, execute comphp -nF
.Saída
fonte
Ferrugem - 375 bytes
Apresento isso como um possível "limite superior", desafio qualquer pessoa a encontrar uma linguagem em que uma implementação razoável disso seja mais longa - como não há nada supérfluo, mas também nada remotamente óbvio que a reduza significativamente. O problema do Rust é que são necessários cerca de 120 caracteres para serem lidos no stdin e analisados em um número inteiro. "Ah, mas apenas use a representação de string" ... mas estou 99% confiante de que seria ainda mais longo
fonte
Sinalizador Perl 6 -n, 105 bytes
Experimente online!
Eu finalmente consegui usar meu
{}...*
truque, já que precisamos ter pelo menos uma iteração para o 6174. Não sei por que preciso do envolvimento adicional em.&{ }
torno da sequência, o que é meio ruim.Explicação:
fonte