1, 2, 4, 8, 16, … 33?


24

ท้าทาย

เขียนฟังก์ชั่น / โปรแกรมที่ส่งออกnองค์ประกอบ 'หรือnองค์ประกอบแรกในลำดับหมายเลขที่รู้จักกันดี:

         1, 2, 4, 8, 16 ...

โอ้รอ ... ฉันลืมตัวเลขสองสามตัวแรก:

1, 1, 1, 1, 2, 4, 8, 16 ...

Heck ฉันจะเพิ่มอีกสองสามอย่างเพื่อวัดที่ดี:

1, 1, 1, 1, 2, 4, 8, 16, 33, 69, 146, 312, 673, 1463, 3202, 7050, 15605, 34705 ...

ตัวเลขคือหมายเลขคาตาลันทั่วไปที่กำหนดโดยสูตร (zero-indexed):

a(n+1)=a(n)+Σk=2n-1a(k)a(n-1-k)

ที่ไหน

a(0)=a(1)=a(2)=a(3)=1

นี่คือOEIS A004149

คุณอาจเลือกว่าคุณต้องการให้มีการจัดลำดับศูนย์หรือหนึ่งดัชนี แน่นอนว่าลำดับจะต้องเหมือนกันดังนั้นคุณต้องเขียนสูตรใหม่หากคุณมีดัชนีแบบเดียว


ถูกต้องฉันถ้าฉันผิดที่นี่ แต่การปรับเปลี่ยนสูตรหนึ่งที่มีการจัดทำดัชนีคือการเปลี่ยนa(n-1-k)ให้a(n-k)ถูกต้อง?
Sumner18

9
สิ่งนี้ทำให้ฉันนึกถึงกฎหมายที่แข็งแกร่งของคนตัวเล็ก
Luis Mendo

คำตอบ:


23

Pythonขนาด 51 ไบต์

f=lambda n,k=2:n<3or k<n and f(k)*f(n-k-2)+f(n,k+1)

ลองออนไลน์!

ลดความซับซ้อนของสูตรเล็กน้อย:

a(n)=Σk=2n-1a(k)a(n-2-k)

a(-1)=a(0)=a(1)=a(2)=1


8
ขอแสดงความยินดีกับ 100k !!
Stewie Griffin

ตั้งแต่ฉันมาถึงวิธีนี้ด้วยตนเองฉันต้องบอกว่าเส้นทางที่ตรงไปตรงมาเป็นหลุมเป็นบ่อ ...
Erik the Outgolfer

10

Perl 6 , 44 ไบต์

{1,1,1,1,{sum @_[2..*]Z*@_[@_-4...0,0]}...*}

ลองออนไลน์!

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

คำอธิบาย:

{                                          }  # Anonymous code block
                                       ...*   # Create an infinite sequence
 1,1,1,1,                                     # Starting with four 1s
         {                            }       # Where each new element is:
          sum                                   # The sum of
              @_[2..*]                          # The second element onwards
                      Z*                        # Zip multiplied with
                        @_[@_-4...0  ]          # The fourth last element backwards
                                   ,0           # And 1

10

05AB1E , 14 13 11 ไบต์

$ƒˆ¯Âø¨¨¨PO

ลองออนไลน์!

เอาท์พุตองค์ประกอบที่ n, ดัชนี 0

$                # push 1 and the input
 ƒ               # repeat (input+1) times
  ˆ              #  add the top of the stack (initially 1) to the global array
   ¯             #  push the global array
    Â            #  and a reversed copy of it
     ø           #  zip the two together, giving a list of pairs
      ¨¨¨        #  drop the last 3 pairs
         P       #  take the product of each pair (or 1 if the list is empty)
          O      #  take the sum of those products
                 #  after the last iteration, this is implicitly output;
                 #  otherwise, it's added to the global array by the next iteration

7

JavaScript (ES6), 42 ไบต์

พอร์ตของ การแก้ปัญหาของ XNOR

0 การจัดทำดัชนี

f=(n,k=2)=>n<3||k<n&&f(k)*f(n+~++k)+f(n,k)

ลองออนไลน์!


JavaScript (ES6)  83  75 ไบต์

วิธีแก้ปัญหาที่เร็วกว่าเรียกซ้ำได้น้อยลง

0 การจัดทำดัชนี

f=(n,i,a=[p=1])=>a[n]||f(n,-~i,[...a,p+=(h=k=>k<i&&a[k]*a[i-++k]+h(k))(2)])

ลองออนไลน์!



6

ภาษา Wolfram (Mathematica)ขนาด 36 ไบต์

