เอาท์พุทหมายเลขระฆังที่ n


13

จำนวน Bell ( OEIS A000110 ) คือจำนวนของวิธีการแบ่งพาร์ติชันชุดของ n ที่มีป้ายกำกับ (ที่แตกต่างกัน) องค์ประกอบ หมายเลขเบลล์ที่ 0 ถูกกำหนดเป็น 1

ลองดูตัวอย่าง (ฉันใช้วงเล็บเหลี่ยมเพื่อแสดงเซตย่อยและวงเล็บปีกกาสำหรับพาร์ติชัน):

1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}

มีหลายวิธีในการคำนวณหมายเลขเบลล์และคุณมีอิสระที่จะใช้หมายเลขใดก็ได้ จะอธิบายวิธีหนึ่งที่นี่:

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

1
1    2
2    3    5
5    7   10   15
15  20   27   37   52

คุณสามารถใช้การจัดทำดัชนี 0 หรือการจัดทำดัชนี 1 รายการ หากคุณใช้การจัดทำดัชนี 0 อินพุต3ควรส่งออก5แต่ควรส่งออก2หากคุณใช้การจัดทำดัชนี 1 รายการ

โปรแกรมของคุณจะต้องทำงานได้จนถึงเลขที่ 15 เบลล์เอาท์พุ1382958545ท ในทางทฤษฎีแล้วโปรแกรมของคุณควรสามารถจัดการกับตัวเลขที่มีขนาดใหญ่ขึ้น แก้ไข: คุณไม่จำเป็นต้องจัดการอินพุต 0 (สำหรับดัชนี 0) หรือ 1 (สำหรับดัชนี 1) เพราะไม่ได้คำนวณโดยวิธีสามเหลี่ยม

กรณีทดสอบ (สมมติว่ามีการจัดทำดัชนี 0):

0 ->  1 (OPTIONAL)
1 ->  1 
2 ->  2 
3 ->  5 
4 ->  15 
5 ->  52 
6 ->  203 
7 ->  877 
8 ->  4140 
9 ->  21147 
10 -> 115975 
11 -> 678570 
12 -> 4213597 
13 -> 27644437 
14 -> 190899322 
15 -> 1382958545

คำตอบที่ใช้วิธีการในตัว (เช่น BellB [n] ในภาษา Wolfram) ที่สร้างหมายเลขเบลโดยตรงจะไม่สามารถแข่งขันได้

รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ


ถ้าคุณใช้การจัดทำดัชนี 0 อินพุตของ3เอาต์พุตควร5เป็น ouput 15ใช่ไหม และด้วยการจัดทำดัชนี 1 รายการมันจะแสดงผล5
Luis Mendo

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

แต่คุณบอกว่า 1 การจัดทำดัชนีใส่ควรเอาท์พุท3 2ถ้าอย่างนั้นอินพุตจะ1ให้อะไรกับการจัดทำดัชนี 1 รายการ
Luis Mendo

1 -> 1, 2 -> 1, 3 -> 2 (ตรงกับหมายเลขที่ 1, 1 และ 2 ของเบลล์) ซึ่งตรงข้ามกับ 0 -> 1, 1 -> 1, 2 -> 2 บางทีฉันอาจใช้ผิด คำศัพท์
หัวเรือใหญ่

ฉันคิดว่าฉันได้รับมัน 1 รายการแรกหายไปในตารางตัวอย่างและผลลัพธ์ของคุณซึ่งทำให้ฉันสับสน
Luis Mendo

คำตอบ:


2

เยลลี่ขนาด 9 ไบต์

ṖµṀcæ.߀‘

ใช้สูตรนี้

สูตร

ซึ่งจะปิดเมื่อใดก็ตามที่n <2

ลองออนไลน์!

มันทำงานอย่างไร

ṖµṀcæ.߀‘  Main link. Argument: n

Ṗ          Pop; yield A := [1, ..., n-1].
 µ         Begin a new, monadic chain with argument A.
  Ṁ        Maximum; yield n-1.
   c       Combinatons; compute (n-1)C(k) for each k in A.
      ߀   Recursively map the main link over A.
    æ.     Take the dot product of the results to both sides.
        ‘  Increment; add 1 to the result.

8

JavaScript (ES6), 47 ไบต์

f=(n,a=[b=1])=>n--?f(n,[b,...a.map(e=>b+=e)]):b
f=(n,a=[b=1])=>--n?f(n,[b,...a.map(e=>b+=e)]):b

อันแรกคือ 0-index ส่วนที่สองคือ 1-indexed


8

Haskell, 36 ไบต์

head.(iterate(last>>=scanl(+))[1]!!)

ใช้วิธีสามเหลี่ยมจัดการกับ 0, 0 ตามอย่างถูกต้อง




