Напишите программу, которая отображает на экране сумму делителей числа (1 ≤ N ≤ 100), введенных пользователем в диапазоне от 1 до N.
Это OEIS A000203 .
Примеры:
Вход : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Выход: 8
Вход: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Выход: 24
Вход: 20
20 / 1 = 20
20 / 2 = 10
20 / 4 = 5
20 / 5 = 4
20 / 10 = 2
20 / 20 = 1
20 + 10 + 5 + 4 + 2 + 1 = 42
Выход: 42
Вход: 1
1 / 1 = 1
Выход: 1
Вход: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Выход: 6
Ответы:
05AB1E , 2 байта
Попробуйте онлайн!
Как?
источник
ÑO
- Отказ от вызова и выигрыш одновременно. Это довольно круто.Машинный код x86-64, 23 байта
Приведенные выше байты кода определяют функцию, которая принимает одно целое число N и в результате возвращает сумму его кратных.
Одиночный параметр передается в
EDI
регистр, в соответствии с System V AMD64 ABI (как используется в системах * nix-стиля). Результат возвращается вEAX
регистр, как и во всех соглашениях о вызовах x86.Алгоритм очень прост, похож на многие другие материалы на других языках. Мы зациклились N раз, каждый раз вычисляя по модулю и добавляя это к нашему текущему итогу.
Неуправляемая сборка мнемоники:
Попробуйте онлайн!
Кажется, кажется, должен быть способ сделать это короче, но я не вижу этого. Вычисление по модулю на x86 занимает довольно много кода, так как вы делаете это с помощью инструкции
DIV
(илиIDIV
), и оба из них используют фиксированные входные регистры (EDX
иEAX
), значения которых засоряются (потому что они получают результаты, остаток и частное соответственно).Единственные настоящие трюки здесь довольно стандартные:
LOOP
инструкцию в стиле CISC , которая в основном является просто комбинациейDEC
+JNZ
сECX
регистром в качестве неявного операнда.XCHG
в конце вместо того,MOV
потому что у первого есть специальная 1-байтовая кодировка, когдаEAX
один из операндов.CDQ
чтобы обнулитьEDX
при подготовке к разделению, даже если для беззнакового разделения вы обычно просто обнуляете его, используя aXOR
. Тем не менее,XOR
всегда 2 байта, аCDQ
только 1 байт. ЯCDQ
снова использую второй раз внутри цикла до нуляEDX
, передCMOVZ
инструкцией. Это работает, потому что я могу гарантировать, что частное от деления (вEAX
) всегда без знака, поэтому расширение знака вEDX
установитEDX
равным 0.источник
C (gcc), 45 байт
Попробуйте онлайн!
источник
Japt , 3 байта
Попробуйте онлайн!
источник
â x
-x
, это может быть один байтБрахилог , 2 байта
Попробуйте онлайн!
объяснение
источник
Mathematica, 14 байтов
или ответ @Loki
Mathematica, 17 байт
источник
Tr@Divisors@#&
даже лучше ;-)f=
которая принимает ввод f [x], поэтому я представляю ее таким образом. Добро пожаловать в PPCGTr@*Divisors
чтобы сбрить байт.C, C ++, C #, D, Java,
6562 байтаЭто работает во всех тезисах 5 языков программирования из-за сходства.
C, C ++ и D оптимизация:
6260 байтовВ C ++ и D целые числа неявно преобразуются в логические значения (Zero => false, Not Zero => true), поэтому вам не нужно иметь
!=0
D оптимизация: система шаблонов для гольфа, 55 байтов
Код для тестирования :
C:
C ++:
C #:
D:
Джава :
источник
n%i
/n%i!=0
на любом из языков. Во-вторых, ваше первое решение должно быть в состоянии иметьn%i>0
вместоn%i!=0
. В-третьих, решение D может заключатьсяT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
в злоупотреблении системой шаблонов и значениями по умолчанию.Шнап ,
4443 байта-1 до свидания благодаря мистеру Xcoder (LOL я был превзойден в отставке на моем родном языке)
Это функция (
$
запускает функцию в Shnap).Попробуйте онлайн!
Объяснение:
Неконкурентный, 19 байт
После многих языковых обновлений это теперь может быть уменьшено до жалких 19 байтов:
Попробуйте онлайн!
источник
==0
is<1
( 43 байта )Python, 44 байта
источник
J, 23 байта
Попробуйте онлайн!
Для поклонников J есть умное 13-байтовое решение :
>:@#.~/.~&.q:
но так как это было не мое изобретение, я не публикую его в качестве официального ответа.Мое собственное решение просто фильтрует 1..n, находит делители, а затем суммирует их. Суть этого - диадическая вилка
Обратите внимание, что в этом контексте
]
это 1..n, и[
само n. Следовательно]|[
, остатки при делении каждого элемента из 1..n на n, и=&0
говорит вам, если они равны 0.источник
+1#.i.*0=i.|]
i.|]
большим улучшением моего подхода. Я не до конца понимаю эту часть:+1#.i.
- не могли бы вы объяснить это?1#.
конверсия базы 1, что эквивалентно+/"1
. Сначала,i.|]
чтобы получить остатки, затем0=
найти те, которые равны 0 (делители), затемi.*
обнулить неразделители в диапазоне, затем суммировать1#.
, затем добавить+
себя, такi.
как это исключительный диапазон.Java (OpenJDK 8) ,
5351 байтПопробуйте онлайн!
источник
Haskell , 30 байт
Попробуйте онлайн!
источник
MATL , 6 байтов
Попробуйте онлайн!
-4 байта благодаря @LuisMendo
10 байт
Мое предыдущее решение с использованием цикла
Попробуйте онлайн!
3 байта
Использование встроенного
Попробуйте онлайн!
источник
Javascript,
5444 байтаСохранено 10 байтов благодаря Shaggy
Попробуйте онлайн!
источник
Brain-Flak , 96 байт
Попробуйте онлайн!
Объяснение:
Сейчас устарели улучшения.
Суть алгоритма заключается в следующем:
Это модификация мода, которая даст нам,
M
если это факторN
и0
иначе. Полный код ниже.источник
R ,
3126 байтПопробуйте онлайн!
Возвращает
1x1
матрицу.Вычисляет
!N%%x
карты элементовd
из1:N
по:d->(1 if d divides N, 0 otherwise)
Тогда
x%*%x!N%%x
матричное произведение1:N
которого приводит к суммеx
где!N%%x
есть1
. Ухоженная! Технически порт Луиса Мендо в октавском ответе но я увидел это только после того, как подумал об этом.R + числа, 14 байтов
Попробуйте онлайн!
источник
N=scan();
numbers::Sigma(N)
? Таким образом, он выводит исходный код функцииSigma
.JavaScript, 31 байт
источник
Пари / ГП , 5 байт
Попробуйте онлайн!
источник
Python 2 , 41 байт
Попробуйте онлайн!
источник
VBA (Excel), 73 байта
источник
Sub Y
End Sub
Sub y
A=Cells(1,1)
x=1
While x<=A
If A Mod x=0 Then b=b+x
x=x+1
Wend
MsgBox b
End Sub
Sub y
While x<=[A1]
x=x+1
If [A1]Mod x=0Then b=b+x
Wend
Debug.?b
End Sub
которое предполагает, что оно запускается в чистом модуле (x = значение по умолчанию int0
) и?
выводится в непосредственное окно VBE ( автоформаты вPrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
который предполагает , чтоx
,b
является значение по умолчанию 0 и выводит в ближайшее окно VBE (от непосредственное окно VBE?
эквивалентноDebug.Print
)Pyth , 6 байт
Попробуй это здесь!
В Pyth нет встроенных делителей, поэтому я думаю, что это разумно.
объяснение
Учитывая
20
, например, это то, что наша программа делает после каждой инструкции:P
:[2, 2, 5]
.y
:[[], [2], [2], [5], [2, 2], [2, 5], [2, 5], [2, 2, 5]]
.{
:[[], [2], [5], [2, 2], [2, 5], [2, 2, 5]]
.*M
:[1, 2, 5, 4, 10, 20]
.s
:42
.источник
Ом v2 , 2 байта
Попробуйте онлайн!
Это довольно просто:
источник
Шелуха , 5 байт
Попробуйте онлайн!
Как?
Спасибо Zgarb за предложения в чате!
источник
Октава , 20 байт
Попробуйте онлайн!
источник
RProgN 2 , 2 байта
Разъяснения
Тривиально, но чувствовал, что это необходимо опубликовать.
Попробуйте онлайн!
источник
Perl 5 , 35 + 1 (-p) = 36 байт
Попробуйте онлайн!
источник
Утилиты Bash + GNU, 36
Попробуйте онлайн .
Чистый Баш, 41
Попробуйте онлайн .
Сначала я попробовал причудливый ответ расширения bash, но он оказался длиннее, чем простой цикл выше:
источник
Добавить ++ , 9 байт
Попробуйте онлайн!
Я явно пришел сюда слишком поздно. Это определяет функцию, которая получает факторы, а затем суммирует их.
источник
QBIC , 17 байт
объяснение
источник
Gaia , 2 байта
Попробуйте онлайн!
Довольно просто:
источник