Отличия пар MaxMin Divisor (DMDP)

18

Давайте поговорим о делителях ...

Оставляя идеальные квадраты (на мгновение), все натуральные числа можно выразить как произведение 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как второй, переменный вход?
Джонатан Аллан
1
Да, я думал об этом, но это ничего не добавит к вызову. Таким образом, я думаю, что всем легче понять проблему.
1
Связанные
Питер Тейлор

Ответы:

5

JavaScript (ES7), 60 байт

f=(n,i=1e4,j=i**.5|0)=>i?i%j?f(n,i,j-1):(i/j-j<n)+f(n,i-1):0

Вероятно, превышает ваш предел рекурсии, поэтому вы можете предпочесть итерационную версию для 70 байт:

n=>[...Array(1e4)].map(g=(j=++i**.5|0)=>i%j?g(j-1):k+=i/j-j<n,i=k=0)|k
Нил
источник
4

Желе , 13 байт

1 байт благодаря Джонатану Аллану.

ȷ4RÆDạU$Ṃ€<⁸S

Попробуйте онлайн!

Дрянная Монахиня
источник
ÆDạ"Ṛ$Ṃсохраняет вам байты ÆDạ:@¥⁸Ṃ(у меня было ạ"ṚṂ... ȷ4RÆDÇ€<⁸Sдля 15 - слишком похоже - РЕДАКТИРОВАТЬ: хм или это было, без :участия ... как вы думаете?)
Джонатан Аллан
@JonathanAllan Я думаю, что вы должны опубликовать этот 13-байтовый
Leaky Nun
Ух ты. Нах ты иди на это, я спас тебе один байт, который спасает еще 2!
Джонатан Аллан
Не могли бы вы добавить объяснение?
Кевин Круйссен
4

Java 8, 151 111 110 101 байт

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;}

-10 байт благодаря @Nevay .

Объяснение:

Попробуй это здесь.

n->{               // Method with integer as parameter and return-type
  int r=0,         //  Result-integer
      x=10000,     //  Index-integer starting at 10,000
      i;           //  Another index-integer for the inner loop
  for(;x-->0;      //  Loop (1) from 10,000 down to 0
      r-=i-n>>-1)  //   If the MaxMin-Divisor Pair's difference is lower than the input,
                   //    add 1 to the result (after every iteration)
    for(i=x,       //   Set `i` to `x`
        i-->1;)    //   Inner loop (2) from `i` downwards to 1
      if(x>=i*i    //    If the current square-root of `x` is smaller than or equal to `i`,
         &x%i<1){  //    and if the current `x` is divisible by `i`:
        i=x/i-i;   //     Calculate the MaxMin-Division difference
        break;}    //     And leave the inner loop (2)
                   //   End of inner loop (2) (implicit / single-line body)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result
}                  // End of method
Кевин Круйссен
источник
1
Вы можете использовать, for(i=1,i+=Math.sqrt(x);--i>0;)if(...чтобы сохранить 1 байт.
Невай
У меня нет времени, чтобы попробовать это самому, но будет ли короче, чтобы внутренний цикл начинался с x и имел дополнительную переменную для текущего минимума?
JollyJoker
1
101 байт: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;}
Невай
@Nevay Еще раз спасибо, действительно нужно помнить x>=i*iкак альтернативу для использования Math.sqrt, так как это второй раз, когда вы играли в гольф в моем коде.
Кевин Круйссен
2

R , 73 77 байт

Спасибо @Guiseppe за 4 байта

sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())

Попробуйте онлайн!

Вы потеряли функцию векторизации для вычисления DMDP и теперь используете функцию spply поверх функции. Истины для предметов, которые меньше, чем ввод, суммируются для результата.

MickyT
источник
Ах, я не заметил, что DMDP - это минимальная разница в этом списке факторов! Очень хорошо. Я думаю, что sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())это немного короче
Джузеппе
2

Mathematica, 64 байта

Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

