Imprima o enésimo número de Fibonacci que contém o enésimo número de Fibonacci!


22

Desafio

Você deve escrever um programa que use um número inteiro positivo ncomo entrada e produza o nth número de Fibonacci (abreviado como Fib # por toda parte) que contém o nth Fib # como uma subtração. Para os propósitos deste desafio, a sequência de Fibonacci começa com a 1.

Aqui estão alguns exemplos que você pode usar como casos de teste ou como exemplos para esclarecer o desafio (para o último, deixe um comentário abaixo, explicando o que você acha incerto).

n=1
Fib#s: 1
       ^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1

n=2
Fib#s: 1, 1
       ^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1

n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
             ^1              ^2                   ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233

n=4
Output: 233

n=5
Output: 6765

n=6
Output: 28657

n=7
Output: 1304969544928657

n=8
Output: 14472334024676221

n=9
Output: 23416728348467685

n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
                   ^1                     ^2         ^3                                   ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309

Como sempre, isso é , então escolha a menor contagem de bytes possível.

Se algo estiver confuso / claro, deixe um comentário.

(Esse desafio se baseia em outro desafio que publiquei: Imprima o enésimo primo que contém n )


3
Eu recomendo incluir a caixa de n=5teste, porque acabei de cometer um erro bobo em que escrevi uma verificação que contava várias vezes se ela tivesse a substring mais de uma vez. n=5pegaria isso por causa do 55.
Ørjan Johansen

2
@officialaimm Não acho razoável esperar números muito altos. Minha solução funciona no TIO até n=25(a saída possui 1186 dígitos) e depois é eliminada por n=26(3085 dígitos compilados no meu próprio laptop). Parece haver um salto de dificuldade sempre que fib(n)obtém mais um dígito (como seria de esperar). O próximo salto, 31, possui 12990 dígitos na saída final.
Ørjan Johansen

1
Sim. Ri muito! minha solução python fica bloqueada para n> 6 porque existe uma função recursiva que é chamada muitas vezes em um loop. : D
officialaimm

1
@officialaimm Ah, certo, a explosão exponencial é um problema ao definir Fibonacci diretamente com recursão. Mesmo sem isso, você poderá atingir o limite de recursão do Python em breve.
Ørjan Johansen

1
@ Shagy: Isso é o que eu quis dizer com consistente: quando 0 é o número 0 de Fibonacci, então 1 é o primeiro ("1 º"?) Número de Fibonacci.
ShreevatsaR

Respostas:


12

Haskell , 85 84 bytes

EDITAR:

  • -1 byte: Laikoni reduzido l.
  • Erro de digitação ( x>=spara x<=s) na explicação.

fpega um Inte retorna um String.

l=0:scanl(+)1l
m=show<$>l
f n|x<-m!!n=[y|y<-x:m,or[x<=s|s<-scanr(:)""y,x++":">s]]!!n

Experimente online!

Como funciona

  • lé a lista infinita de números de Fibonacci, definida recursivamente como as somas parciais de 0:1:l. Começa com 0porque as listas são indexadas em 0. mé a mesma lista convertida em seqüências de caracteres.
  • Em f:
    • né o número de entrada e xé a (sequência do) nth número de Fibonacci.
    • Na compreensão da lista externa, yé testado um número de Fibonacci para saber se ele contém xcomo substring. Os ys de passagem são coletados na lista e indexados com o final !!npara fornecer a saída. Um extra xé anexado aos testes para economizar dois bytes ao longo do uso !!(n-1)no final.
    • Para evitar a contagem de ys várias vezes, os testes de cada um ysão incluídos ore outra compreensão da lista.
    • Na compreensão da lista interna, sitera pelos sufixos de y.
    • Para testar se xé um prefixo de s, verificamos se x<=se x++":">s. ( ":"é um tanto arbitrário, mas precisa ser maior que qualquer número).

1
l=0:scanl(+)1lsalva um byte.
Laikoni


4

Python 2 , 99 86 bytes

  • Ørjan Johansen Salvo 7 bytes: iniciando com b=i=x=-1 a=1e soltando ox and
  • Ørjan Johansen salvou novamente 3 bytes: f and n==2paraf*(n>2)
  • Felipe Nardi Batista economizou 9 bytes: a,b=a+b,ashorthand de swap econômico f-=str(x)in str(a), espremido(n<2)*f
  • ovs salvou 13 bytes: transição do python 3 para o python 2.
f=n=input()
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=`x`in`a`
print a

Experimente online!

Explicação:

f=n=int(input())                 # f is number of required numbers

b=i=x=-1                         # i is index(counter) set at -1
                                 # In Two-sided fibonacci, fib(-1) is 1 
                                 # and b(fib before it) i.e. fib(-2) is -1
                                 # Taking advantage of all -1 values, x is 
                                 # also set to -1 so that the `if str(...`
                                 # portion does not execute until x is set a 
                                 # value(i.e. the nth fibonacci) since there 
                                 # is no way -1 will be found in the number 
                                 # (ALL HAIL to Orjan's Genius Idea of using 
                                 # two-sided fibonacci)      

a=1                              # fib(-1) is 1


while(n>2)*f:                    # no need to perform this loop for n=1 and 
                                 # n=2 and must stop when f is 0

 i+=1                            # increment counter

 b,a=a,a+b                       # this might be very familiar (fibonacci 
                                 # thing ;))                         

 x=[x,a][i==n]                   # If we have found (`i==n`) the nth 
                                 # fibonacci set x to it

 f-=`x`in`a`                     # the number with required substring is 
                                 # found, decrease value of f

print a                          # print required value

Python 3 , 126 120 113 112 110 101 99 bytes

f=n=int(input())
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=str(x)in str(a)
print(a)

Experimente online!


1
Você pode se livrar de mais 7 bytes iniciando b=i=x=-1 a=1e soltando o x and . (Essencialmente começando 3 passos anteriores no dois lados sequência de Fibonacci -1, 1, 0, 1, 1, 2, ....)
Ørjan Johansen

1
Você deixou um espaço no final de -1: P
Ørjan Johansen 15/06

1
Erm corar . Além disso, quero me livrar de `en> 2`, mas parece n==2realmente precisar de tratamento especial. Mas pode ser reduzido para *(n>2).
Ørjan Johansen

1
golfed lo para baixo para 88 bytes , algumas mudanças são exclusivos para python 2. mas o resto vai trabalhar em python 3, bem
Felipe Nardi Batista

1
para Python 3, você ainda pode golfe de 9 bytes: aqui
Felipe Nardi Batista

4

Java, 118 111 bytes

i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}

