Reverse-Engineer ลำดับ N-Bonacci [s]


15

แก้ไข: ฉันจะรับคำตอบวันจันทร์ที่ 2/15/2016 ไบต์อาจจะอยู่ในความโปรดปรานของคุณ!

ในการท้าทาย "Print the N-Bonacci Sequence" ของเขา @DJMcGoathem อธิบายลำดับ N-bonacci โดยที่ตัวเลขNก่อนหน้าจะถูกรวมเข้าด้วยกันแทนที่จะเป็นลำดับดั้งเดิม 2 ของลำดับ Fibonacci (กล่าวว่าเป็น " ลำดับคู่ duo nacci") จากนั้นเขาก็ขอให้รับอินพุตสองตัวคือ X และ N แล้วเอาท์พุทหมายเลขX th N -nacci

ฉันขอเสนอสิ่งที่ตรงกันข้าม
รับลำดับเอาท์พุทซึ่งลำดับN -ncci มันเป็นส่วนย่อยของ ฉันพูดว่า "ส่วนย่อยของ" เพราะ:

  • A) ลำดับเหล่านี้ไม่มีที่สิ้นสุด
  • B) หากได้รับการเริ่มต้นของลำดับคุณก็สามารถนับจำนวนของ 1 นำ

ในกรณีที่มันอาจเป็นของหลายลำดับN -naC เลือกหนึ่งที่ต่ำที่สุด
ในกรณีที่มันไม่ได้อยู่ในลำดับN-nacciใด ๆโปรแกรมของคุณอาจทำสิ่งอื่นนอกเหนือจากการพิมพ์สิ่งที่อาจทำให้เข้าใจผิดว่าเป็นผลลัพธ์ พฤติกรรมเหล่านี้รวมถึง ( แต่ไม่ จำกัด เฉพาะ): อนันต์ห่วงข้อผิดพลาดความผิดพลาดลบตัวเอง (* ไอไอ * เฝ้า * ไอไอ *) หรือสร้างหลุมดำ (ตราบเท่าที่หลุมดำนี้ไม่ได้ผลิตอะไรที่จะทำได้ ถูกเข้าใจผิดว่าเป็นผลลัพธ์ที่ถูกต้อง)
เพื่อประโยชน์ของความท้าทายนี้, ลำดับเหล่านี้เริ่มต้นด้วย 1.วิธีการนี้ใด ๆN -nacci ลำดับเริ่มต้นด้วยNคน นอกจากนี้Nจะต้องเป็นจำนวนเต็มบวก ไม่มี-1 -nacci เป็นต้น

กรณีทดสอบ:

1,1,1 -> 1
49, 97 -> 7
55, 89, 144 -> 2
1 -> 1
6765 -> 2
12, 23, 45, 89 -> 12
100, 199 -> 100

1
create a black hole (as long as this black hole does not produce anything that could be mistaken for valid output).เกลียวของหลุมดำกำลังรวมกันเป็นอัตราส่วนทองคำ! มันจะต้องถูกส่งออกที่ถูกต้องสำหรับลำดับ duoacci เป็นคนแรก!
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴอาจเป็นอัตราส่วนทองคำที่สวยงาม แต่อย่าเข้าไปใกล้หลุมดำ! youtube.com/watch?v=TTUQyEr-sg0
เลเวลริเวอร์เซนต์

1
โอ้ฉันนี้เป็นมากยิ่งกว่าที่ฉันคิดเดิม ...
GamrCorps

@ mbomb007 ความแตกต่างระหว่างจำนวนเต็มบวกกับจำนวนธรรมชาติคืออะไร
ไม่ใช่ชาร์ลส์ที่

1
@ mbomb007 อา ฉันคิดว่า 1 เป็นหมายเลขธรรมชาติแรก ฉันจะต้องได้รับความคิดของตัวเลขการนับ
ไม่ว่าชาร์ลส์

คำตอบ:


7

ทับทิม, 94

ฉันค่อนข้างแปลกใจที่ฉันสามารถตีกอล์ฟนี้ได้ในอัลกอริทึมเดียวกัน! ฉันเริ่มต้นด้วยกว่า 200!

->a{1.step.find{|s|x=[1]*(s+z=a.size)
x<<x[-s,s].inject(:+)while x.max<a.max&&s>1
x[-z,z]==a}}

Ungolfed:

l=->a{
    # ooh! a built-in infinite incrementer!
    1.step.find{|s|
        # if n == 1, z is important, otherwise s.
        x=[1]*(s+z=a.size)
        ## add the next nacci number until we hit or overshot max. 
        ## if s == 1, we don't increment, so don't bother
        x<<x[-s,s].inject(:+)while x.max<g&&s>1
        # eval to true if there's a match, false if not
        x[-z,z]==a
    }
}

วิธีการที่ไม่x=[1]*(s+z=a.size)ทำงานว่า?
Cyoce

