Dentro dos números de Fibonacci

20

O desafio

Dada uma entrada inteira, retorne o primeiro número de Fibonacci que contém a entrada em si, juntamente com o índice desse número de Fibonacci (índices começando em 0 ou 1 - até você, mas mencione qual em sua resposta). Por exemplo, se for dada a entrada 12, o programa retornará 26: 121393como 12, sendo encontrado dentro do número ( 12 1393) e está no índice 26 dos números de Fibonacci.

Exemplos

Dada a entrada:

45

Seu programa deve gerar:

33: 3524578

Entrada:

72

Saída:

54: 86267571272

Entrada:

0

Saída:

0: 0

Entrada:

144

Saída:

12: 144

Pontuação

Isso é , então a resposta mais curta em cada idioma vence.

SpookyGengar
fonte
Podemos optar por indexação 1?
Mr. Xcoder
1
Não é um duplicado, mas está bem próximo desse desafio.
Lynn
1
Fale sobre matemática sobre se a sequência de Fibonacci é normal ou não (esta pergunta presume que seja).
AdmBorkBork 27/07
1
Temos que usar dois pontos como separador? Podemos gerar uma matriz / lista?
Shaggy

Respostas:

8

Gelatina , 10 bytes

0ÆḞ©w¥1#;®

Experimente online!

Como funciona

0ÆḞ©w¥1#;®  Main link. Argument: n

0           Set the return value to 0.
       #    Call the second link to the left with arguments k = 0, 1, 2, ... until
      1     one match has been found.
     ¥        Combine the two links to the left into a dyadich chain.
 ÆḞ             Compute the k-th Fibonacci number...
   ©              and copy it to the register.
    w           Yield 1 if n occurs inside the Fibonacci number, 0 otherwise.
         ®  Yield the value stored in the register.
        ;   Concatenate the index and the Fibonacci number.
Dennis
fonte
Você usou o mesmo truque que o meu. :)
Erik the Outgolfer
@EriktheOutgolfer Como o seu?
Dennis
Não publiquei, mas geralmente também não usei D...
Erik the Outgolfer
4

Python 2 , 56 bytes

f=lambda n,i=0,a=0,b=1:`n`in`a`and(i,a)or f(n,i+1,b,a+b)

Experimente online!

ovs
fonte
4

Perl 6 , 30 bytes

{first :kv,/$_/,(0,1,*+*...*)}

Experimente online!

firsté uma função que retorna o primeiro elemento de uma sequência que passa no teste e, convenientemente, recebe um :kvadvérbio que diz para retornar a chave (índice) e o valor correspondente.

Sean
fonte
Supondo que você possa retornar um objeto Pair , você pode usar o :padvérbio em vez de :kv.
Brad Gilbert b2gills
3

Lote, 104 bytes

@set/an=x=0,y=1
:l
@call set t=%%x:%1=%%
@if "%t%"=="%x%" set/an+=1,x+=y,y=x-y&goto l
@echo %n%: %x%

Funciona n=0..45devido ao intervalo limitado da aritmética inteira do Lote. Explicação: O lote não possui um teste de correspondência interno, mas possui um operador que pode substituir cadeias literais por outras cadeias literais, por exemplo, por exemploif "%s:l=%"=="%s%" é verdade se %s%não estiver vazio, mas não contiver l. O uso de callé, então, um truque para substituir %1(a entrada) no operador de substituição, no entanto call, não funciona nas declarações de fluxo de controle, portanto é necessária uma atribuição temporária intermediária.

Neil
fonte
2

Javascript ES6, 68 caracteres

n=>eval('for(q=x=0,y=1;!`${x}`.match(n);++q)[x,y]=[y,x+y];q+": "+x')

Teste:

f=n=>eval('for(q=x=0,y=1;!`${x}`.match(n);++q)[x,y]=[y,x+y];q+": "+x')
console.log([45,72,0,144].map(f).join`
`)

Qwertiy
fonte
2

Python 3, 76 bytes

f=lambda n,l=[1,0]:str(n)in str(l[1])and(len(l)-2,l[1])or f(n,[l[0]+l[1]]+l)
Levi
fonte
2

Emojicode , 133 bytes

🐖🔢🍇🍮a 0🍮b 1🍮i 0🔁☁️🔍🔡a 10🔡🐕10🍇🍮b➕a b🍮a➖b a🍮i➕1i🍉😀🔡i 10😀🔡a 10🍉

Experimente online!

betseg
fonte
1

Dyalog APL, 39 bytes

{⍺←0⋄∨/(⍕⍵)⍷⍕x←1∧+∘÷/0,⍺/1:⍺,x⋄(1+⍺)∇⍵}

Usando recursão da cauda. Não tente 72, ele irá danificar sua máquina porque ela recalcula os fibonacci em todas as chamadas.

Experimente online!

Uriel
fonte
1

Mathematica, 119 bytes

Indexado 1

