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.

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).


15
+1 para o retrato de Fibonacci~]:^,
gnibbler



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


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

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)


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

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

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.



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])

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

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


0

JS, 52B

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


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

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.

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.