Stampa l'ennesimo numero di Fibonacci contenente l'ennesimo numero di Fibonacci!


22

Sfida

È necessario scrivere un programma che accetta un numero intero positivo ncome input e genera il nnumero di Fibonacci (abbreviato come Fib # in tutto) che contiene il nFib # come una sottostringa. Ai fini di questa sfida, la sequenza di Fibonacci inizia con a 1.

Ecco alcuni esempi che è possibile utilizzare come casi di test o come esempi per chiarire la sfida (per quest'ultimo, si prega di lasciare un commento in basso che spiega cosa non è chiaro).

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

Come sempre, questo è , quindi cerca il conteggio di byte più basso possibile.

Se qualcosa è confuso / poco chiaro, si prega di lasciare un commento.

(Questa sfida si basa su un'altra sfida che ho pubblicato: Stampa l'ennesimo numero primo che contiene n )


3
Raccomando di includere il n=5testcase, perché ho appena fatto un errore sciocco in cui ho scritto un assegno che ha contato un numero più volte se aveva la sottostringa più di una volta. n=5lo prenderei a causa del 55.
Ørjan Johansen,

2
@officialaimm Non credo sia ragionevole aspettarsi numeri molto alti. La mia soluzione funziona su TIO fino a n=25(l'output ha 1186 cifre), quindi viene ucciso per n=26(3085 cifre compilate sul mio laptop). Sembra che ci sia un salto in difficoltà ogni volta che si fib(n)ottiene un'altra cifra (come ci si aspetterebbe). Il prossimo salto, 31, ha 12990 cifre nell'output finale.
Ørjan Johansen,

1
Sì. Lol! la mia soluzione Python rimane bloccata per n> 6 perché esiste una funzione ricorsiva che viene chiamata molte volte in un ciclo. : D
officialaimm,

1
@officialaimm Oh giusto, l'esplosione esponenziale è un problema quando si definisce Fibonacci direttamente con la ricorsione. Anche senza di ciò potresti raggiungere il limite di ricorsione di Python piuttosto presto.
Ørjan Johansen,

1
@Shaggy: Questo è ciò che intendevo per coerente: quando 0 è il 0 ° numero di Fibonacci, allora 1 è il primo ("1"?) Numero di Fibonacci.
ShreevatsaR,

Risposte:


12

Haskell , 85 84 byte

MODIFICARE:

  • -1 byte: Laikoni abbreviato l.
  • Errore di battitura ( x>=sper x<=s) nella spiegazione.

fprende un Inte restituisce un 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

Provalo online!

Come funziona

  • lè la lista infinita di numeri di Fibonacci, definita ricorsivamente come la somma parziale di 0:1:l. Inizia con 0perché gli elenchi sono indicizzati 0. mè lo stesso elenco convertito in stringhe.
  • In f:
    • nè il numero di input ed xè la (stringa del) nnumero di Fibonacci.
    • Nella comprensione dell'elenco esterno, yviene testato un numero di Fibonacci per verificare se contiene xcome sottostringa. I passaggi yvengono raccolti nell'elenco e indicizzati con il finale !!nper fornire l'output. Un extra xviene anteposto ai test per salvare due byte oltre l'utilizzo !!(n-1)alla fine.
    • Per evitare di contare ypiù volte, i test di ciascuno ysono racchiusi tra loro ore un'altra comprensione dell'elenco.
    • Nella comprensione dell'elenco interno, sscorre attraverso i suffissi di y.
    • Per verificare se xè un prefisso di s, controlliamo se x<=se x++":">s. ( ":"è in qualche modo arbitrario ma deve essere più grande di qualsiasi numero.)

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


4

Python 2 , 99 86 byte

  • Ørjan Johansen Salvato 7 byte: a partire da b=i=x=-1 a=1e rilasciando ilx and
  • Ørjan Johansen ha nuovamente salvato 3 byte: f and n==2inf*(n>2)
  • Felipe Nardi Batista ha salvato 9 byte: a,b=a+b,aabbreviazione di scambio economico f-=str(x)in str(a), schiacciata(n<2)*f
  • ovs ha salvato 13 byte: passaggio da Python 3 a 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

Provalo online!

Spiegazione:

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 byte

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)

Provalo online!


1
È possibile eliminare altri 7 byte iniziando b=i=x=-1 a=1e rilasciando il x and . (Essenzialmente iniziando 3 passaggi prima nella sequenza su due lati di Fibonacci -1, 1, 0, 1, 1, 2, ....)
Ørjan Johansen,

1
Hai lasciato uno spazio alla fine di -1: P
Ørjan Johansen,

1
Erm arrossire . Inoltre, voglio sbarazzarmi di `e n> 2`, ma sembra che abbia n==2davvero bisogno di un trattamento speciale. Ma può essere abbreviato *(n>2).
Ørjan Johansen,

1
golfed fino a 88 byte , alcune modifiche sono esclusive di Python 2. ma il resto funzionerà anche in Python 3
Felipe Nardi Batista,

1
per Python 3, puoi ancora giocare a golf a 9 byte: qui
Felipe Nardi Batista,

4

Java, 118 111 byte

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;}

Continuo a pensare che dovrebbe essere possibile non duplicare il bit di Fibonacci, ma tutti i miei sforzi in qualche modo portano a più byte.

Grazie a Kevin per miglioramenti ... suppongo che questo sia stato il mio primo tentativo di giocare a golf :)