Sum[#0@i#0[#-i-1],{i,3,#-1}]/. 0->1&

ลองออนไลน์!

1 การจัดทำดัชนี

ลำดับที่ 2 การจัดทำดัชนีเป็น 4 Sum[#0@i#0[#-i],{i,#-4}]/. 0->1&ไบต์สั้น: ลองออนไลน์!


2
น่าประทับใจว่านี่สั้นกว่าตัวเครื่องCatalanNumber!
erfink

6

05AB1E , 17 13 ไบต์

4Å1λ£₁λ¨Â¦¦s¦¦*O+

ไม่สั้นกว่าคำตอบ 05AB1E ที่มีอยู่แต่ฉันต้องการลองใช้ฟังก์ชันการเรียกซ้ำของรุ่น 05AB1E ใหม่เพื่อฝึกฝนให้กับตัวเอง อาจเล่นกอล์ฟได้ไม่กี่ไบต์ แก้ไข: และก็แน่นอนสามารถดูรุ่น recursive ของ@Grimy 05AB1E คำตอบ 's ด้านล่างซึ่งเป็น13ไบต์

n

n£è
£

คำอธิบาย:


a(n)=a(n-1)+Σk=2n-1(a(k)a(n-1-k))

a(0)=a(1)=a(2)=a(3)=1

   λ               # Create a recursive environment,
    £              # to output the first (implicit) input amount of results after we're done
4Å1                # Start this recursive list with [1,1,1,1], thus a(0)=a(1)=a(2)=a(3)=1
                   # Within the recursive environment, do the following:
      λ            #  Push the list of values in the range [a(0),a(n)]
       ¨           #  Remove the last one to make the range [a(0),a(n-1)]
        Â          #  Bifurcate this list (short for Duplicate & Reverse copy)
         ¦¦        #  Remove the first two items of the reversed list,
                   #  so we'll have a list with the values in the range [a(n-3),a(0)]
           s       #  Swap to get the [a(0),a(n-1)] list again
            ¦¦     #  Remove the first two items of this list as well,
                   #  so we'll have a list with the values in the range [a(2),a(n-1)]
              *    #  Multiply the values at the same indices in both lists,
                   #  so we'll have a list with the values [a(n-3)*a(2),...,a(0)*a(n-1)]
               O   #  Take the sum of this list
               +  #  And add it to the a(n-1)'th value
                   # (afterwards the resulting list is output implicitly)

@Grimyเวอร์ชัน13 ไบต์ (ตรวจสอบให้แน่ใจว่าได้ยกเลิกคำตอบของเขาหากคุณยังไม่ได้!):

1λ£λ1šÂ¨¨¨øPO

n

สามารถเปลี่ยนเป็นดัชนีที่ใช้ 0 หรืออีกครั้งในรายการที่ไม่มีที่สิ้นสุดแทน:
- ดัชนี (ตาม 0) 1λèλ1šÂ¨¨¨øPO: ลองออนไลน์ ;
- รายการที่ไม่มีที่สิ้นสุดλλ1šÂ¨¨¨øPO: ลองออนไลน์ (โปรดทราบว่า 2 ไบต์จะถูกบันทึกไว้ที่นี่แทน 1 เนื่องจากสภาพแวดล้อมแบบเรียกซ้ำเริ่มต้นด้วยa(0)=1

คำอธิบาย:

สิ่งนี้ใช้สูตรที่@xnorใช้แทนคำตอบของ Pythonดังนี้:
a(n)=Σk=2n-1(a(k)a(n-2-k))

a(-1)=a(0)=a(1)=a(2)=1

 λ             # Create a recursive environment,
  £            # to output the first (implicit) input amount of results after we're done
1              # Start this recursive list with 1, thus a(0)=1
               # Within the recursive environment, do the following:
   λ           #  Push the list of values in the range [a(0),a(n)]
    1š         #  Prepend 1 in front of this list
      Â        #  Bifurcate the list (short for Duplicate & Reverse copy)
       ¨¨¨     #  Remove (up to) the last three value in this reversed list
          ø    #  Create pairs with the list we bifurcated earlier
               #  (which will automatically remove any trailing items of the longer list)
           P   #  Get the product of each pair (which will result in 1 for an empty list)
            O  #  And sum the entire list
               # (afterwards the resulting list is output implicitly)

1
น่าสนใจว่าสิ่งนี้สามารถแก้ปัญหา (1200) ใน 40 วินาทีใน tio ในขณะที่วิธีการเรียกซ้ำอื่น ๆ หมดเวลาสำหรับตัวเลขที่มากกว่า 100 ...
Stewie Griffin

1
ฉันยังสร้าง (แต่ไม่ได้เผยแพร่) รุ่นที่เรียกซ้ำ มันเป็น13 ไบต์สำหรับคำ n แรกหรือ11 ไบต์สำหรับรายการที่ไม่มีที่สิ้นสุด ปลอกพิเศษ (n-1) มีค่าใช้จ่ายจำนวนมากไบต์และไม่จำเป็นต้องใช้ (ดูตัวอย่างสูตรของ xnor )
Grimmy

@Grimy คุณสนใจไหมถ้าฉันเพิ่มโซลูชันแบบเรียกซ้ำลงในคำตอบของฉัน (ให้เครดิตคุณแน่นอน) ฉันจะทิ้งคำตอบดั้งเดิมไว้เช่นกัน แต่มันเป็นเรื่องดีที่ได้เห็นความแตกต่างระหว่างสูตรดั้งเดิมกับสูตรประหยัด byte ของ xnor :)
Kevin Cruijssen

1
แน่นอนว่าไม่เป็นไร!
Grimmy

@StewieGriffin ใช่ฉันรู้สึกประทับใจกับความเร็วของฟังก์ชั่นที่ไม่สิ้นสุดซ้ำเหล่านี้ อาจเป็นหนึ่งในจุดแข็งของ Elixir และแน่นอนว่าเป็นเพราะตัวโหลดขี้เกียจในตัว มันจะคำนวณn=100ใน 0.65 วินาทีแต่เมื่อผมปิดการใช้งานขี้เกียจโหลดมันจะหมดเวลาหลังจาก 60 n=25วินาทีแทนแม้สำหรับ
Kevin Cruijssen





2

Japt , 19 17 16 ไบต์

ส่งออกnคำศัพท์ที่ 1 ซึ่งจัดทำดัชนีไว้

@Zí*Zz2)Ťx}g4Æ1

