Elemen Hypercube


19

Tulis fungsi atau program yang menampilkan jumlah setiap jenis elemen (simpul, tepi, wajah, dll.) Dari sebuah N-dimensi hypercube.

Sebagai contoh, kubus 3 dimensi memiliki 1 sel (yaitu 1 kubus 3 dimensi), 6 wajah (yaitu 6 kubus 2 dimensi), 12 tepi (yaitu 12 kubus 2 dimensi) dan 8 simpul (yaitu 8 dimensi 0) kotak).

Rincian lebih lanjut tentang elemen Hypercube dapat ditemukan di sini

Anda juga dapat melihat urutan OEIS berikut .

Memasukkan

Kode Anda akan dimasukkan sebagai input (melalui STDIN atau parameter fungsi atau hal serupa) bilangan bulat lebih besar atau sama dengan 0, yang merupakan dimensi dari hypercube.

Kode Anda harus bekerja secara teoritis untuk setiap input> = 0, mengabaikan masalah memori dan waktu (yaitu, kecepatan dan potensi stack overflow bukan masalah bagi jawaban Anda jika inputnya besar). Masukan yang diberikan sebagai kasus uji tidak akan di atas 12.

Keluaran

Anda akan melihat daftar semua elemen hypercube, dimulai dengan elemen "dimensi tertinggi". Misalnya, untuk kubus (input = 3), Anda akan menampilkan daftar [1,6,12,8](1 sel, 6 wajah, 12 tepi, 8 simpul).

Format daftar dalam output relatif gratis, asalkan terlihat seperti daftar.

Anda dapat menampilkan hasilnya ke STDOUT atau mengembalikannya dari suatu fungsi.

Uji kasus

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]

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Jawaban:



11

J, 13 byte

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

Terinspirasi oleh jawaban PARI / GP @ alephalpha . Cobalah online dengan J.js .

Latar Belakang

Dengan teorema binomial,

rumus

Dengan demikian, output untuk input n terdiri dari koefisien-koefisien polinomial di atas.

Kode

[: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 byte

1i:"2:X+

Terinspirasi oleh jawaban PARI / GP @ alephalpha .

Cobalah online! (kegunaan Y+untuk MATL modern)

Bagaimana itu bekerja

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
Jawaban MATL pertama saya.
Dennis

Dan yang sangat bagus! Suatu kehormatan bahwa Anda menggunakan bahasa ini :-)
Luis Mendo

1
Cantik. Semua orang mulai melompat ke kereta musik MATL sekarang!
rayryeng

@rayryeng Kami merindukanmu :-)
Luis Mendo

8

MATL , 12 byte

Q:q"H@^G@Xn*

Cobalah online

Penjelasan

         % implicit: input number "n"
Q:q      % generate array[0,1,...,n]
"        % for each element "m" from that array
  H@^    % compute 2^m
  G      % push n
  @      % push m
  Xn     % compute n choose m
  *      % multiply
         % implicit: close loop and display stack contents

8

Mathematica, 29 byte

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

Jawaban pertama saya di Mathematica! Ini adalah fungsi murni yang menggunakan pendekatan yang sama seperti Alephalpha ini PARI / GP jawaban . Kami membangun polinomial (1+2x)^ndan mendapatkan daftar koefisien, terdaftar dalam urutan kekuatan naik (yaitu konstan pertama).

Contoh penggunaan:

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

6

APL, 15 11 byte

1,(2*⍳)×⍳!⊢

Ini adalah kereta fungsi monadik yang menerima integer di sebelah kanan dan mengembalikan array integer.

Penjelasan, memanggil input 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

Cobalah online

Disimpan 4 byte berkat Dennis!



5

Jelly, 8 byte

0rð2*×c@

Saya benar-benar harus berhenti menulis Jelly di ponsel saya.

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.

Coba di sini .


4

TI-BASIC, 10 byte