Eu continuo pensando que deveria ser possível não duplicar o bit Fibonacci, mas todos os meus esforços resultam em mais bytes.

Graças a Kevin por melhorias ... acho que mostra que esta foi minha primeira tentativa de jogar golfe :)


2
Snippets não são permitidos. Você deve transformar isso em um lambda da seguinte forma: i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}(118 bytes)
Okx 15/17

1
Bem-vindo ao PPCG! Depois de alterá-lo para um lambda, como a @Okx apontou, devo dizer que é uma resposta impressionante. Eu tentei fazer esse desafio cerca de uma hora atrás, pouco antes do almoço, e desisti. Então, um de mim. Algumas pequenas coisas do golfe: while(--n>0){q=p;p=c;c+=q;}podem ser for(;--n>0;p=c,c+=q)q=p;e n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}podem ser for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (No total: i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}( 111 bytes )
Kevin Cruijssen

2

Perl 6 , 45 bytes

{my@f=0,1,*+*...*;@f.grep(/$(@f[$_])/)[$_-1]}

$_é o argumento para a função; @fé a sequência de Fibonacci, gerada preguiçosamente.


2

JavaScript (ES6), 96 93 92 90 86 bytes

Indexado em 0, com o 0º número na sequência 1. Dados em 14.

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
  • 2 6 bytes economizados graças ao Arnauld

Tente

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
oninput=_=>o.innerText=(v=+i.value)<14?`f(${v}) = ${f(v)}\ng(${v}) = `+g(v):"Does not compute!"
o.innerText=`f(0) = ${f(i.value=0)}\ng(0) = `+g(0)
<input id=i min=0 type=number><pre id=o>


Explicação

Versão atualizada a seguir, quando recebo um minuto.

f=...                   :Just the standard, recursive JS function for generating the nth Fibonacci number
g=(...)=>               :Recursive function with the following parameters.
n                       :  The input integer.
x=0                     :  Used to count the number of matches we've found.
y=0                     :  Incremented on each pass and used to generate the yth Fibonacci number.
x>n?                    :If the count of matches is greater than the input then
f(y-1)                  :    Output the y-1th Fibonacci number.
:                       :Else
g(...)                  :    Call the function again, with the following arguments.
n                       :      The input integer.
x+                      :      The total number of matches so far incremented by the result of...
RegExp(f(n)).test(f(y)) :        A RegEx test checking if the yth Fibonacci number, cast to a string, contains the nth Fibonacci number.
                        :        (returns true or false which are cast to 1 and 0 by the addition operator)
y+1                     :      The loop counter incremented by 1

Sua resposta parece fornecer uma saída diferente dos exemplos.
ericw31415

@ ericw31415, é porque é indexado em 0.
Shaggy

