ลำดับ 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 Input เป็นตัวคั่นช่องว่าง
Doorknob

งานจะหาเฉพาะหมายเลขแรกเท่านั้นใช่ไหม ตัวอย่างเช่นหากคุณเริ่มต้นจากด้านขวาในลำดับแรกคุณอาจคิดว่า8ไม่ถูกต้องเพราะมันไม่เท่ากัน9+5
Luis Mendo

@LuisMendo จะมีหมายเลขดังกล่าวเพียงหมายเลขเดียวเสมอ
Doorknob

1
@ LuisMendo เอาล่ะขอให้ฉันพูดใหม่ว่า: จะมีวิธีหนึ่งที่จะเปลี่ยนหมายเลขเดียวที่ทำให้ลำดับถูกต้องเสมอ
Doorknob

คำตอบ:





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⌽k: หมุนkไปทางขวาทีละ 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

ทับทิม, 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

ผมมีวิธีการแก้ปัญหานี้เป็นครั้งแรก แต่ Doorknob ตอบคำถามเกี่ยวกับรูปแบบของการป้อนข้อมูลที่ถูกต้องก่อนที่ผมจะมีเวลาที่จะโพสต์:

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 (จำนวนเต็ม) แล้ว

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



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

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

ฉันไม่แน่ใจว่าสิ่งนี้จะได้รับอนุญาตหรือไม่ ลำดับจะถูกป้อนหนึ่งคำในแต่ละครั้งและโปรแกรมจะยกเลิกข้อผิดพลาดไม่ใช่หลังจากป้อนลำดับทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.