Задача состоит в том, чтобы вычислить сумму цифр факториала числа.
пример
Input: 10
Output: 27
10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, а сумма цифр в числе 10! 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Вы можете ожидать, что входное значение будет целым числом больше 0. Выходные данные могут быть любого типа, но ответ должен быть в стандартной базе языка кодирования.
Тестовые случаи:
10 27
19 45
469 4140
985 10053
NB. Некоторые языки не могут поддерживать большие числа выше 32-битных целых чисел; для этих языков вы не должны рассчитывать большие факториалы.
Ссылка OEIS здесь благодаря Мартину Эндеру
Это код-гольф , поэтому выигрывает самый короткий код в символах!
code-golf
math
arithmetic
factorial
Джордж
источник
источник
n>21
Ответы:
05AB1E , 3 байта
Попробуйте онлайн!
источник
Желе , 3 байта
Попробуйте онлайн!
Делает то, что вы ожидаете:
источник
Mathematica, 21 байт
источник
[#!]
и нет@#!
? (Mathematica Noob)@
имеет более высокий приоритет, чем!
.C ++ 11, 58 байт
Как безымянная лямбда изменяет свой ввод:
Один из редких случаев , когда мой C ++ код короче , чем код C .
Если вы хотите поддержать большие случаи, переключитесь на C ++ 14 и используйте:
и поставьте вызывающий аргумент с
ull
суффиксом.Использование:
источник
Рубин,
63615338 байтНовый подход благодаря manatwork:
Старый:
источник
eval
путь->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pyth,
76 байтовСпасибо @Kade за то, что спасли мне байт
sj.!QT
Попробуйте онлайн!
Это мой первый раз, когда я использую Pyth, поэтому я уверен, что мой ответ может быть довольно удачным.
Объяснение:
источник
10
присваивается переменнойT
, так что вы можете сделать этоsj.!QT
:)ssM`.!
делает работу тоже, также в 6 байтов.Haskell,
4140 байтПример использования:
f 985
->10053
.Составьте список из
1
вx
, вычислите произведение элементов списка, превратите его в строковое представление, превратите каждый символ в число и сложите их.Изменить: @Angs сохранил байт. Благодарность!
источник
f x=sum$read.pure<$>(show$product[1..x])
сохраняет байтPython, 54 байта
repl.it
источник
R,
5853 байтаРедактировать: один байт благодаря @Jonathan Carroll и пару благодаря @Micky T
К сожалению, с 32-разрядными целыми числами это работает только для
n < 22
. Принимает ввод из stdin и выводит в stdout.Если вам нужна более высокая точность, нужно использовать некоторую внешнюю библиотеку, такую как
Rmpfr
:источник
c(x,"")
сравнениюpaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Приводит результат факториала к символу иstrsplit
возвращает его как второй список, поэтомуel
все еще работает и извлекает первые элементы списка.prod(1:scan())
?as.double
должно хватитьstrtoi
работает как более короткая заменаas.double
, я думаю.зернышко , 8 байт
Попробуйте онлайн!
объяснение
источник
CJam , 8 байт
Попробуйте онлайн!
объяснение
источник
Брахилог , 5 байт
Попробуйте онлайн!
объяснение
В основном описанный алгоритм:
источник
Java 7, 148 байт
источник
Рубин,
63 60 5351 байтСпасибо Мартину за помощь в игре в гольф.
источник
Напористый , 4 байта
Дайте ввод в командной строке:
$ pushy facsum.pshy 5
. Вот разбивка:источник
Октава, 30 байт
Вычисляет факториал, беря произведение из списка
[1 2 ... n]
. Преобразует его в строку и вычитает48
из всех элементов (код ASCII для0
). Наконец это подводит итог :)источник
bash (seq, bc, fold, jq),
3433 байтаКонечно, не самый элегантный, но для вызова
источник
fold -1
сохраняет байт.C 58 байт
Это не идеально. Работает только потому, что в начале должно быть -1. Идея состоит в том, чтобы использовать две рекурсивные функции в одной функции. Это было не так просто, как я сначала подумал.
Использование и понятный формат:
Изменить: я нашел метод, который позволяет использовать эту функцию несколько раз, но тогда длина составляет 62 байта.
источник
Perl 6 , 21 байт
Expanded:
источник
Cubix,
3332 байтаЧистая форма:
Попробуйте онлайн!
Заметки
Infinity
число (технически говоря, это не записываемое, не перечисляемое и не конфигурируемое свойство объекта окна).объяснение
Эта программа состоит из двух циклов. Первый вычисляет факториал ввода, другой разбивает результат на его цифры и складывает их вместе. Затем сумма печатается, и программа заканчивается.
Начало
Сначала нам нужно подготовить стек. Для этой части мы используем первые три инструкции. IP начинается на четвертой строке, указывая на восток. Стек пуст.
Мы будем хранить сумму в самом низу стека, поэтому нам нужно начинать с
0
суммы, храня ее в нижней части стека. Затем нам нужно нажать a1
, потому что ввод будет сначала умножен на число перед ним. Если бы это было ноль, факториал также всегда давал бы ноль. Наконец, мы читаем входные данные как целое число.Теперь, стек
[0, 1, input]
и IP находится на четвертой строке, четвертом столбце, указывающем на восток.Факториальная петля
Это простой цикл, который умножает два верхних элемента стека (результат предыдущего цикла и входные данные - n, а затем уменьшает входные данные. Он прерывается, когда ввод достигает 0. Из-за
$
инструкции IP пропускаетu
- Поворот. Цикл является следующей частью куба. IP начинается в четвертой строке, четвертом столбце.Из-за этого
^
персонажа IP сразу начинает двигаться на север. Затемu
поворачивает IP и перемещает его вправо. Внизу есть еще одна стрелка:<
указывает IP обратно в^
. Стек начинается как[previousresult, input-n]
, гдеn
число итераций. В цикле выполняются следующие символы:Затем в верхней части стека (уменьшил вход) сверяется
0
по!
инструкции, и если это0
, тоu
персонаж будет пропущен.Суммируйте цифры
IP оборачивается вокруг куба, заканчиваясь на последнем символе в четвертой строке, первоначально указывая на запад. Следующий цикл состоит в основном из всех оставшихся символов:
Цикл сначала удаляет верхний элемент из стека (который либо либо,
10
либо0
), а затем проверяет, что осталось от результата факториала. Если это было уменьшено до0
, печатается дно стека (сумма), и программа останавливается. В противном случае выполняются следующие инструкции (стек начинается как[oldsum, ..., factorial]
):И цикл начинается снова, пока не будет
factorial/10
равен 0.источник
C, 47 байтов
использование:
источник
Python, 57 байт
Попробуйте онлайн
источник
L
когда факториал станет достаточно большим, чтобы стать длинным.Пакет, 112 байт
Удобно
set/a
работает с текущим значением переменной, поэтому она работает нормально внутри цикла. Работает только до 12 из-за ограничений целочисленного типа пакета, поэтому в теории я мог бы сохранить байт, предположивf<1e9
:Но в этом и заключается безумие ... Я мог бы также жестко закодировать список в этом случае (97 байт):
источник
JavaScript (ES6), 50 байт
Работает только
n=22
из-за ограничений точности с плавающей точкой.источник
Befunge 93 ,
5654 байтаСохраненные 2 байта позволяют использовать вместо кавычек get. Это позволило мне сдвинуть верхние 2 строки на 1, уменьшив ненужные пробелы.
Попробуйте онлайн!
Объяснение:
источник
Javascript ES6 -
6154 байтаРЕДАКТИРОВАТЬ: Спасибо Hedi и ETHproductions за сбрить 7 байтов. Я должен помнить этот трюк.
источник
n=>{a=_=>!_||_*a(~-_);t=0;for(j of''+a(n))t-=-j;return t}
n=>eval(`for(j of''+(a=_=>!_||_*a(~-_))(n,t=0))t-=-j`)
AHK , 60 байт
AutoHotkey не имеет встроенной факториальной функции, а функции цикла имеют длинные имена для своих встроенных переменных. Первый цикл - это факториал, а второй - сложение цифр.
источник
J,
1211 байтСохранено 1 байт благодаря Коул!
Это просто применяет sum (
1#.
) к цифрам (используя обратноеinv
преобразование базы)#.
с основанием10
) факториала (!
) аргумента.Контрольные примеры
Примечание: последние два контрольных примера - это bigints, отмеченные трейлингом
x
.источник
"."0":
чтобы получить цифры1#.,.&.":@!
что требует повышенной точности и для небольших случаев (не знаю почему). Также 11 байт:1#.10#.inv!
.Brachylog (v2), 3 байта
Попробуйте онлайн!
Тот же «алгоритм», что и в ответе v1 от @Fatalize, только с лучшей кодировкой.
источник
C
6360 байт-3 байта для
do...while
цикла.Ungolfed и использование:
источник
int
по умолчанию?int
предполагается.