Sequência de FIBonacci

12

Para este código de golfe, você receberá uma entrada de uma sequência fib onacci, ou seja, uma sequência normal de Fibonacci, mas com um número incorreto. Veja, a sequência está mentindo ! Pegue?:D

Seu trabalho é descobrir qual número está incorreto e imprimir o índice (com base em 0) desse número.

Por exemplo:

Input : 1 1 2 9 5 8 13
Output: 3

Input : 8 13 21 34 55 80
Output: 5

Input : 2 3 5 5 13 21
Output: 3

Especificações:

  • A sequência pode começar em qualquer número.
  • Os dois primeiros números da entrada sempre estarão corretos.
  • O código mais curto (contagem de caracteres) vence.
Maçaneta da porta
fonte
2
A entrada precisa ser delimitada por espaço ou podem ser usadas vírgulas também?
Volatilidade
A entrada @Volatility é delimitada por espaço.
Maçaneta
O trabalho é encontrar apenas o primeiro número, certo? Por exemplo, se você começou a partir da direita na primeira seqüência que você poderia pensar que 8está incorreta porque ele não é igual9+5
Luis Mendo
@LuisMendo Sempre haverá apenas um desses números.
Maçaneta
1
@LuisMendo Ok, deixe-me reformular: Sempre haverá exatamente uma maneira de alterar um único número que faz com que a sequência esteja correta.
Maçaneta

Respostas:

15

GolfScript (18 caracteres)

~]:^,,{^>3<~-+}?2+

A chave para manter isso curto é ? (encontrar).

Peter Taylor
fonte
15
+1 para o retrato de Fibonacci~]:^,
gnibbler
5

J, 30 23

(2+0 i.~2&}.=[:}:}:+}.)
randomra
fonte
5

Golfscript, 31 28 26 25 23

~]-1%~1{)\3$3$-=}do])\;
Volatilidade
fonte
5

APL (19)

1+1⍳⍨(1↓1⌽k)≠2+/k←⎕

Explicação:

  • k←⎕: armazena a entrada do usuário em k
  • 2+/k: soma cada par de elementos em k(ie 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: gire kpara a direita 1 e depois solte o primeiro elemento (ou seja, 1 1 2 3-> 2 3 1)
  • : encontre o local onde essas listas não são iguais
  • 1⍳⍨: encontre a localização da primeira 1nesta lista (localização do número incorreto)
  • 1+: adicione 1 para compensar o elemento descartado
marinus
fonte
4

K, 32

{2+*&~(n@n@x)=x+(n:{1_x,x 0})@x}
tmartin
fonte
4

dc, 36 32

?zszsasb[lalbdsa+dsb=x]dsxxlzz-p

dc é uma calculadora polonesa reversa, portanto, obviamente, você precisa inserir os números na ordem inversa;)

$ dc fib.dc <<< "999 13 8 5 3 2 1 1"
7
$ dc fib.dc <<< "999 1 1"
2
daniero
fonte
3

Javascript ( 69 68 61 60 55)

for(s=prompt(i=2).split(' ');s[i]-s[i-1]==s[i-2];i++);i

(60)

s=prompt(i=2).split(' ');for(;s[i]==+s[i-1]+ +s[i++-2];);--i


(61)

s=prompt(i=1).split(' ');for(k=+s[1];k+=+s[i-1],k==s[++i];);i

(68)

s=prompt(i=1).split(' ');for(k=+s[1];k+=+s[i-1],k==s[++i];);alert(i)

(69)

s=prompt(i=1).split(' ');k=+s[1];for(;k+=+s[i-1],k==s[++i];);alert(i)
mowwwalker
fonte
2

JavaScript, 70

for(n=prompt().split(' '),i=n.length;i---2;)if(n[i-2]- -n[i-1]!=n[i])i
Maçaneta da porta
fonte
2

Ruby, 66