@Cyoce ถ้าถ้าn == 1อย่างนั้นเราจะไม่เพิ่มขึ้นอีกดังนั้นเราจึงต้องการอาร์เรย์ที่ 1 อย่างไรก็ตามอินพุตนั้นยาว ถ้าn > 1เราต้องการอย่างน้อยn1 ของลำดับ ดังนั้นs+a.sizeครอบคลุมn == 1สำหรับความยาวใด ๆaและมันครอบคลุมจุดเริ่มต้นของลำดับอื่น ๆ เพื่อให้เราสามารถเริ่มเพิ่มsตัวเลขออกจากแบต มันสมเหตุสมผลไหม
ไม่ใช่ชาร์ลส์ที่

@Cyoce และถ้าคุณถามคำถามที่แตกต่างกันในทับทิม[1]*numberช่วยให้อาร์เรย์ของ 1 numberมีความยาว ดังนั้นx=[1]*(s+z=a.size)กำหนดa.sizeให้zจากนั้นกำหนดให้กับxอาร์เรย์ที่มีความยาวs+z1
ไม่ใช่ชาร์ลส์ที่

3

Python 2, 176 ไบต์

def r(n,x):i,f=n,[1]*n;exec"f+=sum(f[i-n:]),;i+=1;"*(x-n);return f
l=input()
m=max(l)+len(l)
for i in range(1,m):
 if any(l==r(i,m)[b:b+len(l)]for b in range(m)):print i;break;

โปรดทราบว่าต้องใช้อินพุตในรูปแบบนี้:

[1, 1, 2, 3...]

ค่อนข้างมากกว่า

1, 1, 2, 3...

ทางออกที่ตรงไปตรงมาเป็นธรรมเพียงเพื่อให้ทุกอย่างกลิ้งไป ฉันจะพยายามเล่นกอล์ฟให้มากขึ้นเมื่อมีใครตอบ วิธีนี้ใช้ตัวสร้าง N-Bonnaci รุ่นดัดแปลงเล็กน้อยจากคำตอบของ @ Dataดังนั้นลองใช้อุปกรณ์ของเขาดู จากนั้นสำหรับแต่ละ N-Bonnaci ในช่วงของอินพุตให้ตรวจสอบว่าอินพุตเป็นส่วนประกอบของมันหรือไม่


ลองทำตามคำแนะนำเดียวกับที่ฉันให้ไว้กับเขา: เปลี่ยนf.appendให้f+=
Cyoce

@Cyoce oh duh ฉันไม่อยากจะเชื่อเลยว่าฉันคิดถึงบางอย่างที่พื้นฐาน fp
DJMcMayhem

การลาก;จำเป็นหรือไม่?
Cyoce

1

Lua, 324 323 Bytes

เมื่อฉันเห็นการส่งอื่นฉันรู้สึกว่ามีบางอย่างผิดปกติกับรหัสของฉัน ... แต่แล้วฉันจำได้ว่าเป็น Lua และไม่มีฟังก์ชั่นแฟนซีที่แปลกใหม่เหล่านี้: '(

มันสนุกมากจริงๆใช้เวลาพอสมควร

แก้ไข: บันทึกไว้ 1 ไบต์มีเคล็ดลับง่ายๆ: ใช้::label::+ แทนห่วงอนันต์ทำด้วยgoto labelwhile''

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

Ungolfed และคำอธิบาย

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

  function f(l)
  c=2
  y,z=table.remove,os.exit           -- Create pointers on table.remove and os.exit
                                     -- saves a total of 9 bytes
  while(l[1]<2)                      -- loop used to remove leading 1
  do 
    y(l,1)
    if(#l<1)                         -- we also check if it was a 1-only array
    then 
      print(1)                       -- if so, we print 1 and exit
      z()
    end 
  end

  ::q::                              -- label q, start of the infinite loop
    a={}for i=1,c do a[i]=1 end      -- fill an array with c 1s
    b={}for i=1,#l do b[i]=l[i]end   -- copy the sequence array
    while(a[#a]<b[1])                -- while max(a)<min(b)
    do
      x=0 for i=(#a-c+1>0            -- iterate from index a.length-c to
                    and #a-c+1       -- to a.length
                    or 1),#a 
      do 
        x=x+a[i]                     -- summing a's elements
      end
      a[#a+1]=x                      -- append x to a
      if a[#a]==b[1]then y(b,1)end   -- if x is equal ot a member of the sequence
                                     -- remove it
      if #b<1 then print(c)z()end    -- if b is empty, it means the subset is in a
                                     -- we print c and exit
    end                              -- else we loop again
    c=c+1                            -- with c+1
  goto q                             -- return to the start of this block
end

คุณสามารถลองLua ออนไลน์และคุณสามารถคัดลอก / วางตัวอย่างโค้ดต่อไปนี้เพื่อเรียกใช้การทดสอบบางอย่าง เมื่อฟังก์ชันนี้ออกเมื่อพบคำตอบ (วนซ้ำไม่สิ้นสุด) คุณจะต้องเปลี่ยนดัชนีที่test[]ใช้ (อย่าลืม lua คือดัชนี 1 :)

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

test={{1,1,1},
{49, 97},
{55, 89, 144},
{1},
{6765},
{12, 23, 45, 89},
{100, 199}}

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