3

เจลลี่ , 14 12 11 ไบต์

ṫ0;⁸+\
1Ç¡Ḣ

ลองออนไลน์!

ไม่ว่าตีจุดที่แข็งแกร่งของเจลลี่กับการป้อนข้อมูลแบบไดนามิกเพื่อ¡, เสมอการปรับเปลี่ยนอาร์เรย์และการขาดอะตอม prepending (ที่หนึ่งไบต์;@หรือรีเวอร์ส)



3

MATL , 14 ไบต์

:dtEw1Zh1Ze/Yo

อินพุตเป็นแบบอิง 0 ลองออนไลน์!

คำอธิบาย

ใช้สูตรนี้

ป้อนคำอธิบายรูปภาพที่นี่

ที่หน F Q ( 1 , ... , P ; 1 , ... , Q ; x ) เป็นทั่วไปฟังก์ชั่น hypergeometric

:      % Implictly input n. Push array [1 2 ... n]
d      % Consecutive differences: array [1 ... 1] (n-1 entries)
tE     % Duplicate, multiply by 2: array [2 ... 2] (n-1 entries)
w      % Swap
1      % Push 1
Zh     % Hypergeometric function
1Ze    % Push number e
/      % Divide
Yo     % Round (to prevent numerical precision issues). Implicitly display

3

Pythonขนาด 42 ไบต์

f=lambda n,k=0:n<1or k*f(n-1,k)+f(n-1,k+1)

ลองออนไลน์!

สูตรการเรียกซ้ำมาจากการวางnองค์ประกอบลงในพาร์ติชัน สำหรับแต่ละองค์ประกอบในทางกลับกันเราตัดสินใจว่าจะวาง:

  • เข้าไปในพาร์ทิชันที่มีอยู่ซึ่งมีkตัวเลือก
  • เพื่อเริ่มพาร์ติชันใหม่ซึ่งจะเพิ่มจำนวนตัวเลือกkสำหรับองค์ประกอบในอนาคต

ทั้งสองวิธีจะลดจำนวนnองค์ประกอบที่เหลือลง ดังนั้นเราจึงมีสูตรแบบเรียกซ้ำf(n,k)=k*f(n-1,k)+f(n-1,k+1)และf(0,k)=1ด้วยf(n,0)หมายเลขเบลล์ที่ n


2

Python 2 , 91 ไบต์

s=lambda n,k:n*k and k*s(n-1,k)+s(n-1,k-1)or n==k
B=lambda n:sum(s(n,k)for k in range(n+1))

ลองออนไลน์!

B (n) คำนวณเป็นผลรวมของจำนวนสเตอร์ลิงของชนิดที่สอง


นั่นเป็นทางออกที่ดี โปรดทราบว่าการใช้งานหมายเลขบิวด์ในตัวสำหรับประเภทที่สองจะได้รับอนุญาตให้คำนวณหมายเลขเบลล์ (หากใช้ Mathematica หรือที่คล้ายกัน)
rigged

คุณสามารถบันทึกสองไบต์ได้โดยตรงในคำจำกัดความของs: เนื่องจากการโทรซ้ำจะลดลงเสมอnและไม่มีการหารใด ๆ ที่kคุณจะสูญเสีย*kในระยะแรก
Peter Taylor

หรือคุณสามารถบันทึกพวงโดยแบนเป็นแลมบ์ดาหนึ่งที่ทำงานในแถวทั้งหมด:B=lambda n,r=[1,0]:n and B(n-1,[k*r[k]+r[k-1]for k in range(len(r))]+[0])or sum(r)
Peter Taylor

เป็นหน้าที่ของคุณBไม่ได้ recursive และมันก็เป็นคำตอบสุดท้ายของคุณคุณสามารถละเว้นB=การบันทึก 2 ไบต์
เฟลิ Nardi บาติสตา

2

MATLAB, 128 103 ไบต์

function q(z)
r(1,1)=1;for x=2:z
r(x,1)=r(x-1,x-1);for y=2:x
r(x,y)=r(x,y-1)+r(x-1,y-1);end
end
r(z,z)

สวยด้วยตนเองอธิบาย การเว้นเครื่องหมายอัฒภาคที่ท้ายบรรทัดจะพิมพ์ผลลัพธ์

บันทึกได้ 25 ไบต์ขอบคุณ Luis Mendo




2

โอห์ม 15 ไบต์

2°M^┼ⁿ^!/Σ;αê/≈

ลองออนไลน์!

ใช้ฟอรัมของ Dobinski (แม้ใช้งานได้กับ B (0) yay )

คำอธิบาย