Eu escrevi especificamente o que escrevi: "Para os propósitos deste desafio, a sequência de Fibonacci começa com um 1."
ericw31415

@ ericw31415: E minha sequência começa com 1, é apenas indexada em 0; os números 0 e 1 na sequência são 1, o 2 é 2, o 3 é 3, o 4 é 5, o 5 é 8, e assim por diante.
Shaggy

2

Carvão , 65 bytes

AIθνAνφA±¹βAβιAβξA¹αW∧›ν²φ«A⁺ι¹ιA⁺αβχAαβAχαA⎇⁼ιναξξA⁻φ›№IαIξ⁰φ»Iα

Experimente online! Link para código detalhado para explicação.



1

Mathematica, 85 bytes

(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&

entrada

[10]

-4 bytes de @JungHwan Min

saída

4660046610375530309


2
Parece estranho, mas f@i@n++é totalmente válido, diminuindo 1 byte. Usar em Forvez de Whilereduz 3 bytes. 85 bytes:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min 15/06


1

R, 77 72 bytes

F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)

Isso faz uso da gmpbiblioteca para o número de Fibonacci. Implementação bastante direta da questão.

F=gmp::fibnum;          # Alias Fibonacci function to F
i=0;                    # intitalise counter
d=n=scan();             # get n assign to d as well
while(n)               # loop while n
  if(grepl(F(d),F(i<-i+1)))  # use grepl to determine if Fib of input is in Fib# and increment i
     n=n-1;             # decrement n
F(i)                  # output result

Alguns testes

> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 2
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 3
2: 
Read 1 item
Big Integer ('bigz') :
[1] 233
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 10
2: 
Read 1 item
Big Integer ('bigz') :
[1] 4660046610375530309
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 15
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1387277127804783827114186103186246392258450358171783690079918032136025225954602593712568353

0

Clojure, 99 bytes

(def s(lazy-cat[0 1](map +(rest s)s)))#(nth(filter(fn[i](.contains(str i)(str(nth s %))))s)(dec %))

Uma solução básica, usa uma sequência infinita de números de Fibonacci s.


0

C #, 35 bytes

int u=1,b=1;for(;b<n;){b+=u;u=b-u;}

Tente

int n=int.Parse(t2.Text);int u=1,b=1;for(;b<n;){b+=u;u=b-u;t.Text+=b.ToString()+" ";}if(b==n){t.Text+="true";}

1
Bem-vindo ao Programming Puzzle e Code-Golf. As respostas precisam ser um programa completo ou uma função, enquanto você forneceu apenas um trecho. Em particular, você está assumindo que a entrada está dentro ne você apenas coloca a saída b(eu acho). Você pode escrever isso ncomo argumentos e retornos b... Além disso, tenho certeza de que você não está computando o que os desafios exigem. Na verdade, não tenho ideia do que você está computando. Você poderia fornecer algum código que possamos executar para verificar sua solução? (seu "Experimente" não pode ser executado como está ..) #
Dada

0

NewStack , 14 bytes

N∞ ḟᵢfi 'fif Ṗf⁻

O colapso:

N∞              Add all natural numbers to the stack
   ḟᵢ           Define new function will value of input
     fi          Get the n'th Fibonacci number for ever element n
       'fif      Remove all elements that don't contain the (input)'th Fibonacci number 
           Ṗf⁻  Print the (input-1)'th element

Em inglês: (com exemplo de uma entrada 3)

N∞: Faça uma lista dos números naturais [1,2,3,4,5,6...]

ḟᵢ: Armazene a entrada na variável f [1,2,3,4,5,6...]

: Converta a lista em números de Fibonacci [1,1,2,3,5,8...]

'fif: Mantenha todos os elementos que contêm o fnúmero de Fibonacci[2,21,233...]

Ṗf⁻: Imprime o f-1elemento th (-1 devido à indexação baseada em 0)233


O GitHub parece conter apenas um leia-me e um tutorial. Uma implementação é mencionada, mas não está vinculada. Embora o PPCG agora permita idiomas mais novos que o desafio, acredito que ainda precisamos de uma implementação disponível publicamente.
Ørjan Johansen

@ ØrjanJohansen, Ahah obrigado por me lembrar. Eu esqueci de enviar isso! Vai demorar um minuto.
Graviton

Sua implementação parece usar UTF-8, nesse caso, na verdade, são 28 bytes (não se importe com a configuração de Haskell, estou usando apenas o TIO para contar bytes). Idiomas como Jelly etc. têm suas próprias páginas de código por esse motivo.
Ørjan Johansen

@ ØrjanJohansen Touché, estou trabalhando para distribuir uma tabela para sua própria codificação enquanto falamos.
Graviton

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.