Подсчитайте делители числа

26

Введение

Это очень простая задача: просто посчитайте делители числа. У нас уже была похожая, но более сложная задача , но я намерен пройти начальный уровень.

Соревнование

Создайте программу или функцию, которая, учитывая одно строго положительное целое число N, выводит или возвращает количество делителей, включая 1 и N.

Ввод: одно целое число> 0. Вы можете предположить, что число может быть представлено в типе нумерации вашего языка.

Вывод: число положительных целочисленных делителей, включая 1 и само число.

Материалы будут оцениваться в байтах . Вы можете найти этот сайт удобным, хотя вы можете использовать любой разумный метод для генерации вашего количества байтов.

Это , поэтому выигрывает самый низкий балл!

Изменить: Похоже, 5-байтовый ответ Pyth FryAmTheEggman является победителем! Не стесняйтесь представить новые ответы, хотя; если вы можете получить что-то короче, я изменю принятый ответ.

Тестовые случаи

ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9

Leaderboards

Вот фрагмент стека, чтобы генерировать как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в свой заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

bkul
источник

Ответы:

19

Пиф, 5

l{yPQ

Использует операцию подмножеств на основных факторах входных данных, затем сохраняет только уникальные списки факторов и возвращает это количество.

Тестирование

объяснение

Используя 25 в качестве примера, так что список подмножеств не очень длинный

l{yPQ     ## implicit:  Q = eval(input()) so Q == 25
   PQ     ## Prime factors of Q, giving [5, 5]
  y       ## All subsets, giving [[], [5], [5], [5, 5]]
 {        ## Unique-fiy, giving [[], [5], [5, 5]]
l         ## Length, print implicity
FryAmTheEggman
источник
Захватывающий. Хороший подход
Cyoce
14

C ++ C, 43 57 56 46 43 байта

На предложения Мартина Бюттнера:

i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
Сахиль Арора
источник
1
Подождите, давайте посчитаем их обоих вместо 43:i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
Мартин Эндер
@ MartinBüttner Вау, мужик, вау. Шутки в сторону! _ / \ _
Сахил Арора
1
Прекрасный! : ~)!
sweerpotato
11

LabVIEW, 4938 байт

Ну, это явно не подходит для кода гольф, но что угодно, так что для моего первого поста и LOLZ здесь идет. введите описание изображения здесь

Eumel
источник
Добро пожаловать в программирование головоломок и Code Golf! Как ты забил это, если ты не против, чтобы я спросил? Я не мог найти прецедента на Мете.
bkul
я сохранил его и взял его размер
Eumel
И это было 4,938 байта? Например, не килобайт?
bkul
для точности я взял количество байтов, а не число килобайт
Eumel
4
@bkul Я думаю, что путаница связана с тем ., что, я уверен, подразумевается как разделитель тысяч, а не десятичный разделитель (как это принято в некоторых языках).
Мартин Эндер
10

Haskell, 28 байт

f n=sum[0^mod n i|i<-[1..n]]

Хитрость заключается в том, чтобы проверить, использует ли остаток 0функцию индикатора 0^.

0^0 = 1
0^_ = 0

Это работает, потому что любая положительная степень 0 равна 0, тогда как 0 ^ 0 является комбинаторно пустым произведением 1.

Сравните это с фильтрацией

f n=sum[1|i<-[1..n],mod n i<1]
XNOR
источник
7

Дьялог АПЛ , 7 6 байт

≢∘∪⊢∨⍳

Это безымянная функция, которая может быть названа и затем повторно использована для каждого ¨теста ( ) следующим образом:

      f ← ≢∘∪⊢∨⍳
      f¨ 1 2 12 30 60 97 100
1 2 6 8 12 2 9

Объяснение:

 ┌─┴──┐  
 ∪  ┌─┼─┐
 ∘  │ ∨ │
 ̸≡  ⊢   ⍳

Граф уникальный НОД сам по себе и каждый из целых чисел, пока .

Спасибо ngn за сохранение байта.


Старая версия: +/0=⍳|⊢

Вот как это работает:

  ┌─┴─┐      
  / ┌─┼───┐  
┌─┘ 0 = ┌─┼─┐
+       ⍳ | ⊢

⍳|⊢
0=Логический аргумент деления-остатка от 1 до аргумента Логический, если 0 равен
+/сумме остатка от логического деления , т. Е. Количество единиц.

Адам
источник
6

Python 2, 37 байт

f=lambda n,i=1:i/n or(n%i<1)+f(n,i+1)

Рекурсивная функция. Необязательный вход iв тестируемом делителе. Выражение (n%i<1)проверяет делимость, с True(что равно 1) для делителей. Результат добавляется в рекурсивное выражение для i+1. Когда i==nдостигается, целочисленное деление i/nпо полу оценивается 1, и это значение возвращается в качестве базового случая, считая nсебя делителем n.


38:

lambda n:sum(n%-~i<1for i in range(n))

Анонимная функция. Тесты всех возможных делителей 1через n. Это сдвигается вверх от 0через n-1в range(n)использовании -~, который добавляет 1. Суммирование bools использует тот факт, что Python рассматривает True/ Falseкак 1/ 0.

XNOR
источник
6

Сетчатка , 17 байт

(?<=(.+))(?=\1*$)

Ввод в унарном виде , вывод в десятичном виде.

Попробуйте онлайн.

Когда Retina вызывается с одним регулярным выражением, она просто считает совпадения. Само регулярное выражение соответствует позиции , где унарное число слева от него является делителем всего ввода. Я также использую тот факт, что lookarounds являются атомарными, так что мне не нужно использовать ^якорь.

Первый взгляд позади просто захватывает весь префикс в группе 1. Это никогда не может потерпеть неудачу, поэтому после просмотра мы знаем, что в группе 1, и это больше не изменится.

Затем предварительный просмотр проверяет, сможем ли мы достичь конца строки, повторяя захваченную строку (наш потенциальный делитель) 0 или более раз.

Мартин Эндер
источник
6

J, 10 байт

[:*/1+_&q:

Это безымянный, монадический глагол. Он вычисляет σ 0 (∏p k α k ) как ∏ (α k + 1) .

Попробуйте его в Интернете с J.js .

Как это работает

[:*/1+_&q:    Right argument: y

      _&q:    Compute all exponents of the prime factorization of y.
    1+        Add 1 to each exponent.
[:*/          Reduce by mutiplication.
Деннис
источник
Я не думаю, что q:это разрешено, поскольку это решает существенную часть проблемы. Как насчет просто[:+/0=]|~1+i.
FUZxxl
Это было бы дубликатом этого ответа . Кроме того, встроенные модули не запрещены по умолчанию, и задача, похоже, не затрагивает их.
Деннис
Встроенные функции, которые выполняют всю / почти всю работу по вызову, обычно запрещены, но я могу следовать вашим соображениям q: .
FUZxxl
1
Они не. Я хотел бы, чтобы они были, но это не так.
Деннис
Hrmpf HRMPF, что немного отстой.
FUZxxl
6

Golfscript, 19 18 17 13 байт

С благодарностью Мартина Бюттнера .

~.,\{\)%!}+,,

Как это работает

~               Evaluate the input, n
 .,             Duplicate the input, create array [0..n-1]
   \            Swap array and n
    {    }+     Add n to block == {n block}
     \          Swap n with i in array
      )         Increment i
       %        n mod i
        !       Logical not so that 1 if divisible by n else 0
           ,    Filter array using block for all i divisible by n
            ,   Get length of the filtered array, the answer

Также

От @Peter Taylor , также в 13 байтах.

~:X,{)X\%!},,

Как это работает

~               Evaluate the input
 :X             Store input in variable X
   ,            Create array [0..X-1]
    {     },    Filter array using the following block
     )          Increment i in array
      X\        Add X to stack, swap with i
        %       X mod i,
         !      Logical not so that 1 if divisible by n else 0
            ,   Get length of the filtered array, the answer
Sherlock9
источник
Для такой же длины вы могли бы также~:X,{)X\%!},,
Питер Тейлор
4