(T=ToString;If[(h=#)==0,"0:0",a=#&@@Select[k=T/@(Array[Fibonacci,9#]),StringContainsQ[#,T@h]&];Min@Position[k,a]":"a])&


Experimente online!

J42161217
fonte
1

Na verdade , 13 bytes

╗1⌠F$╜@c⌡╓i;F

Experimente online!

Explicação:

╗1⌠F$╜@c⌡╓i;F
╗              save input in register 0
 1⌠F$╜@c⌡╓     smallest non-negative integer n where the following function returns truthy:
   F$            nth Fibonacci number, stringified
     ╜@c         count occurrences of input
          i;F  flatten the list, duplicate the index, and push the Fibonacci number at that index
Mego
fonte
1

R, 65 bytes

f=function(x,n=1,a=1,b=0)`if`(grepl(x,b),c(b,n-1),f(x,n+1,a+b,a))

A recursão padrão para gerar Fibnums, mas em vez de terminar com base em n, termina quando bcorresponde ao regex x. Isso realmente funciona surpreendentemente bem. Eu assumi que o uso de regex com numéricos exigiria muito trabalho para convertê-los em strings, mas isso não parece ser necessário :)

Isso também precisa ultrapassar a recursão em 1 etapa, marcando em bvez de ae subtraindo 1de n. Isso é para garantir que f(0)funcione corretamente.

Isso falha na maioria dos valores quando a entrada excede 1001, devido ao maxint. Se substituirmos ae bpor bigints, isso funcionará para entradas mais altas (o teste atual está em x = 11451)

f=function(x,n=1,a=gmp::as.bigz(1),b=gmp::as.bigz(0))`if`(grepl(x,b),c(b,n-1),f(x,n+1,a+b,a))
JAD
fonte
1

JavaScript ES6, 79 78 75 bytes

-1 byte por Step Hen

-3 bytes por Neil

i=>eval('d=a=b=1;while(!~(a+"").indexOf(i)){c=b;b=a+b;a=c;‌​d++};d+": "+a')
Евгений Новиков
fonte
1
Você pode usar eval()em vez de { return}salvar um byte, e você pode soltar o t=desde que você não está usando recursão:i=>eval('d=a=b=1;while(!~(a+"").indexOf(i+""){c=b;b=a+b;a=c;d++};d+": "+a')
Stephen
1
String.prototype.indexOfconverte automaticamente seu parâmetro em uma string, sem a necessidade de fazê-lo explicitamente. Além disso, parece que você copiou o erro de digitação do @ StepHen (você tem mais (s que )s).
295 Neil
@Neil Woops meu mau
Stephen
1

C # (.NET Core) , 99 bytes

n=>{int a=0,b=1,c,d=0;for(;b.ToString().IndexOf(n.ToString())<0;c=a,a=b,b+=c,d++);return d+": "+b;}

Experimente online!

Recebe a entrada como um número inteiro, retorna uma string com a saída.

jkelm
fonte
1

PHP, 80 bytes

<?php for($a=1,$b=$n=0;strpos($a=-$a+$b=$a+$b,"$argv[1]")<-1;$n++);echo"$n: $a";

O script é bastante simples, simplesmente armazenando os termos atuais e seguintes da sequência em $ a e $ b por toda parte. Para permitir o 0º termo de 0, $ a e $ b são inicialmente atribuídos aos valores dos -1º termo (1) e 0º termo (0), respectivamente.

Ambos os valores são recalculados em uma única expressão, que são duas atribuições em uma; efetivamente:

$b = $a + $b; // The next term is the sum of the two previous terms
$a = $b - $a; // The current term is now recalculated from the next and the previous

Se o valor de entrada corresponder ao início do termo, a função strpos () retornará 0 (que é falsey e daria um falso negativo), mas no Wonderphul World do PHP, embora false == 0seja verdadeiro e false < 0falso, false < -1é verdadeiro! E assim, o uso dessa comparação salva cinco bytes em comparação com !==false.

WebSmithery
fonte
1

Japonês , 17 14 bytes

Guardado 3 bytes graças a @JustinMariner

_ŬøU}a@[XMgX]

Experimente online!

Explicação

_ŬøU}a@[XMgX]      Implicit: U = input integer
      a@            For each integer X in [0, 1, 2, ...]:
        [XMgX]        take [X, Fibonacci(X)].
_    }a             Return the first pair where
 Å                    all but the first item
  ¬                   joined on the empty string (simply returns Fibonacci(X) as a string)
   øU                 contains U.
                    Implicit: output result of last expression
ETHproductions
fonte
14 bytes: _ŬøU}a@[XMgX]. Usando s1 q para obter o último item, o que permite soltar o<space>s
Justin Mariner
@JustinMariner Isso é ... isso é genial :-)
ETHproductions
0

PHP , 163 141 bytes

<?php $x=fgets(STDIN);$b=[0,1];if($x<1)$b=[0];for(;($c=count($b)-1)&&strpos($b[$c],$x)===false;){$b[]=$b[$c]+$b[$c-1];}die($c.': '.$b[$c]);?>

Experimente online!

Usa $b[0] = 0;e $b[1] = 1;para o início da sequência fib

Mic1780
fonte
0

PHP , 93 bytes

for($a[0]=$a[1]++;!strpos(" $a[$i]","$argv[1]");$a[$i+2]=$a[$i+1]+$a[$i++]);echo"$i: $a[$i]";

Loop simples através da sequência de Fibonacci. A verificação do nosso número de entrada é feita em strpos(" $a[$i]","$argv[1]"); o espaço extra é porque strposretornará falso-y se a 'agulha' for encontrada no início da string. Terminamos se a entrada for encontrada e ecoar a string necessária.

Experimente online!

Xanderhall
fonte
0

Lisp comum, 105 bytes

(lambda(x)(do((a 0 b)(b 1(+ a b))(i 0(1+ i)))((search(#1=format()"~a"x)(#1#()"~a"a))(#1#()"~a: ~a"i a))))

Experimente online!

Renzo
fonte