3^Ansbinompdf(Ans,2/3

Saya pikir ini adalah salah satu solusi yang lebih menarik. Saya tidak tahu apakah saya akan pernah memikirkannya binompdf.
PhiNotPi

4

CJam ( 17 14 bytes)

ri_3@#_2+@#\b`

Demo online

Pendekatan ini menggunakan fungsi pembangkit biasa (x + 2)^n. OEIS menyebutkan (2x + 1)^n, tetapi pertanyaan ini mengindeks koefisien dalam urutan yang berlawanan. Saya menendang diri saya sendiri karena tidak berpikir untuk membalikkan gf sampai saya melihat pembaruan Alephalpha untuk jawaban PARI / GP yang melakukan hal yang sama.

Trik yang menarik dalam jawaban ini adalah menggunakan kekuatan bilangan bulat untuk operasi daya polinomial dengan beroperasi di basis yang lebih tinggi daripada koefisien yang mungkin. Secara umum, diberikan polinomial p(x)yang koefisiennya semua bilangan bulat non-negatif kurang dari b, p(b)adalah brepresentasi basis dari koefisien (karena masing-masing monomial tidak "tumpang tindih"). Jelas (x + 2)^nakan memiliki koefisien yang bilangan bulat positif dan yang berjumlah 3^n, sehingga masing-masing secara individual akan lebih kecil dari 3^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

Pendekatan alternatif: pada 17 byte

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

Demo online

atau

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

Demo online

keduanya bekerja dengan menjumlahkan baris sebelumnya dengan baris offset-dan-gandakan (dalam gaya yang mirip dengan konstruksi manual standar segitiga Pascal).

Pendekatan "langsung" menggunakan kekuatan Cartesian (berlawanan dengan kekuatan integer) untuk operasi daya polinomial, muncul pada 24 byte:

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

di mana peta itu, luar biasa, cukup rumit sehingga lebih pendek untuk digunakan %daripada f:

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

3

ES6, 71 byte

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

Formula rekursif sederhana. Setiap hypercube dibuat dengan memindahkan unit hypercube 1 sebelumnya melalui dimensi Nth. Ini berarti bahwa objek dimensi M digandakan pada awal dan akhir unit, tetapi juga objek dimensi (M-1) mendapatkan dimensi ekstra, berubah menjadi objek dimensi M. Dengan kata lain c(n, m) = c(n - 1, m) * 2 + c(n - 1, m - 1),. (Pengajuan aktual membalikkan parameter sehingga rumus menghasilkan dalam urutan yang diinginkan.)

Secara cerdik, fillmemungkinkan mapuntuk memberikan argumen yang benar ke fungsi rekursif, menyelamatkan saya 6 byte.


3

Pyth, 10 9 byte

.<L.cQdhQ

Menggunakan algoritma nCr yang tampaknya digunakan semua orang.


L-peta menyimpan byte:.<L.cQdhQ
isaacg

2

05AB1E , 9 byte

Kode:

WƒNoZNc*,

Penjelasan:

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

Menggunakan pengodean CP-1252.


2

Julia, 31 byte

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

Ini adalah fungsi lambda yang menerima integer dan mengembalikan array integer. Untuk menyebutnya, tetapkan ke variabel.

Untuk setiap m dari 0 sampai input n , kita menghitung jumlah ( n - m ) hypercubes berdimensi pada batas induk n hypercube berdimensi. Menggunakan rumus di Wikipedia, cukup pilih 2 m * ( n , m ). Kasus m = 0 mengacu pada n- kubus itu sendiri, sehingga output dimulai dengan 1 terlepas dari input. Tepian diberikan oleh m = n , simpul oleh m = n - 1, dll.


1

Ruby, Rev B 57 byte

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

Rev sebelumnya hanya memindai melalui bagian array yang digunakan setiap kali. Rev ini memindai seluruh array pada setiap iterasi. Ini lebih lambat, tetapi menghemat byte. Byte selanjutnya disimpan dengan menggunakan 1 loop untuk melakukan pekerjaan 2.

Ruby, Rev A 61 byte

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

Mulai dengan titik dan secara iteratif menciptakan dimensi berikutnya

Dalam setiap iterasi, setiap elemen yang ada bertambah dalam dimensi dan menghasilkan 2 elemen baru dari dimensi aslinya. Misalnya, untuk kuadrat dalam bidang horizontal yang diperpanjang secara vertikal menjadi kubus:

1 wajah menjadi kubus dan menghasilkan 1 pasang wajah (1 di atas, 1 di bawah)

4 tepi menjadi wajah dan menghasilkan 4 pasang tepi (4 di atas, 4 di bawah)

4 simpul menjadi tepi dan menghasilkan 4 pasang simpul (4 di atas, 4 di bawah)

Tidak terkurung dalam program uji

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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.