2°M^┼ⁿ^!/Σ;αê/≈
2°        ;     # Push 100
  M             # Do 100 times...
   ^             # Push index of current iteration
    ┼ⁿ           # Take that to the power of the user input
      ^!         # Push index factorial
        /        # Divide
         Σ       # Sum stack together
           αê   # Push e (2.718...)
             /  # Divide
              ≈ # Round to nearest integer (Srsly why doesn't 05AB1E have this???)

2

Python (79 ไบต์)

B=lambda n,r=[1]:n and B(n-1,[r[-1]+sum(r[:i])for i in range(len(r)+1)])or r[0]

การสาธิตออนไลน์ใน Python 2 แต่ก็สามารถใช้งานได้ใน Python 3

สิ่งนี้สร้างสามเหลี่ยมของไอเคนโดยใช้แลมบ์ดาแบบวนซ้ำสำหรับวงตีกอล์ฟ



1

J, 17 ไบต์

0{]_1&({+/\@,])1:

ใช้วิธีการคำนวณรูปสามเหลี่ยม

ลองออนไลน์!

คำอธิบาย

0{]_1&({+/\@,])1:  Input: integer n
               1:  The constant 1
  ]                Identity function, get n
   _1&(       )    Call this verb with a fixed left argument of -1 n times
                   on itself starting with a right argument [1]
             ]       Get right argument
       {             Select at index -1 (the last item)
            ,        Join
        +/\@         Find the cumulative sums
0{                 Select at index 0 (the first item)

1

Python 3 , 78 ไบต์

from math import*
f=lambda n:ceil(sum(k**n/e/factorial(k)for k in range(2*n)))

ฉันตัดสินใจลองใช้เส้นทางอื่นในการคำนวณ สิ่งนี้ใช้สูตรของ Dobinski ที่มีการจัดทำดัชนี 0 ใช้ไม่ได้กับ 0

ลองออนไลน์!


1
เนื่องจากฟังก์ชั่นของคุณfไม่ซ้ำคุณสามารถละเว้นf=และบันทึก 2 ไบต์
Felipe Nardi Batista

1

Python 3 , 68 60 ไบต์

การสร้างแบบเรียกซ้ำง่าย ๆ ของสามเหลี่ยม แต่มันไม่มีประสิทธิภาพมากนักสำหรับการใช้งานจริง การคำนวณหมายเลขระฆังที่ 15 ทำให้ TIO หมดเวลา แต่ใช้งานกับเครื่องของฉันได้

สิ่งนี้ใช้การจัดทำดัชนีแบบ 1 และส่งคืนTrueแทน 1

f=lambda r,c=0:r<1or c<1and f(r-1,r-1)or f(r-1,c-1)+f(r,c-1)

ลองออนไลน์!


ขอบคุณ @FelipeNardiBatista สำหรับการบันทึก 8 ไบต์!


60 ไบต์ ส่งคืนบูลีนแทนตัวเลข (0,1) เป็นที่ยอมรับได้ในงูหลาม
Felipe Nardi Batista

1

PHP , 72 ไบต์

ฟังก์ชั่นซ้ำ 1 ดัชนี

function f($r,$c=0){return$r?$c?f($r-1,$c-1)+f($r,$c-1):f($r-1,$r-2):1;}

ลองออนไลน์!

PHP , 86 ไบต์

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

for(;$r++<$argn;)for($c=~0;++$c<$r;)$l=$t[$r][$c]=$c?$l+$t[$r-1][$c-1]:($l?:1);echo$l;

ลองออนไลน์!

PHP , 89 ไบต์

ฟังก์ชันแบบเรียกซ้ำ 0 ทำดัชนี

function f($r,$s=NULL){$c=$s??$r-1;return$r>1?$c?f($r-1,$c-1)+f($r,$c-1):f($r-1,$r-2):1;}

ลองออนไลน์!


1

อลิซ 22 ไบต์

/oi
\1@/t&wq]&w.q,+k2:

ลองออนไลน์!

วิธีนี้ใช้วิธีสามเหลี่ยม สำหรับ n = 0 จะคำนวณ B (1) แทนซึ่งเท่ากับ B (0)

คำอธิบาย

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

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

1     Append 1 to the implicit empty string on top of the stack
i     Get input n
t&w   Repeat outer loop that many times (push return address n-1 times)
q     Get tape position (initially zero)
]     Move right on tape
&w    On iteration k, push this return address k-1 times
      The following inner loop is run once for each entry in the next row
.     Duplicate top of stack (the last number calculated so far)
q,    Move the entry k spaces down to the top of the stack: this is the appropriate entry
      in the previous row, or (usually) an implicit zero if we're in the first column
+     Add these two numbers
k     Return to pushed address: this statement serves as the end of two loops simultaneously
2:    Divide by two: see below
o     Output as string
@     Terminate

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


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