Давайте поговорим о делителях ...
Оставляя идеальные квадраты (на мгновение), все натуральные числа можно выразить как произведение 2 их делителей. Быстрый пример для 126
: Вот все делители126
Как видите, все делители могут быть спарены. Вот что мы будем называть парами делителей :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]
Для этого испытания нам понадобится только последняя пара этого списка (которая является центральной парой изображения):.
[9,14]
Мы назовем эту пару парой делителей MaxMin . Отличие MAXMIN делителей Pair (ДМДП) представляет собой разность двух элементов пары , которая является
еще один пример . Делителями являются:
[9,14]=5
544
[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]
и DMDP (544) = 15, потому что32-17=15
А как насчет идеальных квадратов ? Все совершенные квадраты имеют DMDP = 0.
Например, 64
с делителями
{1, 2, 4, 8 , 16, 32, 64}
Как вы можете видеть в этом случае пара делителей MaxMin - это то, [8,8]
что DMDP=0
мы почти закончили ..
Соревнование
Учитывая целое число n>0
, выведите, сколько целых чисел меньше или равно 10000
, имеют DMDP меньше, чем n
Тестовые случаи
вход -> выход
1->100 (those are all the perfect squares)
5->492
13->1201
369->6175
777->7264
2000->8478
5000->9440
9000->9888
10000->10000
20000->10000
Это код-гольф. Самый короткий ответ в байтах выигрывает .
10000
как второй, переменный вход?Ответы:
JavaScript (ES7), 60 байт
Вероятно, превышает ваш предел рекурсии, поэтому вы можете предпочесть итерационную версию для 70 байт:
источник
Желе , 13 байт
1 байт благодаря Джонатану Аллану.
Попробуйте онлайн!
источник
ÆDạ"Ṛ$Ṃ
сохраняет вам байтыÆDạ:@¥⁸Ṃ
(у меня былоạ"ṚṂ
...ȷ4RÆDÇ€<⁸S
для 15 - слишком похоже - РЕДАКТИРОВАТЬ: хм или это было, без:
участия ... как вы думаете?)Java 8,
151111110101 байт-10 байт благодаря @Nevay .
Объяснение:
Попробуй это здесь.
источник
for(i=1,i+=Math.sqrt(x);--i>0;)if(...
чтобы сохранить 1 байт.n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}
x>=i*i
как альтернативу для использованияMath.sqrt
, так как это второй раз, когда вы играли в гольф в моем коде.R , 73
77байтСпасибо @Guiseppe за 4 байта
Попробуйте онлайн!
Вы потеряли функцию векторизации для вычисления DMDP и теперь используете функцию spply поверх функции. Истины для предметов, которые меньше, чем ввод, суммируются для результата.
источник
sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())
это немного корочеMathematica, 64 байта
Попробуйте это на Wolfram Sandbox
использование
объяснение
Создайте списки делителей, от
1
до10000
. (списки делителей сортируются автоматически)Подсчитайте вхождения элементов
a
, такие, что ...(input) + (left one of the middle element(s)) > (right one of the middle element(s))
Если есть только один средний элемент, left = right.источник
05AB1E ,
191817161512 байтПопробуйте онлайн!
объяснение
источник
MATL , 20 байтов
Время ожидания кода в TIO. Вот пример запуска с автономным компилятором:
источник
R , 91 байт
Принимает другой (худший) подход к вычислению DMDP, чем решение MickyT, используя индексирование массива и
diff
его вычисление. Увы.Попробуйте онлайн!
источник
Mathematica,
119115 байтЯ наконец-то заставил это работать, и я пытался последние полчаса. ._.
Пример запуска
источник
Cases
является4
байт короче:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&
. Смотрите этот совет .Count
даже корочеCases
.Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]&
10^4
или1*^4
короче10000
, и/@Range@
эквивалентно~Array~
.Mathematica, 78 байт
источник
Cases
является4
байт короче:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&
. Смотрите этот совет .Count
еще короче:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]&
шелуха , 19 байт
Нет ссылки TIO, так как время ожидания истекло. Эта версия использует 100 вместо 10000 и заканчивается через пару секунд.
объяснение
У Husk пока нет встроенных делителей или поддержки научных обозначений.
источник
Japt ,
251917 байтПроверь это
объяснение
Неявный ввод целого числа
U
.Создайте массив целых чисел (
õ
) от 1 до 100 (L
) в квадрате.Передайте каждый через функцию (где
X
находится текущий элемент), которая генерирует массив делителей (â
) ofX
.Отобразите этот массив делителей, где
Z
находится текущий элемент.Получить абсолютную разницу (
a
) отZ
иX
делить наZ
.Являются ли какие-либо элементы (
d
) в результирующем массиве меньшеU
?Подсчитайте правдивые элементы и неявно выведите результат.
источник
Рубин, 62 байта
Попробуйте онлайн.
источник
TI-BASIC, 46 байтов
Обратите внимание, что TI-BASIC является токенизированным языком. Кроме того, E в строке 2 - это маленькая заглавная буква E, найденная нажатием 2ND +,.
Результат будет в D и Ans сразу после выполнения программы. Если он должен отображаться, достаточно добавить еще два байта (символ новой строки и
Ans
).источник
Python 2 , 134 байта
Попробуйте онлайн!
Эхх ... нужно сделать намного лучше.
источник
len(filter(lambda n:n<i,...))
наsum(n<i for n in ....)
Python 2 , 83 байта
Немного на медленной стороне, использует 5 секунд на каждый тест
Попробуйте онлайн!
источник
PHP, 94 + 1 байт
Запустите как трубу с
-nR
или попробуйте онлайн .источник
VB.NET (.NET 4.5)
116115 байтОбъяснение:
Функция, которая принимает
n
в качестве параметра и возвращает результат.Начинается с квадратного корня и ищет ближайшее целое число, которое делится поровну (будет меньше из
MaxMin Divisor Pair
). Затем получает большее из пары (i/s
), находит разницу и сравнивает ее с входными данными.Используемые стратегии игры в гольф:
Dim
это дорого, поэтому чем меньше переменных я объявляю, тем лучше.s
как цельный тип, он бросает мне слово.^
качестве экспоненты. Так что пока10000
5 символов,10^4
есть только 4.return
, вместо нее будет возвращено значение переменной функции. Поэтому я сохраняю символы, не объявляя отдельную переменную и не используя оператор возврата.i
предполагается,Integer
потому что я назначил целочисленный литерал.A
предполагается,Object
но как только я добавляю целое число, оно ведет себя какInteger
.if
проверять, является ли разница удовлетворительной, добавьте ее непосредственно к результату, приведя логическое значение к целому числу. Тем не менее, VB использует-1
дляTrue
, поэтому вычтите, чтобы получить правильный знак.Mod
быть0
. Взятие модуля отрицательного числа в VB.NET даст отрицательный результат. Но все положительно, поэтому я могу сохранить байт, превратившись<>
в>
.Byte
сохранить его, сохранив байты в объявлении, используя более короткий именованный тип.Попробуйте онлайн!
источник
C # (.NET Core) , 104 байта
Попробуйте онлайн!
источник