Напишите функцию или программу, которая выводит номер каждого типа элемента (вершина, ребро, грань и т. Д.) N-мерного гиперкуба.
Например, трехмерный куб имеет 1 ячейку (т.е. 1 3-мерный куб), 6 граней (т.е. 6 2-мерных кубов), 12 ребер (т.е. 12 2-мерных кубов) и 8 вершин (т.е. 8 0-мерных куба).
Подробнее об элементах гиперкуба можно узнать здесь
Вы также можете взглянуть на следующую последовательность OEIS .
вход
Ваш код будет принимать в качестве входных данных (через STDIN или параметр функции или подобные вещи) целое число, большее или равное 0, которое является измерением гиперкуба.
Ваш код должен теоретически работать для любого ввода> = 0, не учитывая проблемы с памятью и временем (то есть скорость и потенциальные переполнения стека не являются проблемой для вашего ответа, если вход большой). Входные данные, приведенные в качестве контрольных примеров, не будут превышать 12.
Выход
Вы выведете список всех элементов гиперкуба, начиная с элемента «самый высокий размер». Например, для куба (input = 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]
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
MATL , 12 байт
Попробуйте онлайн
объяснение
источник
Mathematica, 29 байт
Мой первый ответ Mathematica! Это чистая функция , которая использует тот же подход , как PARI / GP Alephalpha в ответ . Построим полином
(1+2x)^n
и получим список коэффициентов, перечисленных в порядке возрастания степени (т. Е. Константы сначала).Пример использования:
источник
APL,
1511 байтЭто последовательность монадических функций, которая принимает целое число справа и возвращает целочисленный массив.
Пояснение, вызов ввода
n
:Попробуйте онлайн
Сохранено 4 байта благодаря Денису!
источник
PARI / GP,
2015 байтисточник
Желе, 8 байт
Я действительно должен прекратить писать Jelly на моем телефоне.
Попробуй это здесь .
источник
TI-BASIC, 10 байтов
источник
binompdf
.CJam (
1714 байт)Онлайн демо
Этот подход использует обычную производящую функцию
(x + 2)^n
. OEIS упоминает(2x + 1)^n
, но этот вопрос индексирует коэффициенты в обратном порядке. Я пинаю себя за то, что не думал повернуть gf, пока не увидел обновление Alephalpha к ответу PARI / GP, которое сделало то же самое.Интересный трюк в этом ответе заключается в использовании целочисленных степеней для операции с полиномиальной степенью при работе на базе выше любого возможного коэффициента. В общем, данный многочлен
p(x)
, коэффициенты которого все неотрицательные целые числа меньше, чемb
,p(b)
является базовымb
представлением коэффициентов (потому что отдельные одночлены не «перекрываются»). Очевидно,(x + 2)^n
будут иметь коэффициенты, которые являются положительными целыми числами и которые суммируются3^n
, поэтому каждый из них будет индивидуально меньше, чем3^n
.Альтернативные подходы: в 17 байтов
Онлайн демо
или
Онлайн демо
оба работают, суммируя предыдущий ряд со смещенной и удвоенной строкой (в стиле, аналогичном стандартной ручной конструкции треугольника Паскаля).
«Прямой» подход с использованием декартовых степеней (в отличие от целочисленных степеней) для операции с полиномиальными степенями имеет размер 24 байта:
где карта, как правило, достаточно сложна, чтобы использовать ее короче,
%
чемf
:источник
ES6, 71 байт
Простая рекурсивная формула. Каждый гиперкуб создается путем перемещения предыдущего блока 1 гиперкуба по N-му измерению. Это означает, что M-мерные объекты дублируются в начале и конце модуля, но также (M-1) -мерные объекты приобретают дополнительное измерение, превращаясь в M-мерные объекты. Другими словами,
c(n, m) = c(n - 1, m) * 2 + c(n - 1, m - 1)
. (Фактическая отправка изменяет параметры так, что формула выводится в нужном порядке.)Гениально,
fill
позволяетmap
предоставлять правильные аргументы рекурсивной функции, экономя мне 6 байтов.источник
Pyth,
109 байтовИспользует алгоритм nCr, который все используют.
источник
.<L.cQdhQ
05AB1E , 9 байтов
Код:
Объяснение:
Использует кодировку CP-1252.
источник
Юлия, 31 байт
Это лямбда-функция, которая принимает целое число и возвращает целочисленный массив. Чтобы вызвать его, присвойте его переменной.
Для каждого m от 0 до входа n мы подсчитываем количество ( n - m ) -мерных гиперкубов на границе родительского n -мерного гиперкуба. Используя формулу в Википедии, это просто 2 m * select ( n , m ). Случай m = 0 относится к самому n- кубу, поэтому вывод начинается с 1 независимо от ввода. Края заданы m = n , вершины - m = n - 1 и т. Д.
источник
Ruby, Rev B 57 байт
Предыдущий оборот каждый раз сканировал только использованную часть массива. Этот оборот просматривает весь массив на каждой итерации. Это медленнее, но экономит байты. Дальнейший байт сохраняется с помощью 1 цикла, чтобы выполнить работу 2.
Ruby, Rev A 61 байт
Начинается с точки и итеративно создает следующее измерение
В каждой итерации каждый существующий элемент увеличивается в размерности и генерирует 2 новых элемента своей исходной размерности. Например, для квадрата в горизонтальной плоскости, который вытянут вертикально, чтобы стать кубом:
1 грань становится кубом и генерирует 1 пару граней (1 сверху, 1 снизу)
4 ребра становятся гранями и генерируют 4 пары ребер (4 сверху, 4 снизу)
4 вершины становятся ребрами и генерируют 4 пары вершин (4 сверху, 4 снизу)
Неуправляемый в тестовой программе
источник