Sequenza FIBonacci


13

Per questo codice golf, riceverai un input di una sequenza fib onacci, ovvero una normale sequenza di Fibonacci ma con un numero errato. Vedi, la sequenza si sta inasprendo ! Prendilo?:D

Il tuo compito è scoprire quale numero non è corretto e stampare l'indice (basato su 0) di quel numero.

Per esempio:

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

specifiche tecniche:

  • La sequenza può iniziare da qualsiasi numero.
  • I primi due numeri dell'ingresso saranno sempre corretti.
  • Vince il codice più breve (conteggio caratteri).

2
L'ingresso deve essere delimitato da spazi o è possibile utilizzare anche virgole?
Volatilità il

@Volatility Input è delimitato da spazi.
Maniglia della porta

Il lavoro è trovare solo il primo di questi numeri, giusto? Ad esempio, se hai iniziato da destra nella prima sequenza potresti pensare che 8sia errato perché non è uguale9+5
Luis Mendo,

@LuisMendo Ci sarà sempre solo un numero simile.
Maniglia della porta

1
@LuisMendo Va bene, lasciami riformulare questo: ci sarà sempre esattamente un modo per cambiare un singolo numero che fa sì che la sequenza sia corretta.
Maniglia della porta

Risposte:


15

GolfScript (18 caratteri)

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

La chiave per mantenere questo corto è ? (trova).


15
+1 per il ritratto di Fibonacci~]:^,
gnibbler,



5

APL (19)

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

Spiegazione:

  • k←⎕: memorizza l'input dell'utente in k
  • 2+/k: somma ogni coppia di elementi in k(cioè 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: ruota ka destra di 1 e poi rilascia il primo elemento (es. 1 1 2 3-> 2 3 1)
  • : trova il posto in cui questi elenchi non sono uguali
  • 1⍳⍨: trova la posizione della prima 1in questo elenco (posizione del numero errato)
  • 1+: aggiungi 1 per compensare l'elemento rilasciato


4

dc, 36 32

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

dc è una calcolatrice polacca inversa, quindi ovviamente è necessario inserire i numeri in ordine 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

JavaScript, 70

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

2

Ruby, 66

Il mio primo tentativo di un (piuttosto) complicato programma Ruby:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2

È possibile salvare alcuni caratteri se si sostituisce gets.splitcon $*( ARGV) per accettare l'input come argomenti della riga di comando anziché sul flusso di input standard. Lo spazio tra pe $*può quindi essere rimosso in modo sicuro.
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

Prima ho avuto questa soluzione, ma Doorknob ha risposto alla domanda sul formato dell'input proprio prima che avessi il tempo di pubblicarla:

Python, 66

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

Presuppone l'input separato da newline.


1

VB.net (77)

Supponendo che i numeri siano già in 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

Matlab / Octave, 39 byte

Grazie a Stewie Griffin per aver salvato un byte! ( -istruisci di ~=)

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

Questa è una funzione anonima che immette un array e genera un numero.

Provalo online!


1

Kotlin , 77 byte

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

Abbellire

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

Test

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

Poiché è richiesto un input delimitato da spazi, StringSplitdeve essere impiegato. Di seguito si presume che l'input abbia la forma di una stringa i.

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



0

QBIC , 31 byte

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

Spiegazione

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

Non sono del tutto sicuro se questo è permesso; la sequenza viene inserita un termine alla volta e il programma si interrompe in caso di errore, non dopo aver inserito l'intera sequenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.