ลองมัน

@Zí*Zz2)Ťx}g4Æ1     :Implicit input of integer U
@                    :Function taking an array as an argument via parameter Z
 Zí                  :  Interleave Z with
    Zz2              :  Z rotated clockwise by 180 degrees (simply reversing would be a bye shorter but would modify the original array)
   *                 :  Reduce each pair by multiplcation
       )             :  End interleave
        Å            :  Slice off the first element
         ¤           :  Slice off the first 2 elements
          x          :  Reduce by addition
           }         :End function
            g        :Pass the following as Z, push the result back to it and repeat until it has length U
             4Æ1     :Map the range [0,4) to 1s
                     :Implicit output of the last element

1

Haskell , 65 ไบต์

f a|a<4=1|z<-g[2..a]=sum$zipWith(*)z$reverse(1:g[0..a-4])
g=map f

ลองออนไลน์!

คุณสามารถใช้fเพื่อรับองค์ประกอบเดียวของลำดับหรือส่งรายการค่าไปยังgและรับดัชนีทั้งหมดสำหรับรายการนั้น


1

ออกมา (gforth) , 99 81 ไบต์

: f recursive dup 4 > if 0 over 3 do over 1- i - f i f * + loop else 1 then nip ;

ลองออนไลน์!

เอาต์พุตเป็นคำที่ n และอินพุตถูกจัดทำดัชนี 1

แก้ไข: บันทึก 17 ไบต์โดยเปลี่ยนเป็นสูตรของ xnor บันทึกอีก 1 ไบต์โดยใช้ 1-indexed

รหัสคำอธิบาย

: f                     \ start a new word definition
  recursive             \ mark that this word will be recursive
  dup 4 >               \ duplicate the input and check if it is greater than 4
  if                    \ if it is:
    0 over              \ create an accumulator and copy n to top of stack
    3 do                \ start counted loop from 3 to n-1
      over 1- i - f     \ recursively calculate f(n-1-i)
      i f               \ recursively calculate f(i)
      * +               \ multiply results and add to accumulator
    loop                \ end the counted loop        
  else                  \ otherwise, if n < 5
    1                   \ put 1 on the stack
  then                  \ end the if block
  nip                   \ drop n from the stack
;                       \ end the word definition

1

ถ่าน 26 ไบต์

F⁵⊞υ¹FN⊞υΣ✂E⮌υ×κ§υλ³→I§υ±⁴

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน พิมพ์หมายเลขที่ 0 ที่จัดทำดัชนีแม้ว่าจะคำนวณโดยใช้การจัดทำดัชนี 1 รายการภายใน คำอธิบาย:

F⁵⊞υ¹

a[0] = a[1] = a[2] = a[3] = a[4] = 1เริ่มต้นด้วย ใช่นี่เป็นดัชนี 1 แต่แล้วมีค่าเป็นศูนย์เพิ่มเติม นั่นคือรหัสกอล์ฟสำหรับคุณ

