องค์ประกอบ Hypercube


19

เขียนฟังก์ชั่นหรือโปรแกรมที่ส่งออกจำนวนขององค์ประกอบแต่ละประเภท (จุดยอด, ขอบ, ใบหน้า, ฯลฯ ) ของ hypercube N-Dim

ตัวอย่างเช่นลูกบาศก์ 3 มิติมี 1 เซลล์ (เช่น 1 ลูกบาศก์ 3 มิติ), 6 ใบหน้า (เช่น 6 2 มิติมิติ), 12 ขอบ (เช่น 12 มิติสองมิติ) และ 8 จุดยอด (เช่น 8 0 มิติ ลูกบาศก์).

รายละเอียดเพิ่มเติมเกี่ยวกับองค์ประกอบ Hypercube สามารถดูได้ที่นี่

คุณสามารถดูลำดับ OEIS ต่อไปนี้ได้เช่นกัน

อินพุต

รหัสของคุณจะใช้เป็นอินพุต (ผ่าน STDIN หรือพารามิเตอร์ฟังก์ชันหรือสิ่งที่คล้ายกัน) จำนวนเต็มมากกว่าหรือเท่ากับ 0 ซึ่งเป็นขนาดของไฮเปอร์คิวบ์

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

เอาท์พุต

คุณจะออกรายการองค์ประกอบทั้งหมดของไฮเปอร์คิวบ์โดยเริ่มจากองค์ประกอบ "ขนาดสูงสุด" ตัวอย่างเช่นสำหรับคิวบ์ (อินพุต = 3) คุณจะส่งออกรายการ[1,6,12,8](1 เซลล์, 6 ใบหน้า, 12 ขอบ, 8 จุดยอด)

รูปแบบของรายการในผลลัพธ์นั้นค่อนข้างฟรีตราบใดที่มันดูเหมือนรายการ

คุณสามารถส่งออกผลลัพธ์ไปยัง STDOUT หรือส่งกลับจากฟังก์ชั่น

กรณีทดสอบ

Input = 0
Output = [1]

Input = 1
Output = [1,2]

Input = 3
Output = [1,6,12,8]

Input = 10
Output = [1, 20, 180, 960, 3360, 8064, 13440, 15360, 11520, 5120, 1024]

Input = 12
Output = [1, 24, 264, 1760, 7920, 25344, 59136, 101376, 126720, 112640, 67584, 24576, 4096]

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


10

Samau , 8ไบต์ 5

ที่บันทึกไว้ 3 ไบต์ขอบคุณที่เดนนิส

▌2\$ⁿ

Hex dump (Samau ใช้การเข้ารหัส CP737):

dd 32 2f 24 fc

คำอธิบาย:

▌        read a number
 2\      push the array [1 2]
   $     swap
    ⁿ    take the convolution power

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


11

J, 13 ไบต์

