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


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

Ответы:


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

Захватывающий. Хороший подход
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 здесь идет. введите описание изображения здесь


Добро пожаловать в программирование головоломок и 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]

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.


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

Для такой же длины вы могли бы также~: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

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

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))

Это был бы мой подход тоже!
Луис Мендо

Интересно, что это такая же длина, как и 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

Рубин, 27 байт

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

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

2.1.5 :001 > ->n{(1..n).count{|i|n%i<1}}[100]
 => 9 

2

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

@(n)nnz(~mod(n,1:n))

Мне нравится nnz, отличное использование здесь =)
flawr

2

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

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

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

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

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

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

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




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>


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сколько предметов прошло через фильтр

Очень красиво взломан!
bkul

2

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

Æd

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

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


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.

2

05AB1E , 2 байта

Ñg

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

Довольно просто, но здесь это все равно:

Ñ   # Push a list of divisors of the (implicit) input-integer
    #  i.e. 100 → [1,2,4,5,10,20,25,50,100]
 g  # Pop and push the length of this list
    #  i.e. [1,2,4,5,10,20,25,50,100] → 9
    # (which is output implicitly as result)


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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.