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.

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


15
+1 untuk potret Fibonacci~]:^,
gnibbler



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


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

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

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

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

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.


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!


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

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

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




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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.