FIBonacciシーケンス


12

このコードゴルフでは、fibオナッチシーケンスの入力を受け取ります。つまり、通常のフィボナッチシーケンスですが、1つの数値が正しくありません。シーケンスがうんざりしているのを見てください!それを得る?: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つの数字は常に正しいです。
  • 最短のコード(文字数)が優先されます。

2
入力はスペースで区切る必要がありますか、コンマも使用できますか?
ボラティリティ

@Volatility入力はスペースで区切られます。
ドアノブ

仕事は、最初のそのような番号だけを見つけることですよね?あなたが最初のシーケンスの右から開始した場合たとえば、あなたはそれは考えることができ8、それが等しくないので、間違っている9+5
ルイスMendo

@LuisMendoそのような番号は常に1つだけです。
ドアノブ

1
@LuisMendoさて、言い直させてください:シーケンスを正しくする単一の数値を変更する方法は常に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

dc、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)

2

JavaScript、70

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

2

ルビー、66

(やや)複雑なRubyプログラムでの最初の試み:

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

()に置き換えgets.splitて、標準入力ストリームではなくコマンドライン引数として入力を取得すると、かなりの数の文字を保存できます。間のスペースとは、その後も安全に削除することができます。$*ARGVp$*
イギリス茶


1

Python、74

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

私は最初にこの解決策を持っていましたが、Doorknobは入力の形式に関する質問に答えました 、右、私はそれを投稿するための時間を持っていた前に:

Python、66

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

改行で区切られた入力を想定しています。



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

VB.net(77)

数値が既にIEnumerable(Of Integer)にあると仮定します。

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




0

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

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

これが許可されているかどうかはよくわかりません。シーケンスは一度に1つの用語で入力され、プログラムはシーケンス全体を入力した後ではなく、エラーで中止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.