FN

คำนวณnเงื่อนไขเพิ่มเติม นี้เป็น overkill n<5แต่มันก็ทำให้การหาระยะที่ต้องการได้ง่ายขึ้นเมื่อ

⊞υΣ✂E⮌υ×κ§υλ³

สำหรับแต่ละเทอมให้คำนวณเทอมถัดไปเป็นผลรวมของเทอมจนถึงเทอร์มินัลคูณด้วยการย้อนกลับของเทอมจนถึงไม่รวมสามเทอม

นี่คือไม่ใช้เพื่อหลอกลวง Charcoal ในการแยกวิเคราะห์รูปแบบ 2 อาร์กิวเมนต์ของSliceมิฉะนั้นฉันจะต้องใช้วิธี golfy น้อยกว่าในการลบสามคำ

I§υ±⁴

เอาท์พุทเทอมสุดท้ายที่ 4


1

Pyth , 30 ไบต์

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<J

ลองออนไลน์!

ส่งคืนแรก n องค์ประกอบของลำดับ

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<JQ # Full program, last Q = input (implicitly added)
J*4]1                  # J = 4 * [1] (=[1,1,1,1])
VQ                     # for N in range(Q):
  =+J                  #  J +=
     +eJ               #   J[-1] + 
        s              #    sum(                           )
           *M          #     map(__operator_mul,          )
             .t      0 #      transpose(          , pad=0)
               ,       #       [       ,         ]
                PJ     #         J[:-1] 
                  _PJ  #                 J[1::-1]
<JQ                    # J[::Q]

ทางเลือก: แทนที่<ด้วย@เพื่อส่งคืนnองค์ประกอบ -th ของลำดับ 0 ดัชนี



1

ระดับแปดเสียง 73 ไบต์

g=(1:4).^0;for(i=3:(n=input('')))g(i+2)=g(4:i+1)*g(i-(2:i-1))';end;g(end)

ลองออนไลน์!

-2 ไบต์ขอบคุณ Stewie Griffin อีกครั้งวิธีการที่จำเป็นชนะเหนือวิธีการเรียกซ้ำ อันนั้นแสดงไว้ด้านล่าง

อ็อกเทฟ 75 ไบต์

f(f=@(a)@(n){@()sum(arrayfun(@(k)a(a)(k)*a(a)(n-2-k),2:n-1)),1}{2-(n>3)}())

ลองออนไลน์!

แคปช่าต้องการยืนยันว่าฉันเป็นมนุษย์เมื่อโพสต์สิ่งนี้ จะซื่อสัตย์ผมไม่แน่ใจว่า


ฉันไม่เห็นวิธีที่ชัดเจนในการย่นระยะเข้าใกล้ ... มันดูค่อนข้างดีทีเดียว! นอกจากนี้บ่อยครั้งที่ฉันเห็นการทำดัชนีแบบไม่มีศูนย์ใน Octave :)
Stewie Griffin

@StewieGriffin เนื่องจากการเรียกซ้ำมีออฟเซ็ตบางอย่างมันไม่สำคัญเลยถ้าคุณเลือกการทำดัชนีศูนย์หรือหนึ่งรายการ ฉันคิดว่าบางทีฉันสามารถโกนบางไบต์ถ้าฉันทำดัชนี 2 แต่ดูเหมือนโกง อย่างไรก็ตามสัญชาตญาณของคุณถูกต้อง - อย่างใดนี่ก็สั้นลงอย่างแน่นอนในแบบเรียกซ้ำ ผมคิดว่าข้อได้เปรียบที่สำคัญคือจะจัดการกับการสร้างค่าเริ่มต้นที่สี่เป็นอย่างดีเพราะมันเป็นเพียงแค่ผลตอบแทนที่ 1 n<4สำหรับ
Sanchises

1
@StewieGriffin แน่นอนว่าการคูณเมทริกซ์แบบเก่าที่ดี ทำได้ดี!
Sanchises


0

C / C ++ , 70 69 67 ไบต์

-1 ไบต์ขอบคุณโจนาธาน

int a(int n){int k=2,s=0;while(++k<n)s+=a(k)*a(n+~k);return s?s:1;}

ลองออนไลน์!


สามารถa(n-1-k)เป็นa(n+~k) ?
Jonathan Frech

@JonathanFrech a(++k)*a(n-k)มีโอกาสที่จะทำงานได้และจะลดลงอีก 2 ไบต์forไบต์จาก แต่ฉันได้กลิ่นพฤติกรรมที่ไม่ได้กำหนด
polfosol ఠ_ఠ

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