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.

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


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



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


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

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)

3

Awk: 55

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


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

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.


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

1

JS, 52B

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


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

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

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



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.