Відмінності пар роздільників MaxMin (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
Так, я думав про це, але це не додасть нічого виклику. Таким чином, я думаю, що кожному легше зрозуміти виклик.

Відповіді:


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 - теж схоже - EDIT: хм, чи це не було, не :стосується ... що ви думаєте?)
Джонатан Аллан

@JonathanAllan Я думаю, ви повинні опублікувати цей 13-байт
Leaky Nun

Ух ти. Ну ти підеш на це, я врятував тобі один байт, який зберігає ще 2!
Джонатан Аллан

Чи можете ви додати пояснення?
Kevin Cruijssen

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, оскільки це вже другий раз, коли ви переграли це у своєму коді.
Kevin Cruijssen

2

R , 73 77 байт

Завдяки @Guiseppe за 4 байти

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

Спробуйте в Інтернеті!

Втратили функцію векторизації для обчислення DMDP і тепер використовують функцію sapply над функцією. Рахунки для предметів, менших за вхідні, підсумовуються за результат.


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

2

Математика, 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)) Якщо є лише один середній елемент, лівий = правий.



1

MATL , 20 байт

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

Код вичерпується в TIO. Ось приклад запуску з офлайн-компілятором:

>> matl 1e4:"@Z\2Y"dJ2/)G<vs
> 13
1201


1

Математика, 119 115 байт

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

Нарешті я цю справу працював, і я намагався останні півгодини. ._.

Приклад виконання

no description for you!


Casesє 4байт коротше: Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. Дивіться цю пораду .
ngenisis

1
@ngenisis насправді Countнавіть коротший, ніж Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

Крім того, 10^4або 1*^4коротше 10000, і /@Range@еквівалентно ~Array~.
JungHwan Min

1

Математика, 78 байт

(s=#;Tr[1^Select[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],#<s&]])&

Casesє 4байт коротше: Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. Дивіться цю пораду .
ngenisis

1
@ngenisis Countще коротше:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min

1

Лушпиння , 19 байт

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

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

Пояснення

У лушпиння ще немає вбудованих дільників і не підтримує наукові позначення.

#ȯ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?

1

Japt , 25 19 17 байт

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

Перевірте це


Пояснення

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

L²õ

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

Èâ          Ã

Проведіть кожен через функцію (де Xє поточний елемент), яка генерує масив дільників ( â) 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

Пітон 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)]))

Спробуйте в Інтернеті!

Еге ... треба зробити набагато краще.


125 байт (-9 байт) , використовуючи поточний підхід, але замість len(filter(lambda n:n<i,...))зsum(n<i for n in ....)
г Xcoder

114 байт на основі коментаря Mr.Xcoder''s.
ов

113 байт на основі коментаря ovs.
Містер Xcoder



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, замість неї повернеться значення змінної функції. Тому я зберігаю символи, не оголошуючи окрему змінну і не використовуючи оператор return.
  • VB дуже прощає вводити / кастинг. iпередбачається, Integerтому що я призначив ціле число буквалом. Aпередбачається, Objectале як тільки я додаю ціле число, воно поводиться як Integer.
  • Замість того, щоб ifперевіряти, чи є різниця задовільною, додайте її безпосередньо до результату, віддавши булеве значення в ціле число. Однак VB використовує -1дляTrue , тому відніміть, щоб отримати правильний знак.
  • Технічно ми хочемо, Modщоб цього не було 0. Прийняття модуля від’ємного числа у VB.NET дасть негативний результат. Але все є позитивним, тому я можу зберегти байт, перетворившись <>на >.
  • Найбільша кількість для перевірки - 10000. Квадратний корінь, що становить 100. Тож мені потрібно лише Byteзберігати це, зберігаючи байти в декларації, використовуючи коротший названий тип.

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.