J, 13 12 11 байт

Мой первый гольф в J. Я все еще учусь этому.

Спас Байт благодаря Денису.

Сохранен еще один байт благодаря рандоме.

1+/@,0=i.|]

Объяснение:

1+/@,0=i.|]
       i.        the array 0 .. n-1
         |]      mod n
     0=          replace 0 by 1, and nonzero entries by 0
1   ,            prepend 1 to the array
 +/@             take the sum
alephalpha
источник
3

Arcyóu , 12 байт

Давайте начнем вечеринку!

(F(x)(_(d/ x

Это использует встроенную функцию d/. Вот версия без встроенного (27 байт):

(F(x)(](+(f i(_ 1 x)(‰ x i

Объяснение:

(F(x)              ; Anonymous function with one parameter x
  (]               ; Increment
    (+             ; Sum
      (f i(_ 1 x)  ; For i in range from 1 to x-1 inclusive:
        (‰ x i     ; x divisible by i
bkul
источник
3

CJam, 11 байт

ri_,:)f%0e=

Проверьте это здесь.

объяснение

CJam не имеет встроенного для этого, поэтому мы делаем пробное разделение.

ri  e# Read input and convert to integer N.
_,  e# Duplicate and turn into range [0 1 ... N-1]
:)  e# Increment each element in the range to get [1 2 ... N]
f%  e# Take N modulo each of the list elements.
0e= e# Count the zeroes.

бонус

Вот интересное решение в 12 байтов (которое, я подозреваю, может быть самым коротким на языке, подобном J):

ri_)2m*::*e=

Результат равен тому, сколько раз nпоявляется в n x nтаблице умножения:

ri  e# Read input and convert to integer N.
_)  e# Duplicate and increment.
2m* e# Take Cartesian product of [0 1 ... N] with itself.
::* e# Compute the product of each pair.
e=  e# Count the occurrences of N.
Мартин Эндер
источник
3

Matlab, 20 байтов

Выполните k mod nдля каждого k = 1,...,n, затем выполните not(что превращает каждый ненулевой в ноль и каждый ноль в 1) и суммируйте все эти значения.

@(n)sum(~mod(n,1:n))
flawr
источник
Это был бы мой подход тоже!
Луис Мендо
Интересно, что это такая же длина, как и length(divisors(n)).
накопление
@ Аккумуляция, которую вам все равно нужно добавить, @(n)чтобы сделать ее действительным вложением
flawr
3

Юлия, 20 байт

n->sum(i->n%i<1,1:n)

Это анонимная функция, которая работает следующим образом: для каждого целого числа от 1 до входа проверьте, является ли вход по модулю целым числом равным нулю. Если это так, значение будет true, в противном случае false. Мы суммируем по логическим значениям, которые неявно приводятся к целым числам, получая количество делителей.


Гораздо более прохладное (хотя и гораздо более длинное) решение, включенное для полноты картины,

n->prod(collect(values(factor(n))).+1)

Это получает каноническую факторизацию n, то есть \prod_{i=1}^k p_i^e_i, и вычисляет функцию делителя как τ(n) = \prod_{i=1}^k e_i + 1.

Алекс А.
источник
2

PARI / GP, 6 байтов

PARI / GP имеет встроенный для этого.

numdiv
alephalpha
источник
я не уверен, но я думаю, что согласно мета, для встроенных, вы не можете просто переформулировать это.
Maltysen
3
@ Maltysen Я думаю, что это разрешено. meta.codegolf.stackexchange.com/a/7206/9288
алефальфа
2

Рубин, 27 байт

->n{(1..n).count{|i|n%i<1}}

Образец прогона:

2.1.5 :001 > ->n{(1..n).count{|i|n%i<1}}[100]
 => 9 
manatwork
источник
2

Октава, 21 20 байт

@(n)nnz(~mod(n,1:n))
alephalpha
источник
Мне нравится nnz, отличное использование здесь =)
flawr
2

Regex (.NET), 33 байта

^((?=.*$(?<=^\2*(.+?(?>\2?)))).)+

Предполагая, что входные и выходные данные унарные, а выходные данные берутся из основного совпадения регулярного выражения.

Сломать регулярное выражение:

  • .*$ устанавливает указатель на конец строки, чтобы у нас был весь ввод x в одном направлении.
  • (?<=^\2*(.+?(?>\2?))) соответствует справа налево и проверяет делитель, циклически изменяя значение от x до 0.
    • (.+?(?>\2?)) является «переменной», которая начинается с 1 в первой итерации и продолжается от числа в предыдущей итерации и повторяется до x.
    • ^\2* проверяет, является ли x кратным переменной

По сути, это та же идея, что и мой ответ на « Рассчитать фи» (не пи) . Только чек отличается.

Проверьте регулярное выражение в RegexStorm .

n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳
источник
2

Лабиринт , 33 байта

?:}
  :{:}%{{
@ }   " )
!{("{;"}}

Попробуйте онлайн.

Это реализует пробное разделение. Я добавлю полное объяснение позже. Это, вероятно, не оптимально, но мне трудно придумать что-то более короткое.

Мартин Эндер
источник
2

Perl 6 , 17 байт

{[+] $_ X%%1..$_} # 17

использование:

say {[+] $_ X%%1..$_}(60); # 12␤

my $code = {[+] $_ X%%1..$_};

say $code(97); # 2␤

my &code = $code;
say code 92; # 6
Брэд Гилберт b2gills
источник
2

Javascript (ES6), 60 57 42 40 39 37 байт

Это может быть лучше в гольф.

n=>{for(d=i=n;i;n%i--&&d--);return d}

Редактировать 1: я был прав. Удалены брекеты после цикла for.

Редактировать 2: Гольф до 40 байт благодаря манату и Мартину Бюттнеру .

Редактировать 3: Сохранение байта, основывая функцию на ответе C выше.

Редактировать 4: Спасибо ן nɟuɐɯɹɐ ן oɯ и Нейлу , но я не могу заставить работать eval.

Изменить 5: Забыл удалить Eval.

Тест

n = <input type="number" oninput='result.innerHTML=(

n=>{for(d=i=n;i;n%i--&&d--);return d}

)(+this.value)' /><pre id="result"></pre>

Sherlock9
источник
2
Откажись от хороших привычек. Удалить varключевые слова. Дополнительные советы в Советы по игре в гольф на JavaScript и Советы по игре в гольф в ECMAScript 6 .
manatwork
2
Также откажитесь от вредных привычек: когда у вас есть выбор между ++iи i++, выберите первое (это не имеет ничего общего с игрой в гольф). Также n%i<1следует сохранить байт.
Мартин Эндер
2
Только кратко проверено:n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
Манатворк
1
38: n => eval ('для (d = 0, i = n; i; d + = n% i - <1); d')
развлекательный ролик Mama
1
@manatwork Почему бы и нет n%++i||++d?
Нил
2

PowerShell, 34 байта

param($x)(1..$x|?{!($x%$_)}).Count

e.g. 

PS C:\temp> .\divisors-of-x.ps1 97
2
  • создать список чисел от 1 до x, подать их в конвейер |
  • отфильтровать конвейер (x% item == 0), неявно приведя результат по модулю к логическому значению, а затем инвертировав его с использованием !делителей, которые становятся $ true и пропускаются; используя встроенный псевдоним ?дляWhere-Object
  • собрать ()и .Countсколько предметов прошло через фильтр
TessellatingHeckler
источник
Очень красиво взломан!
bkul
2

Желе , 2 байта (не конкурирующие (снова))

Æd

Попробуйте онлайн!

Я думаю, что это использует функции, реализованные после другого ответа желе. Комментарий, если я ошибаюсь (я не могу посмотреть каждый коммит в строке, вы знаете :))

Эрик Outgolfer
источник
2

Такси, 2143 байта

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Cyclone.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Cyclone:n 1 l.Pickup a passenger going to Firemouth Grill.Pickup a passenger going to Joyless Park.Go to Firemouth Grill:s 1 l 2 l 1 r.Go to Joyless Park:e 1 l 3 r.[i][Check next value n-i]Go to Zoom Zoom:w 1 r 2 l 2 r.Go to Sunny Skies Park:w 2 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Sunny Skies Park.Go to Joyless Park:n 2 r 2 r 2 l.Pickup a passenger going to Cyclone.Go to Sunny Skies Park:w 1 r 2 l 2 l 1 l.Go to Cyclone:n 1 l.Pickup a passenger going to Joyless Park.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:n 2 r 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Trunkers.Pickup a passenger going to Equal's Corner.Go to Trunkers:s 1 l.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:w 1 l.Switch to plan "F" if no one is waiting.Pickup a passenger going to Knots Landing.Go to Firemouth Grill:n 3 r 1 l 1 r.Pickup a passenger going to The Underground.Go to The Underground:e 1 l.Pickup a passenger going to Firemouth Grill.Go to Knots Landing:n 2 r.Go to Firemouth Grill:w 1 l 2 r.Go to Joyless Park:e 1 l 3 r.Switch to plan "N".[F][Value not a divisor]Go to Joyless Park:n 3 r 1 r 2 l 4 r.[N]Pickup a passenger going to The Underground.Go to The Underground:w 1 l.Switch to plan "E" if no one is waiting.Pickup a passenger going to Joyless Park.Go to Joyless Park:n 1 r.Switch to plan "i".[E]Go to Sunny Skies Park:n 3 l 2 l 1 l.Pickup a passenger going to What's The Difference.Go to Firemouth Grill:s 1 l 1 l 1 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:w 1 l 1 r 2 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Попробуйте онлайн!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left 2nd right.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st right.
Go to Cyclone: north 1st left.
Pickup a passenger going to Firemouth Grill.
Pickup a passenger going to Joyless Park.
Go to Firemouth Grill: south 1st left 2nd left 1st right.
Go to Joyless Park: east 1st left 3rd right.
[i]
[Check next value n-i]
Go to Zoom Zoom: west 1st right 2nd left 2nd right.
Go to Sunny Skies Park: west 2nd left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Sunny Skies Park.
Go to Joyless Park: north 2nd right 2nd right 2nd left.
Pickup a passenger going to Cyclone.
Go to Sunny Skies Park: west 1st right 2nd left 2nd left 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Joyless Park.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer: north 2nd right 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st left 1st left 2nd left.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Equal's Corner.
Go to Trunkers: south 1st left.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: west 1st left.
Switch to plan "F" if no one is waiting.
Pickup a passenger going to Knots Landing.
Go to Firemouth Grill: north 3rd right 1st left 1st right.
Pickup a passenger going to The Underground.
Go to The Underground: east 1st left.
Pickup a passenger going to Firemouth Grill.
Go to Knots Landing: north 2nd right.
Go to Firemouth Grill: west 1st left 2nd right.
Go to Joyless Park: east 1st left 3rd right.
Switch to plan "N".
[F]
[Value not a divisor]
Go to Joyless Park: north 3rd right 1st right 2nd left 4th right.
[N]
Pickup a passenger going to The Underground.
Go to The Underground: west 1st left.
Switch to plan "E" if no one is waiting.
Pickup a passenger going to Joyless Park.
Go to Joyless Park: north 1st right.
Switch to plan "i".
[E]
Go to Sunny Skies Park: north 3rd left 2nd left 1st left.
Pickup a passenger going to What's The Difference.
Go to Firemouth Grill: south 1st left 1st left 1st right.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: west 1st left 1st right 2nd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: east 3rd right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Объяснение:

Convert stdin to a number and store it in three locations for three purposes:
   Original (Sunny Skies Park)
   Counter for tested values (Joyless Park)
   Counter for divisors found (Firemouth Grill)
Divide the original by each Joyless Park value in turn.
If the division result equals the truncated division result, then it's a divisor.
When a divisor is found, subtract one from Firemouth Grill.
Repeat until Joyless Park hits zero.
Pickup the original from Sunny Skies Park and subtract the value from Firemouth Grill.
Convert the result to a string and print to stdout.
Инженер Тост
источник
2

Формула Excel, 42 28 байт

Изменить: я только что понял, что мне не нужно использовать INDIRECT, экономя 14 байтов!

Следующее должно быть введено как формула массива ( Ctrl+ Shift+ Enter):

=SUM(--NOT(MOD(N,ROW(1:N))))

Где N - номер для проверки.

Примеры:

{SUM(--NOT(MOD(32,ROW(1:32))))}
Result: 6
{SUM(--NOT(MOD(144,ROW(1:144))))}
Result: 15

Объяснение:

SUM(--NOT(MOD(N,ROW(1:N))))       Full formula

                ROW(1:N)          Generates an array of row numbers e.g {1;2;3;4;...N}
          MOD(N,ROW(1:N))         Does N MOD {1;2;3;4;,...N}
      NOT(MOD(N,ROW(1:N)))        Coerces zeros to ones, so that they may be counted, but actually returns an array of TRUE;FALSE;FALSE;...
    --NOT(MOD(N,ROW(1:N)))        Coerces the TRUEs to 1s and FALSEs to 0s.
SUM(--NOT(MOD(N,ROW(1:N))))       Sum the ones for the result.
i_saw_drones
источник
1

Mathematica, 16 байтов

Length@*Divisors

Простая функция составления встроенных модулей.

Мартин Эндер
источник
1

Минколанг 0,13 , 16 байт

ndd[0ci1+%,-]-N.

Проверьте все случаи здесь.

объяснение

ndd           Takes number from input and duplicates it twice (n)
[             Opens for loop that runs n times
 0c           Copies bottom of stack to top (n)
   i1+        Loop counter + 1 (d)
      %       Modulo - pops d,n, then pushes n%d
       ,      Not - 1 if equal to 0, 0 otherwise
        -     Subtract
         ]    Close for loop
-             Subtract (n - 1 for each non-divisor)
N.            Output as number and stop.
Эльендия Старман
источник