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.

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


15
+1 pour le portrait de Fibonacci~]:^,
gnibbler



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é


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

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

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

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.


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

1

JS, 52B

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


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

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

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



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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.