Вступление
Давайте рассмотрим следующую последовательность (неотрицательные целые числа):
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
Например, давайте возьмем первые три числа. Это 0, 1, 2
. Числа, используемые в этой последовательности, можно упорядочить шестью различными способами:
012 120
021 201
102 210
Итак, допустим, что F (3) = 6 . Другой пример - F (12) . Это содержит номера:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Или каскадная версия:
01234567891011
Чтобы найти количество способов перестроить это, нам сначала нужно взглянуть на длину этой строки. Длина этой строки является 14
. Итак, мы вычисляем 14! , Однако, например, те могут поменяться местами, не нарушая окончательную строку. Есть 2 ноля, значит, 2! способы обнулить нули, не нарушая порядок. Также есть 4, так что есть 4! способы поменять. Мы делим сумму на эти два числа:
Это имеет 14! / (4! × 2!) = 1816214400 способов расстановки строк 01234567891011
. Таким образом, мы можем сделать вывод, что F (12) = 1816214400 .
Задание
Учитывая N , выведите F (N) . Для тех, кто не нуждается в представлении. Чтобы вычислить F (N), мы сначала конкатенируем первые N неотрицательных целых чисел (например, для N = 12 будет конкатенированная строка 01234567891011
) и вычисляем количество способов упорядочить эту строку.
Контрольные примеры
Input: Output:
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 119750400
12 1816214400
13 43589145600
14 1111523212800
15 30169915776000
Заметка
Вычислительный ответ должен быть вычислен в течение срока 10 секунд , скотина незначащих будет запрещен .
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
10
правильного? Такое ощущение, что должно быть меньше 10 !, потому что именно здесь начинаются повторяющиеся цифры.10
цифры0, 1, 2, 3, 4, 5, 6, 7, 8, 9
. Десять разных цифр, так что результат 10!0
дело сбрасывало мой счет (глупые пустые строки).F(N)
это неO(N!)
и чтоlog F(N)
есть ,O(log N!)
но это только предчувствия ...Ответы:
Желе,
1715 байтПопробуйте онлайн! или проверьте все тестовые случаи одновременно .
Как это устроено
источник
ES6,
1188178 байтКто-то обязательно скажет мне, что есть более короткий способ объединения чисел до
n
.Сэкономили 37 байтов, взяв идею @ edc65 и применив ее на стероидах. (Сохраните дополнительный байт, используя «|» вместо,
&&
но это ограничивает результат до 31 бита.)Редактировать: еще 3 байта сохранены благодаря @ edc65.
источник
reduce
:n=>[...[...Array(n).keys()].join``].reduce((r,c,i)=>r*++i/(o[c]=-~o[c]),1,o=[])
n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r
r/=(...)/i++
точнее чемr*=i++/(...)
? Это самый смешной гольф, который я когда-либо видел!APL (Dyalog Extended) , 13 байт
Попробуйте онлайн!
Полная программа. Использует
⎕IO←0
.Как это устроено
Полиномиальный расчет исходит из следующего факта:
источник
MATL , 21 байт
Попробуйте онлайн!
объяснение
источник
Python 2,
14213710197 байт(Спасибо @adnan за предложение о
input
)(Применен инкрементальный расчет из версии C )
Оригинальная версия с использованием факториала
Действительно, единственная игра в гольф в вышеперечисленном - это колл
math.factorial
F
и пропуски некоторых мест, так что, возможно, есть более короткое решение для Python.Если требуется объяснение,
v
ведется подсчет частоты каждой цифры; счет обновляется для каждой цифры в каждом номере в указанном диапазоне.В исходной версии мы вычисляем количество перестановок, используя стандартную формулу (Σf i )! / Π (f i !). Для текущей версии это вычисление выполняется постепенно, путем распределения умножений и деления, как мы видим цифры. Может быть неочевидно, что целочисленное деление всегда будет точным, но легко доказать, основываясь на наблюдении, что каждое деление на
k
должно следоватьk
умножению последовательных целых чисел, поэтому один из этих умножений должен делиться наk
. (Это интуиция, а не доказательство.)Оригинальная версия быстрее для больших аргументов, потому что она делает только 10 делений Бигнума. Хотя деление bignum на маленькое целое число происходит быстрее, чем деление bignum на bignum, когда у вас есть тысячи делений bignum, это становится немного вялым.
источник
Python 2, 197 байт (редактирование: сохранено 4 байта, спасибо Томасу Ква!)
Ungolfed:
источник
range(0,10)
может бытьrange(10)
.CJam,
2119 байтовПроверьте это здесь.
объяснение
источник
JavaScript (ES6), 100
Тестовое задание
источник
k[c]=~-k[c]
синоним--k[c]
?Pyth, 18 байт
Попробуйте онлайн: демонстрация
источник
Haskell, 92 байта
Пример использования:
h 12
->1816214400
.Как это устроено
источник
С
236174138121 байтБольшая заслуга Ричи, за массовое сокращение байтов.
Ungolfed
Попробуй это здесь .
источник
#define L long long L d;i,j,k,m,n,s=1,b[10]={1};L f(n){return n?n*f(n-1):1;}main(d){for(scanf("%d",&n);i<n;)for(j=i++;j;j/=10)++b[j%10],++s;for(;m<10;)d*=f(b[m++]);printf("%Ld",f(s)/d);}
for(;m<10;)s+=b[m],d*=f(b[m++])
но я думаю, что это еще пара байтов.C / bc,
233121112 байт (при условии 3-байтового штрафа за|bc
)Вдохновленный Коулом Кэмероном, убрал хакерские манипуляции с персонажами и просто сделал арифметику со значением аргумента.
Изменено на scanf с использованием вектора arg.
потребности
bc
на самом деле сделать вычисление произвольной точности.Безголовый и без предупреждения:
Иллюстрированный (которому я доверяю показывает алгоритм):
И, с помощью канала через bc (и добавление вычисления F (1000):
Это вычисленное F (5000) - число из 18 592 цифр - менее чем за 10 секунд.
источник
Perl 6, 117 байт
и в более читаемой моде
источник
Perl 5, 108 байт
Большое спасибо dev-null за то, что он сэкономил мне 17 байт, и japhy за идею факториала.
источник
05AB1E ,
131211 байтовПопробуйте онлайн!
источник
Python 2 , 123 байта
Попробуйте онлайн!
range
входные данные в одну строкуисточник
PowerShell, 125 байт
Принимает входные данные
$args[0]
, вычитает1
, строит диапазон целых чисел из0..
этого числа,-join
которые вместе в строку, и сохраняет его как$b
. Мы берем.Length
эту строку, строим другой диапазон из1..
этой длины,-join
вместе с этими целыми числами*
, а затем передаем этоInvoke-Expression
(аналогичноeval
). Другими словами, мы построили факториал длины числовой последовательности на основе входных данных. Это наш числитель.Мы делим это
/
на ...Наш знаменатель, который создается путем взятия диапазона
0..9
и отправки его через цикл for|%{...}
. На каждой итерации мы устанавливаем вспомогательную переменную,$c
равную числу раз, в течение которых текущая цифра$_
появляется,$b
благодаря вызову .NET,[regex]::matches
связанному с.count
атрибутом. Затем мы строим новый диапазон от1..
этого значения до тех пор, пока оно не равно нулю. Да, во многих случаях это приведет к диапазону1..1
, который оценивается как справедливый1
. Мы берем все это и-join
их вместе*
, а затем передаем этоInvoke-Expression
снова. Другими словами, мы построили произведение факториалов на число вхождений каждой цифры.NB
Обрабатывает ввод до
90
без проблем и значительно меньше, чем за секунду.... кроме того, это приводит
Infinity
к выводу, поскольку длина переставляемой строки приводит к тому,170!
что соответствуетdouble
типу данных (7.25741561530799E+306
), но171!
не соответствует. PowerShell имеет ... причуду ..., которая автоматически повышает[int]
значение[double]
в случае переполнения (при условии, что вы явно не приводили переменную для начала). Нет, я не знаю, почему это не относится к[long]
целочисленным значениям.Если бы мы выполнили какое-то явное приведение и манипуляцию (например, используя
[uint64]
64-разрядные целые числа без знака), мы могли бы получить это выше, но это значительно увеличило бы код, так как нам нужно было бы увеличить длину до 170 с помощью условных выражений, а затем перезаписать каждое умножение оттуда и далее. Поскольку в задаче не указан верхний диапазон, я предполагаю, что этого будет достаточно.источник
Perl6
Скорее разгульный на данный момент - нужно спать сейчас.
источник
Groovy, 156 байтов
Мое скромное первое решение Code Golf. Вы можете проверить это здесь.
А вот более читаемая версия:
Довольно просто, но для меня было несколько важных моментов:
Выполнение инъекции / редукции из массива
chars
вMap<Character, Integer>
. Это все еще было немного сложным из-за отсутствия значения по умолчанию для значений карты. Это сомнение возможно, но если на карте по умолчанию все значения равны 0, я мог бы избежать троичной системы, которая необходима, чтобы избежать NPE.Оператор распространения Groovy (например
}*.value
) всегда интересно использоватьОднако досадной особенностью была необходимость объявить функцию факториала с типом возвращаемого значения
BigInteger
. У меня сложилось впечатление, что Groovy обернул все числа вBigInteger
илиBigDecimal
, но это может быть не так, когда дело доходит до возвращаемых типов. Мне придется больше экспериментировать. Если этот тип возврата явно не указан, мы очень быстро получаем некорректные значения факториала.источник
J, 33 байта
Преобразует диапазон в строку цифр, подсчитывает каждую цифру и применяет коэффициент многочлена для вычисления результата.
использование
источник
R, 118 байт
Около 8 месяцев опоздал на вечеринку, но подумал, что мне стоит попробовать, потому что это было интересно.
Попробуйте это на R-Fiddle
Разъяснения
0 ... n-1
и сверните его в строку:paste(1:n-1,collapse="")
x
):x=as.numeric(el(strsplit(...,"")))
factorial(sum(1|x))
что просто#digits!
Чтобы вычислить знаменатель, мы используем
table
для построения таблицы сопряженности, в которой перечислены частоты. В случае F (12) сгенерированная таблица:Что означает, что мы можем взять использование
factorial()
(которое, кстати, векторизовано) на счетчике и просто взять продукт:prod(factorial(table(x)))
Примечание: шаги 4 и 5 выполняются только в
n>0
случае возврата1
.источник
Mathematica, 65 байт
Возможно, будет дальше в гольф.
источник
Рубин , 64 байта
Попробуйте онлайн!
источник
Stax , 12 байт
Запустите и отладьте его на staxlang.xyz!
Распаковывается (14 байт) и объяснение:
источник
Желе , 11 байт
15-байтовое желе от Dennis, отвечающее ...
Монадическая ссылка, принимающая неотрицательное целое число, которое дает положительное целое число.
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
источник
Python 2 , 190 байт
Попробуйте онлайн!
источник
Python 2 , 134 байта
Попробуйте онлайн!
Альтернативный подход ...
источник