Попробуйте это на Wolfram Sandbox

использование

f = Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

 

f[1]
100
f /@ {1, 5, 13, 369, 777, 2000, 5000, 9000, 10000, 20000}
{100, 492, 1201, 6175, 7264, 8478, 9440, 9888, 10000, 10000}

объяснение

Divisors~Array~1*^4

Создайте списки делителей, от 1до 10000. (списки делителей сортируются автоматически)

Count[ ..., a_/; ... ]

Подсчитайте вхождения элементов a, такие, что ...

#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) Если есть только один средний элемент, left = right.

Юнг Хван Мин
источник
2

05AB1E , 19 18 17 16 15 12 байт

4°ƒNÑÂα{нI‹O

Попробуйте онлайн!

объяснение

4°ƒ            # for N in [0 ... 10**4] do:
   NÑ          # push divisors of N 
     Â         # bifurcate
      α        # element-wise absolute difference
       {       # sort
        н      # pop the head (smallest difference)
         I‹    # is it smaller than the input?
           O   # sum the stack
Emigna
источник
1

MATL , 20 байтов

1e4:"@Z\2Y"dJ2/)G<vs

Время ожидания кода в TIO. Вот пример запуска с автономным компилятором:

>> matl 1e4:"@Z\2Y"dJ2/)G<vs
> 13
1201
Луис Мендо
источник
1

R , 91 байт

function(n)sum(sapply(1:1e4,function(x,d=(1:x)[x%%1:x<1])diff(d[median(seq(d))+.5*0:1]))<n)

Принимает другой (худший) подход к вычислению DMDP, чем решение MickyT, используя индексирование массива и diffего вычисление. Увы.

Попробуйте онлайн!

Giuseppe
источник
1

Mathematica, 119 115 байт

