Urutan FIBonacci

12

Untuk golf kode ini, Anda akan menerima input dari urutan fib onacci, yaitu, urutan Fibonacci normal tetapi dengan satu nomor yang salah. Lihat, urutannya fibbing ! Mengerti?:D

Tugas Anda adalah mencari tahu nomor mana yang salah, dan mencetak indeks (berbasis 0) dari nomor itu.

Sebagai contoh:

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

Spesifikasi:

  • Urutan dapat dimulai dari nomor berapa pun.
  • Dua angka pertama dari input akan selalu benar.
  • Kode terpendek (jumlah karakter) menang.
Gagang pintu
sumber
2
Apakah input harus dibatasi ruang atau dapatkah koma digunakan juga?
Volatilitas
@Volatility Input dibatasi oleh ruang.
Gagang Pintu
Tugasnya adalah menemukan hanya angka pertama , bukan? Misalnya, jika Anda mulai dari kanan di urutan pertama, Anda bisa berpikir itu 8salah karena tidak sama9+5
Luis Mendo
@LuisMendo Akan selalu ada hanya satu nomor seperti itu.
Gagang pintu
1
@LuisMendo Oke, izinkan saya menulis ulang bahwa: Akan selalu ada satu cara untuk mengubah satu nomor yang menyebabkan urutannya benar.
Gagang Pintu

Jawaban:

15

GolfScript (18 karakter)

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

Kunci untuk menjaga kekurangan ini adalah ? (Temukan).

Peter Taylor
sumber
15
+1 untuk potret Fibonacci~]:^,
gnibbler
5

J, 30 23

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

Golfscript, 31 28 26 25 23

~]-1%~1{)\3$3$-=}do])\;
Keriangan
sumber
5

APL (19)

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

Penjelasan:

  • k←⎕: simpan input pengguna di k
  • 2+/k: jumlah setiap pasangan elemen di k(yaitu 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: putar kke kanan dengan 1 dan kemudian jatuhkan elemen pertama (yaitu 1 1 2 3-> 2 3 1)
  • : temukan tempat di mana daftar ini tidak sama
  • 1⍳⍨: temukan lokasi yang pertama 1dalam daftar ini (lokasi nomor yang salah)
  • 1+: tambahkan 1 untuk mengkompensasi elemen yang dijatuhkan
marinus
sumber
4

K, 32

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

dc, 36 32

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

dc adalah kalkulator terbalik-Polandia, jadi jelas Anda perlu memasukkan angka dalam urutan terbalik;)

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

JavaScript, 70

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

Ruby, 66

Upaya pertama saya di program Ruby (agak) rumit:

p gets.split.map(&:to_i).each_cons(3).find_index{|a,b,c|a+b!=c}+2
daniero
sumber
Anda dapat menyimpan beberapa karakter jika Anda mengganti gets.splitdengan $*( ARGV) untuk mengambil input sebagai argumen baris perintah alih-alih pada aliran input standar. Ruang antara pdan $*kemudian juga bisa dihapus dengan aman.
britishtea
2

Awk: 55

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

Python, 74

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

Saya punya solusi ini dulu, tetapi Doorknob menjawab pertanyaan tentang format input tepat sebelum saya sempat mempostingnya:

Python, 66

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

Mengasumsikan input yang dipisahkan baris baru.

daniero
sumber
1

Matlab / Oktaf, 39 byte

Terima kasih kepada Stewie Griffin karena telah menghemat satu byte! ( -instread of ~=)

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

Ini adalah fungsi anonim yang menginput array dan menghasilkan angka.

Cobalah online!

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

Mathematica 59

Karena input yang dibatasi ruang diperlukan, StringSplitperlu digunakan. Berikut ini mengasumsikan bahwa input tersebut dalam bentuk string i.

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

VB.net (77)

Dengan asumsi angka sudah dalam IEnumerable (Of Integer).

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

Haskell, 48

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

JS, 52B

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

Jelly , 11 byte

ÆḞ€i$€In1i1

Cobalah online!

Erik the Outgolfer
sumber
0

Kotlin , 77 byte

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

Yg diperindahkan

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

Uji

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

QBIC , 31 byte

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

Penjelasan

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

Saya tidak yakin apakah ini diizinkan; urutan dimasukkan satu istilah pada satu waktu, dan program dibatalkan karena kesalahan, bukan setelah memasukkan seluruh urutan.

steenbergh
sumber