Fibonacci-Folge

12

Für diesen Code Golf, werden Sie einen Eingang eines Empfangs fib onacci Folge, dass eine normale Fibonacci - Folge ist aber mit einer Zahl falsch. Seht, die Sequenz ist fibrillierend ! Kapiert?:D

Sie müssen herausfinden, welche Nummer falsch ist, und den Index (0-basiert) dieser Nummer ausdrucken.

Beispielsweise:

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

Spezifikationen:

  • Die Sequenz kann bei einer beliebigen Nummer beginnen.
  • Die ersten beiden Zahlen der Eingabe sind immer korrekt.
  • Der kürzeste Code (Anzahl der Zeichen) gewinnt.
Türknauf
quelle
2
Muss die Eingabe durch Leerzeichen getrennt sein oder können auch Kommas verwendet werden?
Volatility
@Volatility Die Eingabe ist durch Leerzeichen getrennt.
Türknauf
Die Aufgabe besteht darin, nur die erste solche Nummer zu finden, oder? Wenn Sie beispielsweise in der ersten Sequenz von rechts angefangen haben, könnten Sie denken, dass dies 8falsch ist, weil es nicht gleich ist9+5
Luis Mendo
@ LuisMendo Es wird immer nur eine solche Nummer geben.
Türklinke
1
@LuisMendo Okay, lassen Sie mich das umformulieren: Es wird immer genau eine Möglichkeit geben, eine einzelne Zahl zu ändern, die dazu führt, dass die Reihenfolge korrekt ist.
Türknauf

Antworten:

15

GolfScript (18 Zeichen)

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

Der Schlüssel, um dies kurz zu halten, ist ? (finden).

Peter Taylor
quelle
15
+1 für das Porträt von Fibonacci~]:^,
Gnibbler
5

J 30, 23

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

Golfscript, 31 28 26 25 23

~]-1%~1{)\3$3$-=}do])\;
Flüchtigkeit
quelle
5

APL (19)

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

Erläuterung:

  • k←⎕: Benutzereingaben speichern in k
  • 2+/k: summiere jedes Elementpaar in k(dh 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: um 1 knach rechts drehen und dann das erste Element ablegen (dh 1 1 2 3-> 2 3 1)
  • : finde den Ort, an dem diese Listen nicht gleich sind
  • 1⍳⍨: finde den Ort des ersten 1in dieser Liste (Ort der falschen Nummer)
  • 1+: Addiere 1, um das abgelegte Element zu kompensieren
Marinus
quelle
4

K 32

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

DC, 36 32

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

dc ist ein umgekehrter polnischer Taschenrechner, daher müssen Sie die Zahlen natürlich in umgekehrter Reihenfolge eingeben;)

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

JavaScript, 70

for(n=prompt().split(' '),i=n.length;i---2;)if(n[i-2]- -n[i-1]!=n[i])i
Türknauf
quelle
2

Rubin, 66

Mein erster Versuch mit einem (etwas) komplizierten Ruby-Programm:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2
daniero
quelle
Sie können schon einige Zeichen speichern , wenn Sie ersetzen gets.splitmit $*( ARGV) zu übernehmen Eingabe als Befehlszeilenargumente statt auf dem Standard - Eingabestrom. Der Raum zwischen pund $*kann dann auch sicher entfernt werden.
britishtea
2

Awk: 55

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

Python, 74

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

Ich hatte diese Lösung zuerst, aber Doorknob beantwortet die Frage nach dem Format der Eingangs rechts , bevor ich Zeit hatte , es zu schreiben:

Python, 66

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

Nimmt eine durch Zeilenwechsel getrennte Eingabe an.

daniero
quelle
1

Matlab / Octave, 39 Bytes

Vielen Dank an Stewie Griffin für das Speichern eines Bytes! ( -instread von ~=)

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

Dies ist eine anonyme Funktion, die ein Array eingibt und eine Zahl ausgibt.

Probieren Sie es online!

Luis Mendo
quelle
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
quelle
0

Mathematica 59

Da durch Leerzeichen getrennte Eingaben erforderlich sind, StringSplitmüssen diese verwendet werden. Im Folgenden wird davon ausgegangen, dass die Eingabe in Form einer Zeichenfolge erfolgt i.

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

VB.net (77)

Angenommen, die Zahlen sind bereits in einem IEnumerable (Of Integer).

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

Haskell, 48

f l=length$fst$span id$zipWith(==)l$1:scanl(+)1l
stolzer haskeller
quelle
0

JS, 52B

for(s=prompt(i=2).split` `;s[i]-s[i-1]==s[i++-2];);i
user75200
quelle
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}

Verschönert

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

Prüfung

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

QBIC , 31 Bytes

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

Erläuterung

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

Ich bin mir nicht ganz sicher, ob das erlaubt ist. Die Sequenz wird einzeln eingegeben, und das Programm bricht bei einem Fehler ab, nicht nach der Eingabe der gesamten Sequenz.

steenbergh
quelle