Chuỗi FIB


12

Đối với golf mã này, bạn sẽ nhận được một đầu vào của một fib onacci trình tự, có nghĩa là, một Fibonacci chuỗi bình thường nhưng với một số không chính xác. Xem, trình tự đang bị ! Hiểu rồi?:D

Công việc của bạn là tìm ra số nào không chính xác và in chỉ mục (dựa trên 0) của số đó.

Ví dụ:

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

Thông số kỹ thuật:

  • Trình tự có thể bắt đầu ở bất kỳ số nào.
  • Hai số đầu tiên của đầu vào sẽ luôn luôn chính xác.
  • Mã ngắn nhất (số ký tự) thắng.

2
Đầu vào có phải được phân cách bằng dấu cách hoặc có thể sử dụng dấu phẩy không?
Biến động

@Volatility Input được phân cách bằng dấu cách.
Doorknob

Công việc là chỉ tìm số đầu tiên như vậy, phải không? Ví dụ: nếu bạn bắt đầu từ bên phải trong chuỗi đầu tiên, bạn có thể nghĩ rằng điều đó 8không đúng vì nó không bằng nhau9+5
Luis Mendo

@LuisMendo Sẽ luôn có một số như vậy.
Doorknob

1
@LuisMendo Được rồi, hãy để tôi điều chỉnh lại rằng: Sẽ luôn có một cách chính xác để thay đổi một số duy nhất làm cho chuỗi chính xác.
Doorknob

Câu trả lời:


15

GolfScript (18 ký tự)

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

Chìa khóa để giữ ngắn này là ? (tìm thấy).


15
+1 cho bức chân dung của Fibonacci~]:^,
gnibbler



5

APL (19)

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

Giải trình:

  • k←⎕: lưu trữ đầu vào của người dùng trong k
  • 2+/k: tổng hợp từng cặp phần tử trong k(tức là 1 1 2 3-> 1+1 1+2 2+3-> 2 3 5)
  • 1↓1⌽k: xoay ksang phải 1 và sau đó thả phần tử đầu tiên (nghĩa là 1 1 2 3-> 2 3 1)
  • : tìm nơi mà các danh sách này không bằng nhau
  • 1⍳⍨: tìm vị trí đầu tiên 1trong danh sách này (vị trí của số không chính xác)
  • 1+: thêm 1 để bù cho phần tử bị rơi


4

đc, 36 32

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

dc là một máy tính đảo ngược tiếng Ba Lan, vì vậy rõ ràng bạn cần nhập các số theo thứ tự ngược lại;)

$ 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

Ruby, 66

Nỗ lực đầu tiên của tôi tại một chương trình Ruby (phần nào) phức tạp:

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

Bạn có thể lưu khá nhiều ký tự nếu bạn thay thế gets.splitbằng $*( ARGV) để lấy đầu vào làm đối số dòng lệnh thay vì trên luồng đầu vào tiêu chuẩn. Khoảng cách giữa p$*sau đó cũng có thể được gỡ bỏ một cách an toàn.
Anh

2

Awk: 55

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

1

Con trăn, 74

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

Tôi đã có giải pháp này trước tiên, nhưng Doorknob đã trả lời câu hỏi về định dạng đầu vào ngay trước khi tôi có thời gian để đăng nó:

Con trăn, 66

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

Giả sử đầu vào tách dòng mới.



0

Con trăn (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

Toán học 59

Bởi vì đầu vào phân cách không gian là bắt buộc, StringSplitcần phải được sử dụng. Các giả định sau đây cho rằng đầu vào ở dạng chuỗi i.

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

0

VB.net (77)

Giả sử các số đã có trong 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}

Làm đẹp

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

Kiểm tra

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

Giải trình

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

Tôi không chắc chắn nếu điều này được cho phép; chuỗi được nhập một thuật ngữ tại một thời điểm và chương trình hủy bỏ lỗi, không phải sau khi nhập toàn bộ chuỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.