Номер Белл ( OEIS A000110 ) является количеством способов разбиения набора п меченых (различных) элементов. Номер 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]}
Есть много способов вычислить числа Белла, и вы можете использовать любой из них. Один из способов будет описан здесь:
Самый простой способ вычислить числа Белла - это использовать числовой треугольник, напоминающий треугольник Паскаля, для биномиальных коэффициентов. Числа Белла появляются на краях треугольника. Начиная с 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 Language), который напрямую генерирует числа Белла, будут неконкурентоспособными.
Самый короткий код (в байтах) выигрывает.
3
вывода должны5
были бы Ouput15
, верно? И с 1-индексированием это5
3
должен выводиться2
. Тогда что даст вход1
с 1-индексацией?Ответы:
Желе , 9 байт
Это использует формулу
который закрыт всякий раз, когда п <2 .
Попробуйте онлайн!
Как это устроено
источник
JavaScript (ES6), 47 байт
Первый индексируется 0, второй индексируется 1.
источник
Haskell, 36 байт
Использует метод треугольника, правильно обрабатывает 0, 0 на основе.
источник
R , 31 байт
использует число Стирлинга формулы второго рода и вычисляет эти числа с помощью пакета gmp ; читает из стандартного ввода и возвращает значение в виде большого целого числа; терпит неудачу для 0; 1-индексироваться.
источник
Mathematica, 24 байта
-13 байт от @Kelly Lowder!
источник
Sum[k^#/k!,{k,0,∞}]/E&
всего 24 байтаЖеле ,
141211 байтПопробуйте онлайн!
Не совсем ударил сильные стороны желе с
динамическим вводом в¡
,Ṫ
всегда изменяя массив и отсутствие предваряющего атома (однобайтовый;@
или обратныйṭ
).источник
CJam (19 байт)
Онлайн демо
рассечение
источник
MATL , 14 байтов
Ввод на основе 0. Попробуйте онлайн!
объяснение
Это использует формулу
где p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) - обобщенная гипергеометрическая функция .
источник
Python , 42 байта
Попробуйте онлайн!
Рекурсивная формула происходит от размещения
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-м числом Белла.источник
Python 2 , 91 байт
Попробуйте онлайн!
B (n) рассчитывается как сумма чисел Стирлинга второго рода.
источник
s
: поскольку рекурсивные вызовы всегда уменьшитьn
и нет деления наk
вы можете потерять*k
в первом члене.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)
B
не является рекурсивной, и это ваш окончательный ответ, вы можете опустить ее,B=
чтобы сохранить 2 байтаMATLAB,
128103 байтаДовольно понятно. Пропуск точки с запятой в конце строки печатает результат.
25 байтов сэкономлено благодаря Луису Мендо.
источник
R , 46 байт
Попробуйте онлайн!
источник
T
умолчаниюTRUE
(он же 1), если он не был установлен где-то ещеMATL ,
1918 байтИспользует ввод на основе 0. На основе рекуррентного отношения
Попробуйте онлайн!
источник
Ом , 15 байт
Попробуйте онлайн!
Использует форумлу Добинского (даже работает на B (0) yay ).
объяснение
источник
Python (79 байт)
Онлайн-демонстрация в Python 2, но она также работает в Python 3.
Это строит треугольник Эйткена, используя рекурсивную лямбду для петли в гольфе.
источник
Haskell , 35 байт
Попробуйте онлайн!
Формула объясняется в моем ответе на Python .
источник
J, 17 байт
Использует метод расчета треугольника.
Попробуйте онлайн!
объяснение
источник
Python 3 , 78 байт
Я решил попробовать другой путь для расчета. При этом используется формула Добински, 0-indexed, не работает для 0.
Попробуйте онлайн!
источник
f
не является рекурсивной, вы можете опуститьf=
и сохранить 2 байтаPython 3 ,
6860 байтПростая рекурсивная конструкция треугольника, но она крайне неэффективна для практических целей. Вычисление до 15-го числа Белла приводит к тайм-ауту TIO, но он работает на моей машине.
Это использует 1-индексацию и возвращает
True
вместо 1.Попробуйте онлайн!
Спасибо @FelipeNardiBatista за сохранение 8 байт!
источник
PHP , 72 байта
рекурсивная функция 1-индексированная
Попробуйте онлайн!
PHP , 86 байт
0 индексированные
Попробуйте онлайн!
PHP , 89 байт
рекурсивная функция с 0 индексами
Попробуйте онлайн!
источник
Алиса , 22 байта
Попробуйте онлайн!
Это использует метод треугольника. Для n = 0 вместо этого вычисляется B (1), что обычно равно B (0).
объяснение
Это стандартный шаблон для программ, которые принимают ввод в порядковом режиме, обрабатывают его в кардинальном режиме и выводят результат в порядковом режиме.
1
был добавлен в шаблон, чтобы поместить это значение в стек под входом.Программа использует стек в качестве расширяющейся круговой очереди для вычисления каждой строки треугольника. Во время каждой итерации после первой один неявный ноль под стеком становится явным нолем.
Первая итерация фактически предполагает начальную глубину стека, равную нулю, несмотря на требуемую 1 на вершине стека. В результате 1 добавляется к самому себе, и весь треугольник умножается на 2. Деление окончательного результата на 2 дает правильный ответ.
источник
Пари / ГП , 36 байт
Попробуйте онлайн!
источник