Sua tarefa:
Escreva um programa ou função para verificar se um número inserido é um número de Fibonacci . Um número de Fibonacci é um número contido na sequência de Fibonacci.
A sequência de Fibonacci é definida como:
F(n) = F(n - 1) + F(n - 2)
Com as sementes sendo F(0) = 0
e F(1) = 1
.
Entrada:
Um número inteiro não negativo entre 0 e 1.000.000.000 que pode ou não ser um número de Fibonacci.
Resultado:
Um valor de verdade / falsidade indicando se a entrada é ou não um número de Fibonacci.
Exemplos:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Pontuação:
Isso é código-golfe , menor número de bytes ganhos.
code-golf
sequence
decision-problem
fibonacci
Gryphon - Restabelecer Monica
fonte
fonte
Respostas:
Neim , 2 bytes
Explicação:
Funciona da mesma forma que minha resposta É quadril para ser quadrada , mas usa uma lista infinita diferente:
f
para fibonacci.Tente!
fonte
66 D5
JavaScript (ES6), 34 bytes
Gera recursivamente a sequência de Fibonacci até encontrar um item maior ou igual à entrada e, em seguida, retorna o item == input.
fonte
Retina , 23 bytes
Experimente online!
Entrada em unário, saídas
0
ou1
.Explicação
A sequência de Fibonacci é um bom candidato para uma solução com referências futuras, ou seja, uma "referência anterior" que se refere a um grupo circundante ou a um que aparece posteriormente no regex (neste caso, estamos realmente usando os dois). Ao combinar números como esse, precisamos descobrir uma expressão recursiva para a diferença entre os elementos da sequência. Por exemplo, para combinar números triangulares, geralmente correspondemos ao segmento anterior mais um. Para corresponder números quadrados (cujas diferenças são os números ímpares), correspondemos ao segmento anterior mais dois.
Como obtemos os números de Fibonacci adicionando o penúltimo elemento ao último, as diferenças entre eles também são apenas os números de Fibonacci. Então, precisamos combinar cada segmento como a soma dos dois anteriores. O núcleo do regex é este:
Agora isso acaba adicionando os números de Fibonacci a partir de 1 , ou seja, 1, 1, 2, 3, 5, ... . Aqueles adicionar até 1, 2, 4, 7, 12, ... . Ou seja, eles são um a menos que os números de Fibonacci, então adicionamos um
1
no final. O único caso que isso não cobre é zero, então temos a^$
alternativa no começo para cobrir isso.fonte
^$|^(^1|\2?+(\1))*1$
^
.Regex (sabor ECMAScript),
392358328224206165 bytesAs técnicas que precisam entrar em jogo para combinar os números de Fibonacci com um regex ECMAScript (em unário) estão muito distantes de como é feito melhor na maioria dos outros sabores de regex. A falta de referências ou recursões avançadas / aninhadas significa que é impossível contar diretamente ou manter um total em execução de qualquer coisa. A falta de atenção faz com que muitas vezes seja um desafio ter espaço suficiente para trabalhar.
Muitos problemas devem ser abordados de uma perspectiva totalmente diferente e parecem insolúveis até a chegada de algumas informações importantes. Obriga você a lançar uma rede muito mais ampla para descobrir quais propriedades matemáticas dos números com os quais você está trabalhando podem ser usadas para tornar um problema específico solucionável.
Em março de 2014, foi o que aconteceu com os números de Fibonacci. Olhando para a página da Wikipedia, inicialmente não consegui descobrir uma maneira, embora uma propriedade em particular parecesse tentadoramente próxima. Então o matemático teukon delineou um método que deixou bem claro que seria possível fazer isso, usando essa propriedade junto com outra. Ele estava relutante em realmente construir o regex. Sua reação quando fui em frente e fiz isso:
Como nas minhas outras postagens de regex matemática unária do ECMAScript, darei um aviso: eu recomendo aprender como resolver problemas matemáticos unários no regex do ECMAScript. Foi uma jornada fascinante para mim, e não quero estragá-la para quem potencialmente queira experimentá-la, especialmente aqueles interessados na teoria dos números. Consulte essa publicação para obter uma lista de problemas recomendados consecutivamente identificados por spoilers para resolver um por um.
Portanto , não leia mais, se não quiser que você estrague uma mágica de expressões regulares unárias . Se você quiser tentar descobrir essa mágica, eu recomendo começar resolvendo alguns problemas no regex ECMAScript, conforme descrito no post acima.
O desafio que enfrentei inicialmente: Um número inteiro positivo x é um número de Fibonacci se e somente se 5x 2 + 4 e / ou 5x 2 - 4 é um quadrado perfeito. Mas não há espaço para calcular isso em uma regex. O único espaço em que temos que trabalhar é o próprio número. Nem sequer temos espaço suficiente para multiplicar por 5 ou pegar o quadrado, quanto mais os dois.
A idéia da teukon sobre como resolvê-lo ( originalmente publicada aqui ):
E aqui está uma maquete do algoritmo em C que escrevi como teste antes de implementá-lo em regex.
Portanto, sem mais delongas, aqui está o regex:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Experimente online!
E a versão comentada e bem impressa:
O algoritmo de multiplicação não é explicado nesses comentários, mas é brevemente explicado em um parágrafo dos meus abundantes números regex post .
Eu mantinha seis versões diferentes do regex de Fibonacci: quatro que aumentam do menor para a velocidade mais rápida e usam o algoritmo explicado acima, e outras duas que usam um algoritmo diferente, muito mais rápido, mas muito mais longo, que, como eu descobri, pode realmente retornar o índice de Fibonacci como uma correspondência (explicando que o algoritmo aqui está além do escopo deste post, mas é explicado na discussão original Gist ). Eu não acho que manteria tantas versões muito semelhantes de um regex novamente, porque na época eu estava fazendo todos os meus testes no PCRE e Perl, mas meu mecanismo de regex é rápido o suficiente para que as preocupações com a velocidade não sejam mais tão importantes (e se uma construção específica estiver causando um gargalo, posso adicionar uma otimização) - embora eu provavelmente mantenha novamente uma versão mais rápida e uma versão mais curta, se a diferença em velocidade eram grandes o suficiente.
A versão "retorne o índice de Fibonacci menos 1 como uma correspondência" (não muito golfe):
Experimente online!
Todas as versões estão no github com o histórico completo de consolidação das otimizações de golfe:
regex para correspondência de números de Fibonacci - curto, velocidade 0.txt (o menor, mas mais lento, como neste post)
regex para correspondência de números de Fibonacci - curto, velocidade 1.txt
regex para correspondência de números de Fibonacci - curto, velocidade 2.txt
regex para números Fibonacci correspondentes - curto, velocidade 3.txt
regex para números Fibonacci correspondentes - mais rápido.txt
regex para números Fibonacci correspondentes - retorno index.txt
fonte
Python 3 , 48 bytes
Experimente online!
fonte
int
definiria a barra mais alta (ainda não arbitrariamente grande), mas também não forçamos as respostas C a usar números inteiros de 64 bits (ou 128 bits com o gcc). De qualquer forma, a permissão para usar o mesmo algoritmo em um idioma, mas não em outro, parece absurda.Python 2,
4844 bytesExperimente online
Agradecimentos a Jonathan Allan por salvar 4 bytes
fonte
False
verdadeiros puderem ser e falsificarem valoresTrue
: TIO!n-a
no lugar den==a
e ter -1 e 0 como seus valores de retorno.-101
ou algum outro resultado em vez de-1
.05AB1E ,
87 bytesExplicação:
Experimente online!
-1 graças a Jonathan Allan pela solução alternativa do número 0 não-fibonacci.
fonte
n
(salvando um byte) comoÅF
é inclusivo e¹å
resultaria de0
qualquer maneiran=0
?Perl 6 , 23 bytes
fonte
{(0,1,*+*...^*>$_).tail==$_}
era o que eu ia postar inicialmente. Talvez eu tenha chegado aos operadores do Set eventualmente.Sério , 3 bytes
Experimente online!
Retorna o índice +1 na lista de números de Fibonacci, se for verdade, caso contrário, retornará falso.
Explicação:
fonte
Gelatina ,
8 76 bytesExperimente online!
Quão?
Notas:
‘
, é necessária para que isso funciona para 2 e 3 , uma vez que são o 3 rd e 4 th números de Fibonacci - além de 3 todos os números de Fibonacci são maiores do que seu índice.-
é necessária (e não apenas‘R
) para isso funciona para 0 desde 0 é a 0 º número de Fibonacci;fonte
3
:)ZX81 BASIC
180151100~ 94 bytes BASIC tokenizadosCom os agradecimentos a Moggy nos fóruns do SinclairZXWorld, aqui está uma solução muito mais limpa que economiza mais bytes.
Isso produzirá 1 se um número de Fibonacci for inserido ou zero, se não. Embora isso economize bytes, é muito mais lento que as soluções antigas abaixo. Para velocidade (mas mais bytes BASIC), remova os
VAL
invólucros ao redor dos números literais da string. Aqui estão as soluções antigas com algumas explicações:As alterações acima economizam mais bytes BASIC para condensar as
IF
instruções em uma únicaPRINT
na linha 12; outros bytes foram salvos usando aVAL
palavra - chave e, e usingGOTO CODE "£"
, que no conjunto de caracteres ZX81 é 12. As seqüências de caracteres salvam mais bytes sobre os números, pois todos os valores numéricos são armazenados como flutuadores, portanto, ocupam mais espaço na pilha VAR.fonte
5 IF R<F THEN NEXT I
- meu mal!C #, 109 bytes
Definitivamente poderia ser melhorado, mas não tive tempo.
fonte
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(apenas 80 bytes). Experimente online!a+=b
vez dea=a+b
e emb+=a
vez deb=a+b
.> <> ,
2119 + 3 =2422 bytesA entrada deve estar na pilha no início do programa, portanto, +3 bytes para o
-v
sinalizador.Experimente online!
Isso funciona gerando números de Fibonacci até que sejam maiores ou iguais ao número de entrada e, em seguida, verificando o último número gerado quanto à igualdade com a entrada. Saída
1
se fosse um número de Fibonacci,0
caso contrário.Para garantir que isso
0
seja tratado corretamente, a semente é-1 1
- o primeiro número gerado será em0
vez de1
.Obrigado a @cole por apontar que
i
pode ser usado para empurrar-1
a pilha quando STDIN estiver vazio. Muito esperto!Versão anterior:
fonte
i
vez de01-
.i
como-1
quando não há entrada para STDIN, eu não tinha considerado isso. Bem feito!Mathematica, 37 bytes
-4 bytes de @ngenisis
fonte
Fibonacci[0]
dá0
, para que você possa salvar4
bytes, incluindo0
noTable
intervalo. Você pode salvar outro byte usando a notação infix paraTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 bytes)
Experimente online!
Não é a solução mais eficiente, mas queria usar o método direto de verificar se "5 * x ^ 2 +/- 4" é um quadrado perfeito .
Explicação:
Nota:
No caso "0", retorna "2" porque 4 e -4 são quadrados perfeitos, o mesmo com 1 que produz "1 1". Considere qualquer saída diferente de zero como "verdade" e 0 como "falso".
fonte
Pari / GP , 32 bytes
Experimente online!
fonte
PHP , 44 bytes
Experimente online!
PHP , 58 bytes
Experimente online!
fonte
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 bytesTeste você mesmo!
Alternativa (ainda 49 bytes)
Não é muito original: é a versão iterativa simples e básica.
Isso funciona para números de até 1.836.311.903 (47º número de fibonacci) incluídos. Acima disso, o resultado é indefinido (incluindo um potencial loop infinito).
Agradecimentos a Kevin Cruijssen e David Conrad por ajudarem no golfe :)
fonte
n==0
paran<1
. Na pergunta, ele afirma " Um número inteiro não negativo entre 0 e 1.000.000.000 ".b+=a;a=b-a;
C # (.NET Core) , 51 bytes
Experimente online!
-6 bytes graças a @Oliver!
Esta solução usa uma função recursiva bastante direta.
n
é o número a ser testado.a
eb
são os 2 números mais recentes na sequência.O link TIO demonstra esse trabalho para 1134903170, que excede o valor máximo exigido pelo desafio.
fonte
a<n
há 51 bytesAlquimista ,
205134 bytesMuito obrigado ao ASCII-only pela fusão inteligente de estados, economizando 71 bytes !!
Experimente online ou verifique em lote!
Ungolfed
fonte
0
verificações por menos bytes ao custo do nãob
-atom na inicialização resolve o problema (e salva 2 bytes): D ObrigadoGelatina , 5 bytes
Experimente online!
Retorna 0 para números não Fibonacci e a posição indexada em 1 do número na sequência Fibonacci para números Fibonacci.
Explicação:
fonte
Dyalog APL, 17 bytes
Experimente online!
fonte
R,
4340 bytespryr::f
cria uma função:Usa
DescTools::Fibonacci
para criar os primeirosx+1
números de fibonacci e verifica a inclusão.x+1
porque o terceiro fibnum é 2 e isso não seria suficiente para verificar a inclusão de 3.Felizmente
Desctools::Fibonacci(0)=0
, esse é um bom freebee.-3 bytes graças ao MickyT
fonte
-1:x+1
você vai economizar um byte, mas0:45
você vai economizar três e cobrir o intervalo necessáriopryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 bytes
Experimente online! Isso explora o fato de que a entrada estará no intervalo de 0 a 1.000.000.000, portanto, precisamos verificar apenas os 45 primeiros números de Fibonacci.
f=0:scanl(+)1f
gera uma lista infinita de números de Fibonacci,take 45f
é a lista dos primeiros 45 números de Fibonacci eelem
verifica se a entrada está nesta lista.Versão irrestrita: 36 bytes
Experimente online! Para qualquer um
n
, pegar os primeirosn+3
números de Fibonacci garantirá quen
estará nesta lista se for um número de Fibonacci.Observe que essa abordagem é incrivelmente ineficiente para números altos que não são números de Fibonacci, porque todos os
n+3
números de Fibonacci precisam ser calculados.fonte
Javascript (ES6 sem o operador **), 44 bytes
Baseia-se na proporção entre números sucessivos de Fibonacci que se aproximam da proporção áurea. O valor de c é a parte fracionária da entrada dividida pela proporção áurea - se a entrada for Fibonacci, isso será muito próximo de 1 e o valor de c-c² será muito pequeno.
Não é tão curto quanto algumas das outras respostas JS, mas é executado no tempo O (1).
fonte
Julia 0.4 , 29 bytes
Experimente online!
Se não é assim que você responde Julia, me avise. Não tenho certeza de como a entrada funciona no TIO.
fonte
!m=
) ou uma lambda (contandom->
). Mais importante, isso falha para 0 como está.R,
3231 bytesRecebe informações de stdin, retorna
TRUE
ouFALSE
conforme apropriado.fonte
Lisp comum,
6154 bytesExperimente online!
A redução no tamanho em relação à versão anterior:
foi desencadeado pela idéia de que, para gerar a sequência dos números de Fibonacci, apenas duas variáveis são necessárias, e não três.
fonte
Mathematica, 33 bytes
fonte
@*
(e em seguida, solte a final@#&
)JS (ES6), 57 bytes
Usa o método de carusocomputing . Muito mais golfista do que minha outra resposta .
Ungolfed
fonte