[:p.2&^;$&_.5

แรงบันดาลใจจาก@ alephalpha ของ PARI / คำตอบ ลองมันออนไลน์กับJ.js

พื้นหลัง

โดยทฤษฎีบททวินาม

สูตร

ดังนั้นเอาต์พุตสำหรับอินพุตnประกอบด้วยค่าสัมประสิทธิ์ของพหุนามข้างต้นอย่างแม่นยำ

รหัส

[:p.2&^;$&_.5  Monadic verb. Argument: n

        $&_.5  Yield an array of n instances of -0.5.
    2&^        Compute 2^n.
       ;       Link the results to the left and right.
               This specifies a polynomial of n roots (all -0.5)
               with leading term 2^n.  
[:p.           Convert from roots to coefficients.

10

MATL, 8 ไบต์

1i:"2:X+

แรงบันดาลใจจาก@ alephalpha ของ PARI / คำตอบ

ลองออนไลน์! (ใช้Y+สำหรับวันที่ทันสมัย ​​MATL)

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

1        % Push 1.
 i:      % Push [1 ... input].
   "     % Begin for-each loop:
    2:   %   Push [1 2].
      X+ %   Take the convolution product of the bottom-most stack item and [1 2].

5
คำตอบ MATL แรกของฉัน
Dennis

และเป็นหนึ่งที่ยอดเยี่ยม! เป็นเกียรติอย่างยิ่งที่คุณใช้ภาษานี้ :-)
Luis Mendo

1
สวย. ทุกคนเริ่มกระโดดบน bandwagon MATL ทันที!
rayryeng - Reinstate Monica

@rayryeng เราคิดถึงคุณ :-)
Luis Mendo


8

Mathematica, 29 ไบต์

CoefficientList[(1+2x)^#,x]&

Mathematica คำตอบแรกของฉัน! นี้เป็นฟังก์ชั่นบริสุทธิ์ที่ใช้วิธีการเดียวกับ Alephalpha ของ PARI / GP คำตอบ เราสร้างพหุนาม(1+2x)^nและรับรายการของค่าสัมประสิทธิ์ที่แสดงตามลำดับของพลังงานจากน้อยไปมาก (เช่นค่าคงที่ก่อน)

ตัวอย่างการใช้งาน:

> F := CoefficientList[(1+2x)^#,x]&`
> F[10]
{1,20,180,960,3360,8064,13440,15360,11520,5120,1024}

6

APL, 15 11 ไบต์

1,(2*⍳)×⍳!⊢

นี่คือการฝึกอบรมฟังก์ชั่น monadic ที่รับจำนวนเต็มทางด้านขวาและส่งกลับอาร์เรย์จำนวนเต็ม

คำอธิบายการเรียกอินพุตn:

        ⍳!⊢  ⍝ Get n choose m for each m from 1 to n
       ×     ⍝ Multiply elementwise by
  (2*⍳)      ⍝ 2^m for m from 1 to n
1,           ⍝ Tack 1 onto the front to cover the m=0 case

ลองออนไลน์

บันทึกแล้ว 4 ไบต์ขอบคุณเดนนิส!



5

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

0rð2*×c@

ฉันควรหยุดเขียน Jelly บนโทรศัพท์ของฉันจริงๆ

0r            Helper link. Input is n, inclusive range from 0 to n. Call the result r.
  ð           Start a new, dyadic link. Input is r, n.
   2*         Vectorized 2 to the power of r
     ×c@      Vectorized multiply by n nCr r. @ switches argument order.

ลองมันนี่


4

TI-BASIC ขนาด 10 ไบต์

3^Ansbinompdf(Ans,2/3

ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่น่าสนใจอีกข้อหนึ่ง binompdfผมไม่ทราบว่าผมจะมีความคิดที่เคย
PhiNotPi

4

CJam ( 17 14 ไบต์)

ri_3@#_2+@#\b`

การสาธิตออนไลน์

(x + 2)^nวิธีการนี้จะใช้ฟังก์ชั่นการสร้างสามัญ OEIS กล่าวถึง(2x + 1)^nแต่คำถามนี้จะทำดัชนีสัมประสิทธิ์ในลำดับที่ตรงกันข้าม ฉันเตะตัวเองโดยที่ไม่คิดที่จะย้อนกลับ gf จนกว่าฉันจะเห็นการอัปเดตของ Alephalpha ต่อคำตอบ PARI / GP ซึ่งทำเช่นเดียวกัน

เคล็ดลับที่น่าสนใจในคำตอบนี้คือการใช้พลังงานจำนวนเต็มสำหรับการดำเนินการพลังงานพหุนามโดยปฏิบัติการในฐานที่สูงกว่าค่าสัมประสิทธิ์ที่เป็นไปได้ใด ๆ โดยทั่วไปได้รับพหุนามp(x)ที่มีสัมประสิทธิ์เป็นจำนวนเต็มทั้งหมดที่ไม่ใช่เชิงลบน้อยกว่าb, p(b)เป็น base- bตัวแทนของค่าสัมประสิทธิ์ (เพราะ monomials บุคคลทำไม่ได้ "ทับซ้อน") เห็นได้ชัดว่า(x + 2)^nจะมีค่าสัมประสิทธิ์ซึ่งเป็นจำนวนเต็มบวกและซึ่งรวมไปดังนั้นแต่ละของพวกเขาที่ไม่ซ้ำกันจะน้อยกว่า3^n3^n

ri     e# Read an integer n from stdin
_3@#   e# Push 3^n to the stack
_2+    e# Duplicate and add 2, giving a base-3^n representation of x+2
@#     e# Raise to the power of n
\b`    e# Convert into a vector of base-3^n digits and format for output

วิธีการทางเลือก: ที่ 17 ไบต์

1a{0X$2f*+.+}ri*`

การสาธิตออนไลน์

หรือ

1a{0X$+_]:.+}ri*`

การสาธิตออนไลน์

ทั้งสองทำงานโดยการรวมแถวก่อนหน้ากับแถวชดเชยและสองเท่า (ในรูปแบบที่คล้ายกับการก่อสร้างด้วยตนเองมาตรฐานของสามเหลี่ยมปาสคาล)

วิธีการ "โดยตรง" โดยใช้อำนาจคาร์ทีเซียน (ตรงข้ามกับพลังจำนวนเต็ม) สำหรับการดำเนินการของพหุนามพลังงานมาที่ 24 ไบต์:

2,rim*{1b_0a*2@#+}%z1fb`

แผนที่มีความซับซ้อนผิดปกติเพียงพอที่จะใช้งานสั้น%กว่าf:

2,rim*1fb_0af*2@f#.+z1fb`

3

ES6, 71 ไบต์

n=>[...Array(n+1)].fill(n).map(b=(n,i)=>!i?1:i>n?0:b(--n,i-1)*2+b(n,i))

สูตรเรียกซ้ำง่าย ๆ แต่ละไฮเปอร์คิวบ์ถูกสร้างขึ้นโดยการย้ายไฮเปอร์คิวบ์ 1 ก่อนหน้านี้ผ่านมิติที่ N ซึ่งหมายความว่าวัตถุมิติ M จะทำซ้ำที่จุดเริ่มต้นและจุดสิ้นสุดของหน่วย แต่ยังวัตถุมิติ (M-1) มิติได้รับมิติพิเศษกลายเป็นวัตถุมิติ M กล่าวอีกนัยหนึ่ง, c(n, m) = c(n - 1, m) * 2 + c(n - 1, m - 1). (การส่งจริงจะกลับพารามิเตอร์เพื่อให้สูตรส่งออกตามลำดับที่ต้องการ)

อย่างชาญฉลาดfillช่วยmapให้การขัดแย้งที่ถูกต้องกับฟังก์ชั่นซ้ำช่วยฉัน 6 ไบต์


3

Pyth, 10 9 ไบต์

.<L.cQdhQ

ใช้อัลกอริทึม nCr ที่ทุกคนใช้


L-map บันทึกเป็นจำนวนไบต์:.<L.cQdhQ
isaacg

2

05AB1E , 9 ไบต์

รหัส:

WƒNoZNc*,

คำอธิบาย:

W          # Push input and store in Z
 ƒ         # For N in range(0, input + 1)
  No       # Compute 2**N
    ZNc    # Compute Z nCr N
       *   # Multiply
        ,  # Pop and print

ใช้การเข้ารหัส CP-1252


2

จูเลีย 31 ไบต์

n->[2^m*binomial(n,m)for m=0:n]

นี่คือฟังก์ชั่นแลมบ์ดาที่รับจำนวนเต็มและส่งกลับอาร์เรย์จำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

สำหรับแต่ละmจาก 0 ถึงอินพุตnเรานับจำนวนของ ( n - m ) - มิติ hypercubes บนขอบเขตของ parent n- hypercube มิติ การใช้สูตรบนวิกิพีเดียเพียง 2 ม. * เลือก ( n , m ) กรณีของm = 0 อ้างถึงn -cube เองดังนั้นเอาต์พุตเริ่มต้นด้วย 1 โดยไม่คำนึงถึงอินพุต ขอบถูกกำหนดโดยm = n , จุดยอดโดยm = n - 1, เป็นต้น


1

Ruby, Rev B 57 ไบต์

->n{a=[1]+[0]*n
(n*n).downto(n){|i|a[1+j=i%n]+=2*a[j]}
a}

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

Ruby, Rev A 61 ไบต์

->n{a=[1]+[0]*n
n.times{|i|i.downto(0){|j|a[j+1]+=2*a[j]}}
a}

เริ่มต้นด้วยจุดและสร้างมิติต่อไปซ้ำ ๆ

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

ใบหน้า 1 ด้านกลายเป็นคิวบ์และสร้างใบหน้า 1 คู่ (1 ด้านบน, 1 ด้านล่าง)

ใบหน้าทั้งสี่ด้านจะกลายเป็นใบหน้าและสร้างขอบ 4 คู่ (4 ด้านบน, 4 ด้านล่าง)

4 จุดยอดกลายเป็นขอบและสร้างจุดยอด 4 คู่ (4 ด้านบน, 4 ด้านล่าง)

Ungolfed ในโปรแกรมทดสอบ

f=->n{a=[1]+[0]*n                  #make an array with the inital point and space for other dimensions
  n.times{|i|                      #iteratively expand dimension by dimension 
    i.downto(0){|j|a[j+1]+=2*a[j]} #iterating downwards (to avoid interferences) add the 2 new elements generated by each existing element.
  }
a}                                 #return the array

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