Como os números e seqüências de Fibonacci parecem um assunto popular para o código de golfe, pensei que poderia ser um desafio divertido codificar o golfe com números de Keith .
Então, proponho um desafio que é criar uma função que use um número inteiro e devolva um valor verdadeiro ou falso, dependendo do número ser um número Keith ou não.
Mais sobre os números de Keith
Em matemática de recreação, um número Keith ou um número de reconfiguração (abreviação de dígito repetitivo semelhante a Fibonacci) é um número na seguinte sequência inteira: 14, 19, 28, 47, 61, 75, 197, 742, 1104, 1537, 2208, 2580,…
Numberphile tem um vídeo explicando como calcular um número de Keith. Mas basicamente você pega os dígitos de um número. Adicione-os e, em seguida, pegue os últimos dígitos do número original e adicione-os à soma do cálculo, enxágue e repita. E exemplo para deixar claro.
14
1 + 4 = 5
4 + 5 = 9
5 + 9 = 14
Entrada
Um inteiro.
Resultado
Verdadeiro se o número for um número de Keith. Falso se não for ..
true
/false
ou pode ser qualquer coisa verdade / falsey ?Respostas:
GolfScript (
3125 caracteres)Insira como um número inteiro no topo da pilha. A saída é 0 (falsa) ou 1 (verdadeira). Demonstração on-line que lista os números de Keith até 100.
fonte
0>
. Infelizmente, posso marcar +1 apenas uma vez.Python (
7875)n=n[1:]+[sum(n)]
faz toda a mágica. Ele pega todos os itens, exceto o primeiro itemn
, fica na soma den
(com o primeiro item) e depois define comon
.Eu gostaria que você pudesse chamar
list
um número inteiro e ter os dígitos separados.Retorna
False
em todas as entradas abaixo de 10. Podem ser 8 caracteres menores se retornadasTrue
.fonte
n[0]
nãon[-1]
.print 9<a==n[0]
.n=n[1:]+[sum(n)]
pode se tornarn=n[1:]+sum(n),
GolfScript,
3229 caracteresUma implementação do GolfScript que pode ser testada online . A entrada é fornecida como elemento superior na pilha e retorna 0 (ou seja, falso) ou 1, respectivamente.
fonte
APL,
36343936332927Saída
1
se Keith,0
caso contrárioGolfScript ataca novamente !!
Editar
Usando Redução à direita (
⊢/
) em vez de Obter menos 1 (¯1↑
), economizando diretamente 1 caractere e indiretamente economizando 1 em Divulgar (⊃
)Explicação
⍎¨⍕x←⎕
pega a entrada avaliada (tratada como um número) e a atribui ax
. Converte-o em uma matriz de caracteres (também conhecida como "string" em outros idiomas) e percorre cada caractere (dígito), convertendo-o em um número. Portanto, isso resulta em uma matriz numérica dos dígitos.{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
é a principal função do "loop":+/⍵↑⍨-⍴⍕x
pega o último⍴⍕x
(número de dígitosx
) da matriz e os soma.⍵,
concatena até o final da matriz.(x>⊢/⍵)
verifique se o último número na matriz (que ainda não foi+/⍵↑⍨-⍴⍕x
concatenado) é menor quex
e retorna1
ou0
∇⍣
executa essa função na nova matriz várias vezes. Portanto, se o último número for menor quex
, essa função se repetirá. Caso contrário, basta retornar a nova matrizApós a execução da função, a matriz contém as somas até o ponto em que 2 dos números são maiores ou iguais a
x
(por exemplo14
, gerará1 4 5 9 14 23
,13
gerará1 3 4 7 11 18 29
).Finalmente, verifique se cada número é igual
x
e produza a soma do binário resultante. array.Editar
Foram adicionados 2 caracteres :-( para gerar saída
0
se a entrada for de um dígitoMais uma edição
Explicação
A função agora elimina o primeiro número (
1↓
) da matriz em vez de pegar o último⍴⍕x
(↑⍨-⍴⍕x
).No entanto, essa abordagem
1=
não é adequada para lidar com números de um dígito. Agora, ele remove o último número da matriz antes de verificar a igualdadex
, adicionando 1 caractereVocê adivinhou: EDITAR
Compara
x
com o item recém-adicionado em vez do último item antigo; portantox
, basta soltar o primeiro (em vez do último) antes de verificar a igualdade , salvando um sinal de menos. Salva outros 3 usando outra forma do operador Power (⍣
)E uma resposta de 25 char gs aparece (Orz)
Última edição
Não posso acreditar que perdi isso.
Não posso mais jogar golfe.
fonte
x∊{1↓⍵,+/⍵}⍣{x≤⊃⍺}⍎¨⍕x←⎕
. Na função de energia,⍺
é o valor "depois".Lisp comum, 134
O CL pode ser bastante ilegível às vezes.
Alguma formatação para evitar a rolagem horizontal:
Teste:
fonte
F # - 184 caracteres
Espero que seja bom participar do meu próprio desafio.
Editar Corrigido um erro referente a números pequenos.
fonte
K, 55
.
fonte
PowerShell:
12012812311111097$i=read-host
recebe informações do usuário e as armazena em $ i.$j=(
...)-split''|?{$_}
divide os dígitos de $ i em uma matriz e os armazena em $ j.While($x-lt$i)
define o seguinte loop do tipo Fibonnaci para executar até que a variável sum, $ x, atinja ou exceda $ i.$x=0
zera $ x, para que esteja pronto para ser usado como soma (necessário para quando o loop voltar).$j|%{$x+=$_}
usa um loop ForEach-Object para adicionar os valores de $ j em $ x.$null,$j=$j+$x
muda os valores em $ j restantes, descartando o primeiro, acrescentando $ x.$x-eq$i
após a conclusão do loop while, testa se o valor da soma, $ x, é igual ao valor inicial, $ i - geralmente indicativo de um número de Keith.-and$x-gt9
invalida números de um dígito, zero e números negativos, que não podem ser números de Keith.Este script é um pouco "bagunçado". Ele pode lidar com $ i e $ j normalmente, mas você precisará limpar $ x entre as execuções.
fonte
-ne''
para que seja justo?{$_}
.$i=read-host;$j=$i-split''|?{$_}'
por$j=($i=read-host)-split''|?{$_}
.Ruby, 82
Suspeite de Python é uma ferramenta melhor para este.
fonte
C, 123
teste via chicote:
dá:
fonte
i=(i+n-1)%n;t=g[i];g[i]=s;s=s*2-t;
comi+=n-1;t=g[i%n];g[i%n]=s;s+=s-t;
e salvar dois caracteres.R, 116
Imitação de Python:
fonte
Perl, 90
Um exercício divertido! Eu sei que é um post antigo, mas notei que o Perl estava faltando!
Tenho certeza de que posso melhorar a maneira como construo isso, digerindo as outras respostas mais minuciosamente, por isso provavelmente revisitarei isso!
fonte
Smalltalk - 136 car
Envie este bloco
value:
fonte
Java - 1437
fonte
Python3 104
E é uma função;)
fonte
Python - 116 caracteres
Não é realmente um especialista em codegolf, então aí está, minha primeira tentativa.
Faça duas alterações para uma função:
print
parareturn
x
para ser o parâmetroPS I segundo @ beary605- adicione um built-in para separar os dígitos / caracteres / o que for.
fonte
Ruby (com OOP)
fonte