Ваша функция принимает натуральное число и возвращает наименьшее натуральное число, которое имеет именно такое количество делителей, включая себя.
Примеры:
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
Функция не должна возвращать список делителей, они только здесь для примеров.
Ответы:
APL,
252423 символаОпределяет функцию,
f
которую затем можно использовать для вычисления чисел:Решение использует тот факт, что LCM (n, x) == n, если x делит n . Таким образом, блок
{+/⍵=⍵∧⍳⍵}
просто вычисляет количество делителей. Эта функция применяется ко всем числам от 1 до 2 ^ d¨⍳2*⍵
. Полученный список затем искали г самого (⍳⍵
) , которая является искомой функцией F (d) .источник
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 символовРедактировать: один символ может быть сохранен, если мы ограничим поиск до <2 ^ n, спасибо Питеру Тейлору за эту идею.
Предыдущая версия:
Попытка в GolfScript, запустить онлайн .
Примеры:
Код содержит в основном три блока, которые подробно описаны в следующих строках.
источник
1
.Python: 64
Пересматривая решение Бакуриу и включив в него предложение grc, а также хитрость решения R планнапа, мы получаем:
источник
Python: 66
Вышеприведенное приведёт к
RuntimeError: maximum recursion depth exceeded
небольшому количеству входных данных в CPython, и даже если установить ограничение на огромное количество, это, вероятно, вызовет некоторые проблемы. На реализациях Python, которые оптимизируют хвостовую рекурсию, она должна работать нормально.Более подробной версией, которая не должна иметь таких ограничений, является следующее 79- байтовое решение:
источник
if else
наand or
и==1
с<1
:f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
экономит 7 байт.Mathematica
3836Использование:
Результат:
редактировать
Некоторое объяснение:
Поскольку
form[i]
я использую функцию1 &
, она всегда возвращает результат1
, поэтому эффективно вычисляет сумму делителей кратким образом.источник
DivisorSum
возвращает (сумма делителей), но я не понимаю, как это полезно для ответа на поставленный вопрос. Не могли бы вы объяснить, как это работает. Кстати, я думаю, что вы должны включить данные синхронизации для n = 200; функция удивительно быстрая, учитывая все числа, которые она должна была проверить.J, 33 знака
Довольно быстро, проходит через все меньшие числа и вычисляет количество делителей на основе факторизации.
источник
Haskell 54
Быстрое и грязное (настолько удобочитаемое и не хитрое) решение:
источник
К, 42
Неэффективное рекурсивное решение, которое легко взрывает стек
,
источник
APL 33
Пример:
источник
APL (25)
источник
R - 47 символов
!n%%1:n
дает вектор логических значений: TRUE, когда целое число от 1 до n является делителем n, и FALSE, если нет.sum(!n%%1:n)
Приводит логические значения к 0, если FALSE, и 1, если TRUE, и суммирует их, так чтоN-sum(...)
0, когда число делителей равно N. 0, затем интерпретируется как FALSE какwhile
после чего останавливается.Использование:
источник
Javascript 70
На самом деле есть только 46 значащих символов:
Я, вероятно, должен выучить язык с более коротким синтаксисом :)
источник
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Хаскель: 49 символов
Это можно рассматривать как улучшение более раннего решения на Haskell, но оно было задумано само по себе (предупреждение: оно очень медленное):
Это довольно интересная функция, например, обратите внимание, что f (p) = 2 ^ (p-1), где p - простое число.
источник
n
на простые числа (с повторениями), отсортировать по убыванию, уменьшить на единицу, сжать с бесконечной последовательностью простых чисел, а затем сложить произведениеp^(factor-1)
C:
6664 символаПочти краткое решение:
И мое предыдущее решение, которое не повторяется:
Должны существовать гораздо более короткие решения.
источник
Haskell (120C), очень эффективный метод
Тестовый код:
Этот метод очень быстрый. Идея состоит в том, чтобы сначала найти основные факторы
k=p1*p2*...*pm
, где p1 <= p2 <= ... <= pm. Тогда ответn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.Например, разложив k = 18, мы получим 18 = 2 * 3 * 3. Первые 3 простых числа равны 2, 3, 5. Таким образом, ответ n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
Вы можете проверить это в
ghci
:источник
Brachylog , 2 байта
Попробуйте онлайн!
Принимает ввод через свою выходную переменную и выводит через свою входную переменную.
Точно такой же предикат, принимающий ввод через свою входную переменную и выводящий через выходную переменную, вместо этого решает эту проблему .
источник
C 69 символов
Не самый короткий, но первый ответ C:
f(n,s)
рассчитывает делителейn
в диапазоне1..s
. Такf(n,n)
считает делителейn
.g(d)
циклы (рекурсией) доf(x,x)==d
, затем возвращает х.источник
Mathematica
3836использование
Первая запись (до
code-golf
добавления тега к вопросу.)Простая проблема, учитывая, что
Divisors[n]
возвращает делителиn
(в том числеn
) иLength[Divisors[n]]
возвращает количество таких делителей. **Примеры
источник
Length@Divisors@n
естьDivisorSigma[0,n]
.DivisorSigma
.Желе , 6 байт (не конкурирует)
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
2*
? Неужели каждый номер после этого имеет больше делителей, чем n?2**(n-1)
принадлежит к этому диапазону, наименьший тоже.C ++, 87 символов
источник
Python2, 95 символов, нерекурсивный
Немного более многословно, чем в других решениях Python, но оно нерекурсивно, поэтому оно не достигает предела рекурсии cpython:
источник
Perl 6 , 39 символов
Пример использования:
источник