(n=#;Tr[1^Select[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),#<n&]])&

Я наконец-то заставил это работать, и я пытался последние полчаса. ._.

Пример запуска

нет описания для вас!

totallyhuman
источник
Casesявляется 4байт короче: Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. Смотрите этот совет .
нгенисис
1
@ngenisis на самом деле Countдаже короче Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Мин
Кроме того, 10^4или 1*^4короче 10000, и /@Range@эквивалентно ~Array~.
JungHwan Мин
1

Mathematica, 78 байт

(s=#;Tr[1^Select[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],#<s&]])&
J42161217
источник
Casesявляется 4байт короче: Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. Смотрите этот совет .
нгенисис
1
@ngenisis Countеще короче:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Мин
1

шелуха , 19 байт

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100

Нет ссылки TIO, так как время ожидания истекло. Эта версия использует 100 вместо 10000 и заканчивается через пару секунд.

объяснение

У Husk пока нет встроенных делителей или поддержки научных обозначений.

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100  Input is n (accessed with ⁰).
               □100  Square of 100: 10000
              ḣ      Inclusive range from 1.
#                    Count number of elements for which
 ȯ                   this composition of 3 functions gives truthy result:
                       Argument k, say k = 12.
         §f`¦ḣ         Divisors of k:
             ḣ           Range: [1,2,3,..,12]
         §f              Filter by
           `¦            divides k: [1,2,3,4,6,12]
     Sz≠↔              Absolute differences of divisor pairs:
        ↔                Reverse: [12,6,4,3,2,1]
     Sz                  Zip with divisor list
       ≠                 using absolute difference: [11,4,1,1,4,11]
  V<⁰                  Is any of these less than n?
Zgarb
источник
1

Japt , 25 19 17 байт

L²õÈâ ®aX/ZÃd<UÃè

Проверь это


объяснение

Неявный ввод целого числа U.

L²õ

Создайте массив целых чисел ( õ) от 1 до 100 ( L) в квадрате.

Èâ          Ã

Передайте каждый через функцию (где Xнаходится текущий элемент), которая генерирует массив делителей ( â) of X.

®    Ã

Отобразите этот массив делителей, где Zнаходится текущий элемент.

aX/Z

Получить абсолютную разницу ( a) от Zи Xделить на Z.

d<U

Являются ли какие-либо элементы ( d) в результирующем массиве меньше U?

è

Подсчитайте правдивые элементы и неявно выведите результат.

мохнатый
источник
1

TI-BASIC, 46 байтов

Обратите внимание, что TI-BASIC является токенизированным языком. Кроме того, E в строке 2 - это маленькая заглавная буква E, найденная нажатием 2ND +,.

Input A
DelVar DFor(B,1,E4
For(C,1,√(B
If not(fPart(B/C
B/C-C<A
End
D+Ans→D
End

Результат будет в D и Ans сразу после выполнения программы. Если он должен отображаться, достаточно добавить еще два байта (символ новой строки и Ans).

Джосия Уинслоу
источник
0

Python 2 , 134 байта

lambda i:len(filter(lambda n:n<i,[reduce(lambda x,y:y-x,[[x,n/x]for x in range(1,int(n**.5+1))if n%x<1][-1])for n in range(1,10001)]))

Попробуйте онлайн!

Эхх ... нужно сделать намного лучше.

totallyhuman
источник
125 байт (-9 байт), используя ваш текущий подход, но заменяя len(filter(lambda n:n<i,...))наsum(n<i for n in ....)
Mr. Xcoder
114 байтов на основе комментария Mr.Xcoder.
ов
113 байт на основе комментария ovs.
Мистер Кскодер
0

Python 2 , 83 байта

Немного на медленной стороне, использует 5 секунд на каждый тест

lambda x:sum(x>min(abs(y/t-t)for t in range(1,y+1)if y%t<1)for y in range(1,10001))

Попробуйте онлайн!

Халвард Хаммель
источник
0

VB.NET (.NET 4.5) 116 115 байт

Function A(n)
For i=1To 10^4
Dim s As Byte=Math.Sqrt(i)
While i Mod s>0
s-=1
End While
A-=i/s-s<n
Next
End Function

Объяснение:

Функция, которая принимает n в качестве параметра и возвращает результат.

Начинается с квадратного корня и ищет ближайшее целое число, которое делится поровну (будет меньше из MaxMin Divisor Pair). Затем получает большее из пары ( i/s), находит разницу и сравнивает ее с входными данными.


Используемые стратегии игры в гольф:

  • Dim это дорого, поэтому чем меньше переменных я объявляю, тем лучше.
  • Я начинаю поиск с квадратного корня, но хочу посмотреть только на целые числа. Объявивs как цельный тип, он бросает мне слово.
  • VB использует в ^качестве экспоненты. Так что пока 100005 символов, 10^4есть только 4.
  • VB создает автоматическую переменную с тем же именем и типом, что и у определения функции (в моем случае A). В конце функции, если ее нет return, вместо нее будет возвращено значение переменной функции. Поэтому я сохраняю символы, не объявляя отдельную переменную и не используя оператор возврата.
  • ВБ очень снисходительно набирает текст / кастинг. iпредполагается, Integerпотому что я назначил целочисленный литерал. Aпредполагается, Objectно как только я добавляю целое число, оно ведет себя как Integer.
  • Вместо того, чтобы ifпроверять, является ли разница удовлетворительной, добавьте ее непосредственно к результату, приведя логическое значение к целому числу. Тем не менее, VB использует -1дляTrue , поэтому вычтите, чтобы получить правильный знак.
  • Технически мы не хотим Modбыть 0. Взятие модуля отрицательного числа в VB.NET даст отрицательный результат. Но все положительно, поэтому я могу сохранить байт, превратившись <>в >.
  • Самое большое число для проверки - 10000. Квадратный корень этого числа - 100. Поэтому мне нужно только Byteсохранить его, сохранив байты в объявлении, используя более короткий именованный тип.

Попробуйте онлайн!

Брайан Дж
источник