Задача состоит в том, чтобы вычислить сумму делителей числа с учетом его первичной факторизации.
вход
Два массива (или что-то эквивалентное) длины n , один из которых содержит простой множитель, а другой - соответствующий показатель степени.
Выход
Сумма всех делителей (включая само число).
пример
Число 240 имеет 2, 3 и 5 как простые множители с 4, 1 и 1 как соответствующие показатели. Ожидаемый результат будет 744.
Input: [2,3,5] [4,1,1]
Output: 744
счет
Самый короткий код в байтах побеждает!
Если сложность времени выполнения вашего решения составляет O (сумма показателей), а не O (произведение показателей), ваш результат может быть умножен на 0,8.
Здесь был опубликован похожий вопрос , но это не было проблемой. Я думаю, что проблема в том, чтобы играть в гольф.
Победитель будет выбран в эти выходные
Ответы:
Pyth, 13 байтов * 0,8 = 10,4
Демонстрация.
Этот ответ работает несколько иначе, чем выше. Чтобы вычислить сумму факторов простых степеней числа, вместо использования арифметической формулы, факторы явно построены и суммированы.
Так , например, на [премьер, показатель] пары
[2, 4]
, мы отображаем2 ^ x
над0, 1, 2, 3, 4
, давая[1, 2, 4, 8, 16]
, который затем суммируется до 31.Результаты затем умножаются вместе и печатаются.
Если возведение в степень реализовано правильно, или если есть промежуточное кэширование результатов, это будет
O(sum of exponents)
.источник
O(n)
если мы можем предположить, что основание является константой.CJam, 15 байтов * 0,8 = 12
Попробуйте онлайн . Порядок ввода - сначала список экспонент, затем список простых чисел (-3 байта благодаря @Dennis) .
Для каждой пары простых чисел
(p, e)
найтизатем найдите продукт всего этого. Например, для 240 это будет
В зависимости от того, как возведено возведение в степень, это может быть лучше, чем
O(sum of exponents)
.источник
APL,
1813 байтов * 0,8 = 10,4Это создает цепочку диадических функций, которая принимает массив факторов слева и показатели степени справа.
Попробуйте онлайн . Обратите внимание, что это тот же подход, что и в удивительно умном ответе CJam на Sp3000 .
Сохранено 5 байтов благодаря Денису!
источник
TI-BASIC, 17 байтов * 0,8 = 13,6
Также использует метод Sp3000, хотя я нашел его независимо. Принимает один список из ввода и один из главного экрана.
Использование prod (вдвое меньше, потому что позволяет бесплатно использовать круглые скобки. Обратите внимание, что этот ответ не поддерживает пустые массивы, поскольку в TI-BASIC нет пустых массивов.
источник
Haskell, 38 * 0,8 = 30,4
Использование:
Анонимная функция сводится
(p,e)
к сумме делителей для суммыp^e
через геометрические ряды. Объединение двух списков с этим, так как соединение и получение продукта дает результат.Я не смог найти ничего короче, чем арифметическое выражение
Может быть, есть способ избавиться от
(\p e->_)
.Определение инфиксной функции дает ту же длину (38):
источник
C ++,
1118077 байт * 0,8 = 61,6Это вычисляет (p ^ (e + 1) -1) / (p-1) и рекурсивно умножает все факторы. Узнал об этом сам год назад.
Спасибо за помощь, полностью забыл про использование логического стиля в c ++.
источник
n==0
упрощает до!n
- или вы могли бы обратить вспять результаты и просто использоватьn
Матлаб, 53
Пример:
источник
s
а затем проверяю все возможные делители от1
доs
. Таким образом, это (по крайней мере) O (s), который, вероятно, находится между O (сумма показателей степени) и O (произведение показателей степени)Python 2,156
вход
Выход
объяснение
Эта программа получает список из 2 списков: факторы и показатели.
Затем создайте список всех возможных комбинаций списка экспонентов.
и застегните это с факторами:
Рассчитаем факторы на степень показателей:
и умножим каждый список (это дает нам все делители):
Наконец, суммируйте все списки и напечатайте:
источник
Питон 3,
134120117Ввод: два массива, разделенных запятыми.
Пример:
С помощью NumPy можно уменьшить до 100 байт:
источник
operator
для использованияmul
один раз, вы можете использовать,float.__mul__
чтобы сохранить кучу байтов.Желе, неконкурентоспособное
Этот ответ не конкурирует, так как задача предшествует созданию желе.
5 байт (без бонуса)
Попробуйте онлайн!
Как это работает
7 байт (5,6 байт после бонуса)
Как это работает
Попробуйте онлайн!
источник
APL, 12 байтов * 0,8 = 9,6
Это читает два списка с клавиатуры, сначала экспоненты, то есть:
Объяснение:
⎕
: прочитать список с клавиатуры (экспоненты)⍳¨
: для каждого номера в списке, создать список[1..n]
.⎕*
: прочитать другой список с клавиатуры (простые числа) и поднять каждое простое число до каждого из показателей в соответствующих списках+/¨
: суммировать каждый список1+
: добавьте один к каждому результату, чтобы компенсировать недостающиеx^0
в каждом из списков×/
: взять произведение результатовисточник
Ракетка (схема), 65 * 0,8 = 52 байта
Та же арифметика, что и у всех остальных
Объяснение:
источник
Python 2, 80 байт * 0,8 = 64
Это предполагает, что вход поступает один за другим. Следует той же формуле, которая описана в ответе CJam на Sp3000.
Если это не разрешено, тогда я буду использовать это как решение, которое получит оценку 84 байта * 0,8 = 67,2. Входные данные должны быть разделены запятой, то есть
[2,3,5],[4,1,1]
.Psst. Привет! Это возможное решение в Symbolic, над которым я работаю:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
источник
Mathematica, 40 байт
Без использования каких-либо встроенных функций, которые имеют дело с делителями, чтобы отличаться от других решений Mathematica в потоке.
Ввод (на примере)
[{2, 3, 5}, {4, 1, 1}]
источник
Perl 5, 96 байт
Очевидно, что это не выигрыш, но я решил написать это для удовольствия.
Это подпрограмма:
Посмотрите на это так:
Как это работает:
($b,$e)=@_
читает входные массивыrefs$b
(базисы) и$e
(экспоненты).$s=1
инициализирует продукт.map$s*=$b->[$_]**$e->[$_],0..@$b-1
умножается$s
на последовательные базовые экспоненты. Теперь$s
это составной номер.$_=1x$s
устанавливает$_
равным строке единиц,$s
long.$i
инициализируется в 0.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
пытается, для каждого числа$j
от 1$s
до, разбить$_
, так как$j
символы повторяются любое количество раз. Если это возможно, то$j
делит$s
, и/^(.{$j})*$/
равен 1 (в противном случае это 0), и$i
увеличивается на$j
. Таким образом, мы добавляем к$i
числу разделов равного размера раздел$_
. Как указывает Омар Э. Пол ,$i
это число, которое мы ищем.$i
в конце возвращается$i
.источник
J 14 байтов * 0,8 = 11,2
использование
источник