Елементи гіперкуба


19

Напишіть функцію або програму, яка виводить номер кожного типу елементів (вершини, краю, обличчя тощо) N-мірного гіперкуба.

Наприклад, 3-мірний куб містить 1 комірку (тобто 1 3-мірний куб), 6 граней (тобто 6 двовимірних кубів), 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

Самау , 8 5 байт

Збережено 3 байти завдяки Деннісу .

▌2\$ⁿ

Шестнадцятковий дамп (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

Натхненний відповіддю PARI / GP на @ alephalpha . Спробуйте в Інтернеті 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+

Натхненний відповіддю PARI / GP на @ alephalpha .

Спробуйте в Інтернеті! (використовує 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.
Денніс

І чудовий! Така честь, що ти користувався цією мовою :-)
Луїс Мендо

1
Гарний. Усі зараз починають стрибати на прокладці MATL!
rayryeng

@rayryeng Ми сумуємо за тобою :-)
Луїс Мендо


8

Математика, 29 байт

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

Моя перша відповідь Mathematica! Це чиста функція , яка використовує той же підхід , як PARI / GP Alephalpha в відповідь . Побудуємо многочлен(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*⍳)×⍳!⊢

Це поїзд монадичних функцій, який приймає ціле число праворуч і повертає цілий масив.

Пояснення, виклик вводу 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)є базовим bподанням коефіцієнтів (оскільки окремі одночлени не «перетинаються»). Очевидно (x + 2)^n, що коефіцієнти будуть додатними цілими числами і які дорівнюють 3^n, тому кожне з них окремо буде менше 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

Альтернативні підходи: в 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 ) -вимірних гіперкубів на межі батьківського n -вимірного гіперкуба. Використовуючи формулу у Вікіпедії, це просто 2 m * select ( n , m ). Випадок m = 0 відноситься до самого n -кубі, тому вихід починається з 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, об. 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 вище, 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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.