Простая, но, надеюсь, не совсем тривиальная задача:
Напишите программу или функцию, которая суммирует числа, k
разделяющие число n
. Более конкретно:
- Входные данные: два натуральных числа
n
иk
(или упорядоченная пара целых чисел и т. Д.) - Вывод: сумма всех положительных делителей
n
этихk
степеней целых чисел
Например, 11! = 39916800 имеет шесть делителей , которые являются кубами, а именно : 1, 8, 27, 64, 216 и 1728. Таким образом , данные входов 39916800
и 3
, программа должна вернуть их сумму, 2044
.
Другие тестовые случаи:
{40320, 1} -> 159120
{40320, 2} -> 850
{40320, 3} -> 73
{40320, 4} -> 17
{40320, 5} -> 33
{40320, 6} -> 65
{40320, 7} -> 129
{40320, 8} -> 1
{46656, 1} -> 138811
{46656, 2} -> 69700
{46656, 3} -> 55261
{46656, 4} -> 1394
{46656, 5} -> 8052
{46656, 6} -> 47450
{46656, 7} -> 1
{1, [any positive integer]} -> 1
Это код гольф, поэтому чем короче ваш код, тем лучше. Я приветствую гольф-код на всех языках, даже если какой-то другой язык может обходиться меньшим количеством байтов, чем ваш.
code-golf
arithmetic
number-theory
integer
Грег Мартин
источник
источник
Ответы:
05AB1E , 9 байтов
Попробуйте онлайн!
объяснение
Пример ввода
46656, 3
источник
Mathematica, 28 байт
Безымянная функция принимает
n
и вk
качестве входных данных в этом порядке.источник
DivisorSum
разочаровывающе близко к тому, чтобы быть полезным здесь.Haskell ,
37 3534 байтаПопробуйте онлайн! Использование:
Код довольно неэффективен, потому что он всегда вычисляет
1^k, 2^k, ..., n^k
.Изменить: Сохраненный один байт благодаря Zgarb.
Объяснение:
источник
mod n(x^k)
может бытьn`mod`x^k
.Python 2,
5452 байтаСпасибо @Rod за сокращение 2 байта.
источник
x%i**n==0
сx%i**n<1
, и перейти на другую сторону,i**n*(x%i**n<1)
Рубин, 45 байт
Короче было бы использовать "сумму" в Ruby 2.4. Время обновить?
источник
MATL , 10 байт
Попробуйте онлайн!
Как это работает
Пример с
46656
,6
.источник
Желе ,
76 байт-1 байт благодаря Деннису (обходить неявный диапазон)
. Умное сохранение эффективности также Деннисом при стоимости 0 байт
(ранее
ÆDf*€S
фильтр фильтровал бы те делители, которые являются степенью k любого натурального числа, до n . Но обратите внимание, что n может только когда-либо есть делитель i k, если он все равно имеет делитель i !)Попробуйте онлайн!
Как?
источник
JavaScript (ES7),
5653 байтаБерет
n
иk
в карри синтаксис(n)(k)
.Контрольные примеры
Показать фрагмент кода
источник
Perl 6 , 39 байт
Как это работает
Попытайся
источник
Japt , 10 байт
Сохранено много байтов благодаря @ETHproductions
объяснение
Проверьте это онлайн!
источник
vU
Обнаруживает ли числа, делимые наU
, или числа, которые делятсяU
?fvU
фильтрует элементы, которые делятся наU
;f!vU
фильтрует элементы, которыеU
делятся на.!
меняет аргументы.Scala 63 байта
источник
Python 2 , 50 байт
Попробуйте онлайн! Большие входные данные могут превышать глубину рекурсии в зависимости от вашей системы и реализации.
источник
JavaScript (ES7),
4946 байтисточник
n=>k=>
? +1.i
как локальный, который стоит 4 дополнительных байта, и забыл, что я мог злоупотреблять такi
же, как я делал с моей другой формулировкой.)PHP, 86 байт
Попробуй это здесь!
Сломать :
источник
for(;$x<$n=$argv[1];)$n%($x=++$i**$argv[2])?:$s+=$x;echo$s;
59 байт; требует PHP 5.6 или выше.CJam , 20 байтов
Вероятно, не оптимально в гольфе, но я не вижу каких-либо очевидных изменений, чтобы сделать ...
Попробуйте онлайн!
источник
Желе , 8 байт
Попробуйте онлайн!
( Кредит не мой. )
источник
Утилиты Bash + Unix, 44 байта
Попробуйте онлайн!
Тестовые прогоны:
источник
Python , 56 байт
Попробуйте онлайн!
Довольно просто. Единственное, что заслуживает внимания, это то, что
j**k**-1%1
всегда возвращает число с плавающей запятой в [0,1), аn%j
всегда возвращает неотрицательное целое число, поэтому они могут быть равны, только если оба равны 0 .источник
Пакет, 138 байт
Так как Batch не имеет оператора питания, я злоупотребляю
set/a
как формаeval
. Очень медленно, когдаk=1
. 32-разрядная целочисленная арифметика ограничивает поддерживаемые значенияn
иk
:источник
R, 28 байтов прямой, 43 байта для функции
если n, k в памяти:
для функции:
источник