Séquence de FIBonacci

13

Pour ce code golf, vous recevrez une entrée d'une séquence fib onacci, c'est-à-dire une séquence Fibonacci normale mais avec un numéro incorrect. Vous voyez, la séquence est trompeuse ! Tu piges?:D

Votre travail consiste à découvrir quel numéro est incorrect et à imprimer l'index (basé sur 0) de ce numéro.

Par exemple:

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

Caractéristiques:

  • La séquence peut commencer à n'importe quel nombre.
  • Les deux premiers chiffres de l'entrée seront toujours corrects.
  • Le code le plus court (nombre de caractères) gagne.
Poignée de porte
la source
2
L'entrée doit-elle être délimitée par des espaces ou des virgules peuvent-elles également être utilisées?
Volatilité
@Volatility Input est délimité par des espaces.
Poignée de porte
Le travail consiste à ne trouver que le premier de ces numéros, non? Par exemple, si vous avez commencé par la droite dans la première séquence, vous pourriez penser que 8c'est incorrect parce que ce n'est pas égal9+5
Luis Mendo
@LuisMendo Il n'y aura toujours qu'un seul de ces numéros.
Poignée de porte
1
@LuisMendo D'accord, permettez-moi de reformuler cela: Il y aura toujours exactement une façon de changer un seul numéro qui rend la séquence correcte.
Poignée de porte

Réponses:

15

GolfScript (18 caractères)

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

La clé pour garder ce court est ? (trouver).

Peter Taylor
la source
15
+1 pour le portrait de Fibonacci~]:^,
gnibbler
5

J, 30 23

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

Golfscript, 31 28 26 25 23

~]-1%~1{)\3$3$-=}do])\;
Volatilité
la source
5

APL (19)

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

Explication:

  • k←⎕: stocker les entrées utilisateur dans k
  • 2+/k: additionne chaque paire d'éléments dans k(ie 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: faire pivoter de 1 kvers la droite puis déposer le premier élément (c'est 1 1 2 3-à- dire -> 2 3 1)
  • : trouver l'endroit où ces listes ne sont pas égales
  • 1⍳⍨: trouver l'emplacement du premier 1dans cette liste (emplacement du numéro incorrect)
  • 1+: ajoutez 1 pour compenser l'élément supprimé
marinus
la source
4

K, 32

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

dc, 36 32

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

dc est une calculatrice polonaise inversée, vous devez donc évidemment saisir les nombres dans l'ordre inverse;)

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

Awk: 55

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

JavaScript, 70

for(n=prompt().split(' '),i=n.length;i---2;)if(n[i-2]- -n[i-1]!=n[i])i
Poignée de porte
la source
2

Rubis, 66

Ma première tentative d'un programme Ruby (quelque peu) compliqué:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2
daniero
la source
Vous pouvez enregistrer un bon nombre de caractères si vous remplacez gets.splitpar $*( ARGV) pour prendre l'entrée comme arguments de ligne de commande au lieu du flux d'entrée standard. L'espace entre pet $*peut également être retiré en toute sécurité.
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

J'avais d'abord cette solution, mais Doorknob a répondu à la question sur le format d'entrée juste avant que je n'aie le temps de la poster:

Python, 66

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

Suppose une entrée séparée par une nouvelle ligne.

daniero
la source
1

VB.net (77)

En supposant que les nombres sont déjà dans un IEnumerable (Of Integer).

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

JS, 52B

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

Matlab / Octave, 39 octets

Merci à Stewie Griffin d' avoir enregistré un octet! ( -instread de ~=)

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

Il s'agit d'une fonction anonyme qui entre un tableau et sort un nombre.

Essayez-le en ligne!

Luis Mendo
la source
1

Kotlin , 77 octets

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

Embellie

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

Tester

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
la source
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
la source
0

Mathematica 59

Parce qu'une entrée délimitée par l'espace est requise, StringSplitdoit être utilisée. Ce qui suit suppose que l'entrée est sous la forme d'une chaîne i.

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

Haskell, 48

f l=length$fst$span id$zipWith(==)l$1:scanl(+)1l
fier haskeller
la source
0

QBIC , 31 octets

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

Explication

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

Je ne sais pas trop si cela est autorisé; la séquence est entrée un terme à la fois et le programme s'interrompt en cas d'erreur, pas après avoir entré la séquence entière.

steenbergh
la source