Введение
Это очень простая задача: просто посчитайте делители числа. У нас уже была похожая, но более сложная задача , но я намерен пройти начальный уровень.
Соревнование
Создайте программу или функцию, которая, учитывая одно строго положительное целое число 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
C ++C,4357564643 байтаНа предложения Мартина Бюттнера:
источник
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 байт
Ну, это явно не подходит для кода гольф, но что угодно, так что для моего первого поста и LOLZ здесь идет.
источник
.
, что, я уверен, подразумевается как разделитель тысяч, а не десятичный разделитель (как это принято в некоторых языках).Haskell, 28 байт
Хитрость заключается в том, чтобы проверить, использует ли остаток
0
функцию индикатора0^
.Это работает, потому что любая положительная степень 0 равна 0, тогда как 0 ^ 0 является комбинаторно пустым произведением 1.
Сравните это с фильтрацией
источник
Дьялог АПЛ ,
76 байтЭто безымянная функция, которая может быть названа и затем повторно использована для каждого
¨
теста ( ) следующим образом:Объяснение:
Граф уникальный НОД сам по себе и каждый из целых чисел, пока .
≢
∘
∪
∨
⊢
⍳
Спасибо ngn за сохранение байта.
Старая версия:
+/0=⍳|⊢
Вот как это работает:
⍳|⊢
0=
Логический аргумент деления-остатка от 1 до аргумента Логический, если 0 равен+/
сумме остатка от логического деления , т. Е. Количество единиц.источник
Python 2, 37 байт
Рекурсивная функция. Необязательный вход
i
в тестируемом делителе. Выражение(n%i<1)
проверяет делимость, сTrue
(что равно1
) для делителей. Результат добавляется в рекурсивное выражение дляi+1
. Когдаi==n
достигается, целочисленное делениеi/n
по полу оценивается1
, и это значение возвращается в качестве базового случая, считаяn
себя делителемn
.38:
Анонимная функция. Тесты всех возможных делителей
1
черезn
. Это сдвигается вверх от0
черезn-1
вrange(n)
использовании-~
, который добавляет1
. Суммирование bools использует тот факт, что Python рассматриваетTrue
/False
как1
/0
.источник
Сетчатка , 17 байт
Ввод в унарном виде , вывод в десятичном виде.
Попробуйте онлайн.
Когда Retina вызывается с одним регулярным выражением, она просто считает совпадения. Само регулярное выражение соответствует позиции , где унарное число слева от него является делителем всего ввода. Я также использую тот факт, что lookarounds являются атомарными, так что мне не нужно использовать
^
якорь.Первый взгляд позади просто захватывает весь префикс в группе
1
. Это никогда не может потерпеть неудачу, поэтому после просмотра мы знаем, что в группе 1, и это больше не изменится.Затем предварительный просмотр проверяет, сможем ли мы достичь конца строки, повторяя захваченную строку (наш потенциальный делитель) 0 или более раз.
источник
J, 10 байт
Это безымянный, монадический глагол. Он вычисляет σ 0 (∏p k α k ) как ∏ (α k + 1) .
Попробуйте его в Интернете с J.js .
Как это работает
источник
q:
это разрешено, поскольку это решает существенную часть проблемы. Как насчет просто[:+/0=]|~1+i.
q:
.Golfscript,
19181713 байтС благодарностью Мартина Бюттнера .
Как это работает
Также
От @Peter Taylor , также в 13 байтах.
Как это работает
источник
~:X,{)X\%!},,
J,
131211 байтМой первый гольф в J. Я все еще учусь этому.
Спас Байт благодаря Денису.
Сохранен еще один байт благодаря рандоме.
Объяснение:
источник
Arcyóu , 12 байт
Давайте начнем вечеринку!
Это использует встроенную функцию
d/
. Вот версия без встроенного (27 байт):Объяснение:
источник
CJam, 11 байт
Проверьте это здесь.
объяснение
CJam не имеет встроенного для этого, поэтому мы делаем пробное разделение.
бонус
Вот интересное решение в 12 байтов (которое, я подозреваю, может быть самым коротким на языке, подобном J):
Результат равен тому, сколько раз
n
появляется вn x n
таблице умножения:источник
Matlab, 20 байтов
Выполните
k mod n
для каждогоk = 1,...,n
, затем выполнитеnot
(что превращает каждый ненулевой в ноль и каждый ноль в 1) и суммируйте все эти значения.источник
length(divisors(n))
.@(n)
чтобы сделать ее действительным вложениемЮлия, 20 байт
Это анонимная функция, которая работает следующим образом: для каждого целого числа от 1 до входа проверьте, является ли вход по модулю целым числом равным нулю. Если это так, значение будет
true
, в противном случаеfalse
. Мы суммируем по логическим значениям, которые неявно приводятся к целым числам, получая количество делителей.Гораздо более прохладное (хотя и гораздо более длинное) решение, включенное для полноты картины,
Это получает каноническую факторизацию
n
, то есть\prod_{i=1}^k p_i^e_i
, и вычисляет функцию делителя какτ(n) = \prod_{i=1}^k e_i + 1
.источник
PARI / GP, 6 байтов
PARI / GP имеет встроенный для этого.
источник
Pyth, 8 байт
Простое пробное деление.
Попробуйте это онлайн здесь .
источник
Рубин, 27 байт
Образец прогона:
источник
Октава,
2120 байтисточник
nnz
, отличное использование здесь =)Regex (.NET), 33 байта
Предполагая, что входные и выходные данные унарные, а выходные данные берутся из основного совпадения регулярного выражения.
Сломать регулярное выражение:
.*$
устанавливает указатель на конец строки, чтобы у нас был весь ввод x в одном направлении.(?<=^\2*(.+?(?>\2?)))
соответствует справа налево и проверяет делитель, циклически изменяя значение от x до 0.(.+?(?>\2?))
является «переменной», которая начинается с 1 в первой итерации и продолжается от числа в предыдущей итерации и повторяется до x.^\2*
проверяет, является ли x кратным переменнойПо сути, это та же идея, что и мой ответ на « Рассчитать фи» (не пи) . Только чек отличается.
Проверьте регулярное выражение в RegexStorm .
источник
Лабиринт , 33 байта
Попробуйте онлайн.
Это реализует пробное разделение. Я добавлю полное объяснение позже. Это, вероятно, не оптимально, но мне трудно придумать что-то более короткое.
источник
Perl 6 , 17 байт
использование:
источник
Javascript (ES6),
605742403937 байтЭто может быть лучше в гольф.
Редактировать 1: я был прав. Удалены брекеты после цикла for.
Редактировать 2: Гольф до 40 байт благодаря манату и Мартину Бюттнеру .
Редактировать 3: Сохранение байта, основывая функцию на ответе C выше.
Редактировать 4: Спасибо ן nɟuɐɯɹɐ ן oɯ и Нейлу , но я не могу заставить работать eval.
Изменить 5: Забыл удалить Eval.
Тест
источник
var
ключевые слова. Дополнительные советы в Советы по игре в гольф на JavaScript и Советы по игре в гольф в ECMAScript 6 .++i
иi++
, выберите первое (это не имеет ничего общего с игрой в гольф). Такжеn%i<1
следует сохранить байт.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 байта
|
!
делителей, которые становятся $ true и пропускаются; используя встроенный псевдоним?
дляWhere-Object
()
и.Count
сколько предметов прошло через фильтристочник
Желе , 2 байта (не конкурирующие (снова))
Попробуйте онлайн!
Я думаю, что это использует функции, реализованные после другого ответа желе. Комментарий, если я ошибаюсь (я не могу посмотреть каждый коммит в строке, вы знаете :))
источник
Такси, 2143 байта
Попробуйте онлайн!
Ungolfed:
Объяснение:
источник
Japt , 3 байта
-m
флаг для запуска всех тестовых случаев.Попытайся
источник
Формула Excel,
4228 байтИзменить: я только что понял, что мне не нужно использовать
INDIRECT
, экономя 14 байтов!Следующее должно быть введено как формула массива ( Ctrl+ Shift+ Enter):
Где N - номер для проверки.
Примеры:
Объяснение:
источник
05AB1E , 2 байта
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Довольно просто, но здесь это все равно:
источник
Mathematica, 16 байтов
Простая функция составления встроенных модулей.
источник
Минколанг 0,13 , 16 байт
Проверьте все случаи здесь.
объяснение
источник