FIBonacci序列


13

对于此代码高尔夫球,您将收到fib onacci序列的输入,即正常的斐波纳契序列,但其中一个数字不正确。看到,序列在跳动!得到它?:D

您的工作是找出哪个数字不正确,然后打印该数字的索引(从0开始)。

例如:

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

规格:

  • 该序列可以以任意数量开始。
  • 输入的前两个数字将始终正确。
  • 最短的代码(字符数)获胜。

2
输入是否必须使用空格分隔或也可以使用逗号?
波动性

@Volatility输入以空格分隔。
Doorknob

工作是只找到第一个这样的数字,对吗?例如,如果您从第一个序列的右边开始,您可能会认为这8是不正确的,因为它不相等9+5
Luis Mendo

@LuisMendo永远只有一个这样的数字。
门把手

1
@LuisMendo好的,让我重申一下:始终只有一种方法可以更改单个数字,从而使序列正确。
门把手

Answers:


15

GolfScript(18个字符)

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

保持简短的关键是(找)。


15
+1为斐波那契的肖像~]:^,
刺客



5

APL(19)

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

说明:

  • k←⎕:将用户输入存储在 k
  • 2+/k:求和中的每一对元素k(即1 1 2 3-> 1+1 1+2 2+3-> 2 3 5
  • 1↓1⌽kk向右旋转1,然后放下第一个元素(即1 1 2 3-> 2 3 1
  • :找到这些列表不相等的地方
  • 1⍳⍨1在此列表中找到第一个的位置(错误编号的位置)
  • 1+:加1以补偿掉落的元素


4

直流,36 32

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

dc 是一个反向波兰计算器,因此显然您需要按相反顺序输入数字;)

$ 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岁

我第一次尝试(某种)复杂的Ruby程序:

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

如果更换您可以节省相当多的字符gets.split$*ARGV)把输入作为命令行参数,而不是标准输入流。p和之间的空间$*也可以安全移除。
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

我第一次有这样的解决方案,但门把手回答了这个问题有关的输入格式正确的我还没来得及将它张贴:

Python,66岁

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

假定以换行符分隔的输入。


1

VB.net(77)

假设数字已经在IEnumerable(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

Kotlin,77字节

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

美化

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

测试

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

巨蟒(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

由于StringSplit需要使用空格分隔的输入,因此需要使用。以下假设输入为字符串形式i

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



0

QBIC,31个字节

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

说明

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

我不太确定是否允许这样做;该序列一次只能输入一项,并且程序会因出错而中止,而不是在输入整个序列后才会终止。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.