О серии
Во-первых, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь о серии вообще. Тем не менее, существует таблица лидеров по всем задачам. Вы можете найти таблицу лидеров вместе с дополнительной информацией о серии в первом посте .
Несмотря на то, что у меня есть ряд идей для этой серии, будущие проблемы еще не заложены. Если у вас есть какие-либо предложения, пожалуйста, сообщите мне об этом в соответствующей песочнице .
Отверстие 3: целочисленные разделы
Время немного увеличить сложность.
Разбиение положительного целого числа n
, определяется как мультимножестве положительных целых чисел, сумма которых равна n
. Например, если n = 5
существуют следующие разделы:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Обратите внимание , что это мультимножествами, так что нет никакого порядка им {3,1,1}
, {1,3,1}
и {1,1,3}
все они считаются идентичными.
Ваша задача состоит в том, n
чтобы создать случайный раздел n
. Вот подробные правила:
Распределение произведенных перегородок должно быть равномерным . То есть в приведенном выше примере каждый раздел должен быть возвращен с вероятностью 1/7.
Конечно, из-за технических ограничений PRNG идеальная однородность будет невозможна. Для оценки единообразия вашего представления следующие операции будут рассматриваться как обеспечивающие абсолютно равномерное распределение:
- Получение номера из PRNG (в любом диапазоне), который задокументирован, чтобы быть (приблизительно) равномерным.
- Отображение равномерного распределения по большому набору чисел в меньший набор по модулю или умножению (или какой-либо другой операции, которая распределяет значения равномерно). Большой набор должен содержать как минимум в 1024 раза больше возможных значений, чем меньший набор.
Поскольку разделы являются мультимножествами, вы можете возвращать их в любом порядке, и этот порядок не обязательно должен быть согласованным. Однако в целях случайного распределения порядок игнорируется. То есть, в приведенном выше примере,
{3,1,1}
,{1,3,1}
и{1,1,3}
вместе должны иметь вероятность 1/7 возвращается.- Ваш алгоритм должен иметь детерминированную среду выполнения. В частности, вы не можете генерировать случайные мультимножества и отклонять их, если они не суммируются
n
. - Временная сложность вашего алгоритма должна быть полиномиальной
n
. В частности, вы не можете просто сгенерировать все разделы и выбрать случайный (так как количество разделов растет в геометрической прогрессииn
). Вы можете предположить, что используемый PRNG может возвращать равномерно распределенные значения в O (1) на значение. - Вы не должны использовать какую-либо встроенную функцию, которая решает эту задачу.
Вы можете написать полную программу или функцию и получить ввод через STDIN или ближайшую альтернативу, аргумент командной строки или аргумент функции и произвести вывод через возвращаемое значение или распечатать в STDOUT (или ближайшую альтернативу).
Вы можете предположить, что n ≤ 65
(например, количество разделов меньше, чем 21 ). Вывод может быть в любом удобном, однозначном списке или строковом формате.
Если вы отправляете функцию, рассмотрите также небольшую тестовую программу, которая вызывает функцию несколько раз и печатает результаты. Ничего страшного, если параметры нужно настроить в коде. Это просто для того, чтобы люди могли проверить, что решение, по крайней мере, приблизительно одинаково.
Это код гольф, поэтому выигрывает самое короткое представление (в байтах). И, конечно же, самая короткая заявка на пользователя также войдет в общую таблицу лидеров серии.
Leaderboard
Первый пост серии генерирует таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)