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.

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


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



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


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

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)

2

JavaScript, 70

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

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

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

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.



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

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

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


0

JS, 52B

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


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.