2
Gli snippet non sono ammessi. Dovresti trasformarlo in un lambda in questo modo: 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 byte)
Okx,

1
Benvenuti in PPCG! Dopo averlo cambiato in una lambda come ha sottolineato @Okx, devo dire che è una risposta impressionante. Ho provato a fare questa sfida circa un'ora fa poco prima di pranzo e mi sono arreso. Quindi +1 da me. Alcune piccole cose da golf: while(--n>0){q=p;p=c;c+=q;}può essere 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;}può essere for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (In totale: 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 byte )
Kevin Cruijssen,

2

Perl 6 , 45 byte

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

$_è l'argomento della funzione; @fè la sequenza di Fibonacci, generata pigramente.


2

JavaScript (ES6), 96 93 92 90 86 byte

0-indicizzato, con il numero 0 nella sequenza essendo 1. Craps fuori a 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 byte salvati grazie ad Arnauld

Provalo

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>


Spiegazione

Versione aggiornata da seguire, quando avrò un 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

La tua risposta sembra fornire un output diverso dagli esempi.
ericw31415,

@ ericw31415, perché è indicizzato 0.
Shaggy,

Ho scritto specificamente questo scritto però: "Ai fini di questa sfida, la sequenza di Fibonacci inizia con un 1."
ericw31415,

@ ericw31415: E la mia sequenza inizia con 1, è solo 0-indicizzata; il numero 0 e 1 nella sequenza sono 1, il 2 è 2, il 3 è 3, il 4 è 5, il 5 è 8 e così via, e così via.
Shaggy,

2

Carbone , 65 byte

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

Provalo online! Link al codice dettagliato per la spiegazione.



1

Mathematica, 85 byte

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

ingresso

[10]

-4 byte da @JungHwan Min

produzione

4660046610375530309


2
Sembra strano ma f@i@n++è totalmente valido, diminuendo di 1 byte. L'utilizzo Forinvece di Whileriduce 3 byte. 85 byte:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min


1

R, 77 72 byte

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

Questo utilizza la gmplibreria per il numero di Fibonacci. Implementazione piuttosto diretta della domanda.

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

Alcuni test

> 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 byte

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

Una soluzione di base, utilizza una sequenza infinita di numeri di Fibonacci s.


0

C #, 35 byte

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

Provalo

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
Benvenuto sulla programmazione di Puzzle e Code-Golf. Le risposte devono essere un programma completo o una funzione, mentre hai fornito solo uno snippet. In particolare, stai assumendo che l'input sia presente ne hai appena inserito l'output b(credo). Potresti scrivere che prenda ncome argomenti e ritorni b... Inoltre, sono abbastanza sicuro che non stai calcolando ciò che le sfide richiedono. In realtà, non ho idea di cosa stai elaborando. Potresti fornire un codice che possiamo eseguire per verificare la tua soluzione? (il tuo "Provalo" non può essere eseguito così com'è ..)
Dada,

0

NewStack , 14 byte

N∞ ḟᵢfi 'fif Ṗf⁻

La ripartizione:

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

In inglese: (con esempio di un input di 3)

N∞: Crea un elenco dei numeri naturali [1,2,3,4,5,6...]

ḟᵢ: Memorizza l'input nella variabile f [1,2,3,4,5,6...]

: Converti l'elenco in numeri di Fibonacci [1,1,2,3,5,8...]

'fif: Mantieni tutti gli elementi che contengono il fnumero di Fibonacci[2,21,233...]

Ṗf⁻: Stampa l' f-1elemento th (-1 a causa dell'indicizzazione basata su 0)233


GitHub sembra contenere solo un file Leggimi e un tutorial. Si parla di un'implementazione, ma non è collegata. Sebbene PPCG ora consenta lingue più recenti della sfida, credo che richiediamo comunque un'implementazione disponibile al pubblico.
Ørjan Johansen,

@ ØrjanJohansen, Ahah grazie per avermelo ricordato. Ho dimenticato di caricarlo! Tra un minuto.
Graviton,

L'implementazione sembra utilizzare UTF-8, nel qual caso in realtà sono 28 byte (non importa l'impostazione di Haskell, sto solo usando TIO per contare i byte). Per questo motivo, lingue come Jelly ecc. Hanno le proprie pagine di codice.
Ørjan Johansen,

@ ØrjanJohansen Touché, sto lavorando alla distribuzione di un tavolo per la sua codifica mentre parliamo.
Graviton,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.