Порахуйте дільники числа


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

Табло лідерів

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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


11

LabVIEW, 4938 байт

Добре це, очевидно, не підходить для коду гольфу, але що завгодно, тому для моєї першої пошти і lolz тут йде. enter image description here


Ласкаво просимо до головоломки програмування та коду для гольфу! Як ти це оцінив, якщо ти не проти мені запитати? Я не зміг знайти жодного прецеденту на Meta.
bkul

Я врятував його і взяв його розмір
Евмель

А це було 4 938 байт? Не кілобайт, наприклад?
bkul

для точності я взяв підрахунок байтів не кількість кб
Евмель

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

Діалог APL , 7 6 байт

≢∘∪⊢∨⍳

Це неназвана функція, яку можна назвати, а потім повторно використовувати для кожного ( ¨) тестового випадку так:

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

Пояснення:

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

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

Завдяки ngn за збереження байта.


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

Ось як це працює:

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

⍳|⊢Аргумент розділення 1 через аргумент-залишок
0=Булевий, якщо 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. Підсумовування булів використовує той факт, що Python трактує True/ Falseяк 1/ 0.


6

Сітківка , 17 байт

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

Введення одинарне , вихід у десятковій формі.

Спробуйте в Інтернеті.

При виклику одного регексу Retina просто підраховує відповідність. Сам регулярний вираз відповідає позиції , де унарне число зліва від нього є дільником всього вводу. Я також використовую той факт, що знаки оточення є атомними, так що мені не потрібно використовувати ^якір.

Перший погляд за спиною просто фіксує весь префікс у групі 1. Це ніколи не може зазнати невдачі, тому після огляду ми знаємо, що це в групі 1, і це більше не зміниться.

Тоді lookahead перевіряє, чи зможемо ми дійти до кінця рядка, повторивши захоплений рядок (наш потенційний дільник) 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

Гольфскрипт, 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 байт

Мій перший гольф у Дж. Я все ще його вчу.

Збережено байт завдяки Деннісу.

Збережено ще один байт завдяки випадковим.

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

Арсьоу , 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

Матлаб, 20 байт

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

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

Це був би і мій підхід!
Луїс Мендо

Цікаво, що це така ж довжина length(divisors(n)).
Накопичення

@Акумуляція вам все-таки потрібно буде додати, @(n)щоб зробити його дійсним
ухвалою

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

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

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

Якщо припустити, що вхід і вихід не є одинаковими, а вихід береться з основної відповідності регулярного вираження.

Розбивка регексу:

  • .*$ ets вказівник на кінець рядка, щоб у нас був весь вхід x в одному напрямку.
  • (?<=^\2*(.+?(?>\2?))) збігається справа наліво і перевіряє дільник, перебираючи з x на 0.
    • (.+?(?>\2?)) "змінна", яка починається з 1 у першій ітерації та продовжується від числа попередньої ітерації та циклів до x.
    • ^\2* перевіряє, чи x є кратним "змінної".

В основному вона має таку ж ідею, як і моя відповідь на обчислення Phi (а не Pi) . Тільки чек відрізняється.

Тестуйте регекс на 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: Збереження байта, спираючись на функцію відповіді С вище.

Редагуйте 4: Завдяки ן nɟuɐɯɹɐ ן oɯ та Нілу , але я не можу працювати.

Редагувати 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 .
манатура

2
Також відмовтеся від шкідливих звичок: коли у вас є вибір між ++iі i++, вибирайте перший (це не має нічого спільного з гольфом). Також n%i<1слід зберегти байт.
Мартін Ендер

2
Тільки коротко перевірений:n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
маневрений дію

1
38: n => eval ('for (d = 0, i = n; i; d + = n% i - <1); d')
Mama Fun Roll

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% item == 0), неявно відкинувши результат модуля як булевий, а потім перевернувши його, використовуючи !так, що дільники стають $ true та дозволені через; використовуючи вбудований псевдонім? дляWhere-Object
  • зібрати ()і .Countскільки предметів потрапило через фільтр

Дуже гарно зламано!
bkul


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.

Спробуйте в Інтернеті!

Безголівки:

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.


1

Математика, 16 байт

Length@*Divisors

Проста функціональна композиція вбудованих модулів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.