Secuencia Fibonacci

13

Para este código de golf, recibirá una entrada de una secuencia fib onacci, es decir, una secuencia normal de Fibonacci pero con un número incorrecto. ¡Mira, la secuencia es fibrosa ! ¿Consíguelo?:D

Su trabajo es averiguar qué número es incorrecto e imprimir el índice (basado en 0) de ese número.

Por ejemplo:

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

Especificaciones:

  • La secuencia puede comenzar en cualquier número.
  • Los dos primeros números de la entrada siempre serán correctos.
  • El código más corto (recuento de caracteres) gana.
Pomo de la puerta
fuente
2
¿La entrada tiene que estar delimitada por espacios o también se pueden usar comas?
Volatilidad
@La entrada de volatilidad está delimitada por espacios.
Pomo de la puerta
El trabajo es encontrar solo el primer número, ¿verdad? Por ejemplo, si comenzaste desde la derecha en la primera secuencia, podrías pensar que 8es incorrecto porque no es igual9+5
Luis Mendo
@LuisMendo Siempre habrá solo uno de esos números.
Pomo de la puerta
1
@LuisMendo Bien, permítanme reformular eso: siempre habrá exactamente una forma de cambiar un solo número que haga que la secuencia sea correcta.
Pomo de la puerta

Respuestas:

15

GolfScript (18 caracteres)

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

La clave para mantener este corto es ? (encontrar).

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

J, 30 23

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

Golfscript, 31 28 26 25 23

~]-1%~1{)\3$3$-=}do])\;
Volatilidad
fuente
5

APL (19)

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

Explicación:

  • k←⎕: almacena la entrada del usuario en k
  • 2+/k: suma cada par de elementos en k(es decir, 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: gire ka la derecha en 1 y luego suelte el primer elemento (es decir, 1 1 2 3-> 2 3 1)
  • : encuentra el lugar donde estas listas no son iguales
  • 1⍳⍨: encuentre la ubicación del primero 1en esta lista (ubicación del número incorrecto)
  • 1+: agregue 1 para compensar el elemento descartado
marinus
fuente
4

K, 32

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

dc, 36 32

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

dc es una calculadora de polaco inverso, por lo que obviamente debe ingresar los números en orden inverso;)

$ dc fib.dc <<< "999 13 8 5 3 2 1 1"
7
$ dc fib.dc <<< "999 1 1"
2
daniero
fuente
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
fuente
3

Awk: 55

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

JavaScript, 70

for(n=prompt().split(' '),i=n.length;i---2;)if(n[i-2]- -n[i-1]!=n[i])i
Pomo de la puerta
fuente
2

Rubí, 66

Mi primer intento en un programa Ruby (algo) complicado:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2
daniero
fuente
Puede guardar bastantes caracteres si reemplaza gets.splitcon $*( ARGV) para tomar la entrada como argumentos de línea de comando en lugar de en la secuencia de entrada estándar. El espacio entre py $*también se puede eliminar de forma segura.
britishtea
1

Python, 74

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

Primero tuve esta solución, pero Doorknob respondió la pregunta sobre el formato de entrada justo antes de que tuviera tiempo de publicarla:

Python, 66

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

Asume una entrada separada de nueva línea.

daniero
fuente
1

VB.net (77)

Suponiendo que los números ya están en un IEnumerable (Of Integer).

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

JS, 52B

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

Matlab / Octave, 39 bytes

¡Gracias a Stewie Griffin por guardar un byte! ( -incrustado de ~=)

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

Esta es una función anónima que ingresa una matriz y genera un número.

Pruébalo en línea!

Luis Mendo
fuente
1

Kotlin , 77 bytes

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

Embellecido

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

Prueba

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
fuente
0

Pitón (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
fuente
0

Mathematica 59

Debido a que se requiere una entrada delimitada por espacios, StringSplitdebe emplearse. Lo siguiente asume que la entrada tiene la forma de una cadena i.

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

Haskell, 48

f l=length$fst$span id$zipWith(==)l$1:scanl(+)1l
orgulloso Haskeller
fuente
0

QBIC , 31 bytes

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

Explicación

_!_!           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

No estoy muy seguro de si esto está permitido; la secuencia se ingresa un término a la vez, y el programa aborta por error, no después de ingresar la secuencia completa.

Steenbergh
fuente