Собственный делитель является делителем из числа п , которое не является п сам по себе. Например, правильными делителями 12 являются 1, 2, 3, 4 и 6.
Вам дадут целое число x , x ≥ 2, x ≤ 1000 . Ваша задача - сложить все самые высокие собственные делители целых чисел от 2 до x (включительно) (OEIS A280050 ).
Пример (с x = 6
):
Найти все целые числа от 2 до 6 (включительно): 2,3,4,5,6.
Получить правильные делители всех из них и выбрать самые высокие из каждого числа:
- 2 -> 1
- 3 -> 1
- 4 -> 1, 2
- 5 -> 1
- 6 -> 1, 2, 3 .
Сумма высших правильных делителей
1 + 1 + 2 + 1 + 3 = 8
.Окончательный результат 8.
Тестовые случаи
Вход | Выход ------- + --------- | 2 | 1 4 | 4 6 | 8 8 | 13 15 | 41 37 | 229 100 | 1690 1000 | 165279
правила
Применяются стандартные лазейки .
Вы можете взять ввод и обеспечить вывод любым стандартным методом .
Это код-гольф , выигрывает самая короткая действительная подача на каждом языке! Веселиться!
Ответы:
Оазис , 4 байта
Код:
Попробуйте онлайн!
Объяснение:
Расширенная версия:
источник
Шелуха , 7 байт
Попробуйте онлайн!
объяснение
В Husk нет встроенной функции для непосредственного вычисления делителей, поэтому вместо этого я использую простую факторизацию. Самый большой правильный делитель числа - произведение его главных факторов кроме самого маленького. Я отображаю эту функцию в диапазоне от 2 до ввода и суммирую результаты.
источник
Python 2 , 50 байт
Это медленно и не может даже справиться с вводом 15 на TIO.
Попробуйте онлайн!
Однако памятка ( спасибо @ musicman523 ) может быть использована для проверки всех тестовых случаев.
Попробуйте онлайн!
Альтернативная версия, 52 байта
По стоимости 2 байта мы можем выбрать, вычислять
f(n,k+1)
или нетn/k+f(n-1)
.С некоторыми хитростями, это работает для всех тестовых случаев, даже на TIO.
Попробуйте онлайн!
источник
f
это чистая функция , вы можете memoize его запустить большие дела по TIOЖеле , 6 байт
Попробуйте онлайн!
Как это устроено
источник
Брахилог , 10 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 40 байт
Число равно произведению его самого высокого правильного делителя и его наименьшего простого множителя.
источник
n>352
(по крайней мере в этом фрагменте, не знаю, зависит ли это от моего браузера / машины), в то время как вы должны поддерживать хотя бы доn=1000
.n=1000
если вы используете, напримерnode --stack_size=8000
.05AB1E ,
98 байт-1 байт благодаря уловке главного фактора Лики Нун в его ответе Pyth
Попробуйте онлайн!
объяснение
Альтернативное 8-байтовое решение (не работает на TIO)
и ofc альтернативное 9-байтовое решение (работает на TIO)
источник
Сетчатка ,
3124 байта7 байтов благодаря Мартину Эндеру.
Попробуйте онлайн!
Как это устроено
Регулярное выражение
/^(1+)\1+$/
захватывает самый большой правильный делитель определенного числа, представленного в унарном. В коде\1+
синтаксис преднамеренного преобразования.источник
Mathematica, 30 байт
источник
Pyth ,
1398 байт1 байт благодаря якоблаву.
Тестовый пакет .
Как это устроено
Самый большой правильный делитель - произведение главных факторов кроме самого маленького.
источник
Python 2 (PyPy) ,
737170 байтНе самый короткий ответ Python, но он просто проходит через контрольные примеры. TIO обрабатывает до 30 000 000 входов без всяких потов; Мой настольный компьютер обрабатывает 300 000 000 в минуту.
При стоимости 2 байта условие
n>d
может быть использовано для ускорения ~ 10%.Спасибо @xnor за
r=[0]*n
идею, которая сэкономила 3 байта!Попробуйте онлайн!
источник
l=[0]*n
должен позволить вам избавиться от-2
.exec
вроде убивает скорость, но дажеwhile
петля будет короче моего подхода.Haskell,
484643 байтаПопробуйте онлайн!
Редактировать: @rogaos сохранил два байта. Благодарность!
Редактировать II: ... и @xnor еще 3 байта.
источник
f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
sum
, поэтому подумал, что она не короче.until
сохраняет еще немного:until((<1).mod n)pred(n-1)+f(n-1)
Japt ,
8 + 2 = 1086 байтПроверь это
объяснение
источник
-x
считается как два байта в соответствии с этим постом . Тем не менее, я думаю, что вы можете сохранить байт с помощьюò2_â1 o
(â
исключая исходное число, если дан аргумент)â
аргумент дало мне спасение, которое я искал.õ Å
до и нашел пару 8- и 9-byters:õ Åx_/k g
,õ Åx_k Å×
,õ Åx_â¬o
. И, комбинируяõ
иÅ
с вашим гениальнымxo
трюком, я нашел 7-байтовое решение :-)MATL, 12 байт
Попробуйте это на MATL Online
объяснение
источник
PHP , 56 байт
Попробуйте онлайн!
источник
Пролог (SWI) , 72 байта
Попробуйте онлайн!
источник
Cubix , 27
39байтПопробуйте онлайн!
Cubified
Смотреть это работает
0IU
Установите стек с аккумулятором и начальным целым числом. Разворот во внешний цикл:(?
дублировать текущую вершину стека, декремент и тест\pO@
если ноль зацикливается вокруг куба до зеркала, возьмите дно стека, выведите и остановите%\!
если положительный, мод, отобрать и проверить.u;.W
если правда, развернись, убери результат мода и перестроись обратно во внутренний циклU;p+qu;;\(
если фальси, разворот, удалите результат мода, приведите аккумулятор к вершине, добавьте текущий целочисленный (верхний) делитель толчка к низу и разворот. Очистите стек, чтобы получить только аккумулятор и текущее целое число, уменьшить число и снова войти во внешний цикл.источник
C # (.NET Core) ,
7472 байтаПопробуйте онлайн!
источник
break
в гольфj=0
.На самом деле , 12 байтов
Попробуйте онлайн!
источник
Python 3 ,
78 75 7371 байтДаже близко к ответу Python про Лаки Монахини в подсчете байтов.
Попробуйте онлайн!
источник
Python 3 ,
696359 байт4 байта благодаря Денису.
Попробуйте онлайн!
Я установил предел рекурсии на 2000, чтобы он работал на 1000.
источник
Древесный уголь , 37 байт
Попробуйте онлайн!
Ссылка на подробную версию. Мне потребовался почти весь день, чтобы понять, как я могу решить вопрос, не связанный с ASCII-искусством, в Charcoal, но, наконец, я его получил и очень горжусь собой. :-D
Да, я уверен, что это может быть много в гольфе. Я только что перевел свой ответ на C # и уверен, что в Charcoal все можно сделать по-другому. По крайней мере, это решает
1000
дело за пару секунд ...источник
Пари / ГП ,
3630 байтПопробуйте онлайн!
источник
Python 2 (PyPy) , 145 байт
Поскольку превращение соревнований код-гольф в соревнованиях быстро кодовыми весело, здесь есть O ( п алгоритм ), который в TIO решает n = 5 000 000 000 за 30 секунд. ( Сито Денниса - O ( n log n ).)
Попробуйте онлайн!
Как это устроено
Подсчитаем размер набора
S = {( а , b ) | 2 ≤ a ≤ n , 2 ≤ b ≤ наибольший собственный делитель ( a )},
переписав его как объединение по всем простым числам p ≤ √n,
S p = {( p ⋅ d , b ) | 2 ≤ d ≤ n / p , 2 ≤ b ≤ d },
и используя принцип включения-исключения :
| S | = ∑ (−1) m - 1 | S p 1 ∩ ⋯ ∩ S p m | свыше m ≥ 1 и простых чисел p 1 <⋯ < p m ≤ √n,
где
S p 1 ∩ ⋯ ∩ S p m = {(p1⋯p m ⋅e,b) | 1 ≤e≤n/ (p1⋯p m ), 2 ≤b≤p1⋯p m - 1e},
| S p 1 ∩ ⋯ ∩S p m | = ⌊n/ (p1⋯p m ) ⌋⋅ (p1⋯ pm - 1⋯ p m ) ⌋ + 1) - 2) / 2. ⋅ (⌊ n / (р 1
Сумма имеет C ⋅ n ненулевых членов, где C сходится к некоторой константе, которая, вероятно, 6 probably (1 - ln 2) / π 2 ≈ 0.186544. Окончательный результат тогда | S | + n - 1.
источник
NewStack , 5 байт
К счастью, на самом деле есть встроенный.
Разбивка:
На реальном английском языке:
Давайте запустим пример для ввода 8.
Nᵢ
: Составьте список натуральных чисел от 1 до 8:1, 2, 3, 4, 5, 6, 7, 8
;
: Вычислить самые большие факторы:1, 1, 1, 2, 1, 3, 1, 4
q
, Удалить первый элемент:1, 1, 2, 1, 3, 1, 4
Σ
И возьми сумму:1+1+2+1+3+1+4
=13
источник
1+1+2+1+3+1+4
=13
Не8
. Кроме того: отличный ответ, так что +1.Java 8,
787472 байтаПорт @CarlosAlejo на C #.
Попробуй это здесь.
Старый ответ (78 байт):
Попробуй это здесь.
Объяснение (старого ответа):
источник
Lua , 74 байта
Попробуйте онлайн!
источник
J , 18 байт
Попробуйте онлайн!
источник
С накоплением , 31 байт
Попробуйте онлайн! (Все тестовые случаи, кроме 1000, что превышает 60 секунд онлайн-лимита.)
объяснение
источник
C (gcc) , 53 байта
Попробуйте онлайн!
Комфортно быстро проходит все тестовые случаи.
источник