Minha primeira tentativa de um programa Ruby (um tanto) complicado:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2
daniero
fonte
Você pode salvar alguns caracteres se substituir gets.splitpor $*( ARGV) para receber a entrada como argumentos da linha de comando, em vez de no fluxo de entrada padrão. O espaço entre pe $*também pode ser removido com segurança.
22615
2

Awk: 55

{for(i=3;i<=NF;i++)if($i+$(i-1)!=$(i+1)){print i;exit}}
Kevin
fonte
1

Python, 74

a=map(int,raw_input().split())
i=2
while a[i-2]+a[i-1]==a[i]:i+=1
print i

Eu tinha essa primeira solução, mas Doorknob respondeu à pergunta sobre o formato de entrada direito antes que eu tivesse tempo para postá-lo:

Python, 66

a,b=input(),input()
i=2
while input()==a+b:a,b=b,a+b;i+=1
print i

Pressupõe entrada separada por nova linha.

daniero
fonte
1

Matlab / Octave, 39 bytes

Agradecemos a Stewie Griffin por salvar um byte! ( -instread of ~=)

@(x)find(diff(x(2:end))-x(1:end-2),1)+1

Esta é uma função anônima que insere uma matriz e gera um número.

Experimente online!

Luis Mendo
fonte
0

Python (90)

a=map(int,raw_input().split())
print min(i for i in range(2,len(a))if a[i-2]+a[i-1]!=a[i])
beary605
fonte
0

Mathematica 59

Como a entrada delimitada por espaço é necessária, StringSplitprecisa ser empregada. O seguinte pressupõe que a entrada está na forma de uma sequência i.

s = StringSplit@i;
p = 3; While[s[[p - 1]] + s[[p - 2]] == s[[p]], p++]; p - 1
DavidC
fonte
0

VB.net (77)

Supondo que os números já estejam em um IEnumerable (Of Integer).

 Dim p = xs.Skip(2).TakeWhile(Function(c, i) c = xs.Skip(i).Take(2).Sum).Count + 2
Adam Speight
fonte
0

Haskell, 48

f l=length$fst$span id$zipWith(==)l$1:scanl(+)1l
orgulhoso haskeller
fonte
0

JS, 52B

for(s=prompt(i=2).split` `;s[i]-s[i-1]==s[i++-2];);i
user75200
fonte
0

Kotlin , 77 bytes

{val r=it.split(' ').map{it.toInt()}
var i=2
while(r[i]==r[i-1]+r[i-2])i++
i}

Embelezado

{
    val r = it.split(' ').map { it.toInt() }
    var i=2
    while(r[i] == r[i-1] + r[i-2]) i++
    i
}

Teste

var f:(String)->Int =
{val r=it.split(' ').map{it.toInt()}
var i=2
while(r[i]==r[i-1]+r[i-2])i++
i}

data class Test(val input: String, val output: Int)

val TESTS = listOf(
        Test("1 1 2 9 5 8 13", 3),
        Test("8 13 21 34 55 80", 5),
        Test("2 3 5 5 13 21", 3)
)
fun main(args: Array<String>) {
    val fails = TESTS
        .asSequence()
        .map { it to f(it.input) }
        .filter { (test, res) -> test.output != res }
        .toList()

    if (fails.isEmpty()) {
        println("Test Passed")
    } else {
        fails.forEach{ println(it)}
    }
}
jrtapsell
fonte
0

QBIC , 31 bytes

_!_!{_!~a+b=c|a=b┘b=c┘s=s+1\_Xs

Explicação

_!_!           Ask the user for two umbers, assign them to 'a' and 'b'
{              DO
 _!            Ask for a third number (this will be assigned to 'c' on every iteration)
 ~a+b=c        IF the previous two terms add up to the third
 |a=b          THEN shift b into a, 
   ┘b=c            and c into b
   ┘s=s+1          increment s (starts as 3 in QBIC)
 \_Xs          ELSE quit, printing the step counter

Não tenho certeza se isso é permitido; a sequência é inserida um termo por vez e o programa é interrompido por erro, não após a inserção de toda a sequência.

steenbergh
fonte