Правильне розшарування дільника


20

Власний дільник є дільником з числа п , яке не є п сам по собі. Наприклад, належними дільниками на 12 є 1, 2, 3, 4 і 6.

Вам буде дано ціле число x , x ≥ 2, x ≤ 1000 . Ваше завдання - підсумовувати всі найвищі належні дільники цілих чисел від 2 до х (включно) (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

Правила



5
Якщо ви збираєтесь щось пісочниці, залиште її там більше двох годин.
Пітер Тейлор

@PeterTaylor Я пісочницю надсилав лише для отримання відгуків, тому що це дуже просте завдання, яке я зазвичай взагалі не публікую у пісочниці. До речі, дякую за редагування.
Містер Xcoder

Відповіді:



5

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

ṁȯΠtptḣ

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

Пояснення

У Husk немає вбудованого для обчислення дільників безпосередньо (поки що), тому я замість цього використовую основну факторизацію. Найбільший власний дільник числа - це добуток його простих факторів, крім найменшого. Я відображаю цю функцію у діапазоні від 2 до введення та підсумовую результати.

ṁȯΠtptḣ  Define a function:
      ḣ  Range from 1 to input.
     t   Remove the first element (range from 2).
ṁ        Map over the list and take sum:
 ȯ        The composition of
    p     prime factorization,
   t      tail (remove smallest prime) and
  Π       product.

5

Python 2 , 50 байт

f=lambda n,k=2:n/k and(f(n,k+1),n/k+f(n-1))[n%k<1]

Це повільно і навіть не справляється з введенням 15 на TIO.

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

Однак запам'ятовування ( спасибі @ musicman523 ) можна використовувати для перевірки всіх тестових випадків.

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

Альтернативна версія, 52 байти

Ціною в 2 байти ми можемо вибрати, чи потрібно обчислити, f(n,k+1)чи n/k+f(n-1).

f=lambda n,k=2:n>1and(n%k and f(n,k+1)or n/k+f(n-1))

З деякою хитрістю, це працює для всіх тестових випадків, навіть у TIO.

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


Оскільки fце чиста функція , ви можете запам’ятати її для запуску більших справ на TIO
musicman523,

Правильно, не маючи можливості використовувати декоратор, мене відкинуло. Спасибі!
Денніс



4

JavaScript (ES6), 40 байт

f=(n,i=2)=>n<2?0:n%i?f(n,i+1):n/i+f(n-1)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Число дорівнює добутку найвищого власного дільника та найменшого основного коефіцієнта.


переповнення стека для n>352(принаймні, у цьому фрагменті, не знайте, чи це моя залежність від браузера / машини), тоді як ви повинні підтримувати принаймні upto n=1000.
officialaimm

@officialaimm Це працює, n=1000якщо ви використовуєте напр node --stack_size=8000.
Ніл

4

05AB1E , 9 8 байт

-1 Байт завдяки головному трюку Лікі Нун у своїй відповіді Піта

L¦vyÒ¦PO

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

Пояснення

L¦vyÒ¦PO
L¦       # Range [2 .. input]
  vy     # For each...
    Ò¦    # All prime factors except the first one
      P   # Product
       O  # Sum with previous results
         # Implicit print

Альтернативне 8-байтне рішення (це не працює над TIO)

L¦vyѨθO    

і ofc альтернативного рішення 9 байт (що працює на TIO)

L¦vyѨ®èO    




4

Python 2 (PyPy) , 73 71 70 байт

n=input();r=[0]*n;d=1
while n:n-=1;r[d+d::d]=n/d*[d];d+=1
print sum(r)

Не найкоротша відповідь Python, але це просто вітер через тестові приклади. TIO обробляє вхід до 30 000 000, не порушуючи поту; мій настільний комп'ютер обробляє 300 000 000 за хвилину.

За ціною 2 байти , умова n>dможе бути використана для ~ 10% прискорення.

Дякуємо @xnor за r=[0]*nідею, яка зберегла 3 байти!

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


Смішно, я просто написав в основному той самий код .
xnor

l=[0]*nповинні дозволити вам позбутися -2. execніби вбиває швидкість, але навіть whileцикл був би коротшим, ніж мій підхід.
Денніс

Це здається незначно швидшим, ніж мій підхід. Майте на увазі, якщо я редагую це у своїй відповіді?
Денніс

Будь ласка, піди на це.
xnor

1
@ Mr.Xcoder Не в PyPy, але так, сита добре справляються з подібними проблемами.
Денніс

4

Haskell, 48 46 43 байт

f 2=1
f n=until((<1).mod n)pred(n-1)+f(n-1)

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

Редагувати: @rogaos зберегло два байти. Спасибі!

Редагувати II: ... і @xnor ще 3 байти.


-2 байти:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos: Дякую! Я сам спробував явну рекурсію, але не видалив її sum, тому подумав, що це не коротше.
німі

1
untilекономить ще:until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt , 8 + 2 = 10 8 6 байт

òâ1 xo

Перевірте це

  • 1 байт збережено завдяки ETHproductions.

Пояснення

    :Implicit input of integer U.
ò   :Generate an array of integers from 1 to U, inclusive
â   :Get the divisors of each number,
1   :  excluding itself.
x   :Sum the main array
o   :by popping the last element from each sub-array.
    :Implicit output of result

Зауважте, що -xвважається двома байтами відповідно до цієї публікації . Однак, я думаю, що ви можете зберегти байт за допомогою ò2_â1 o( âвиключає оригінальне число при аргументі)
ETHproductions

Спасибі, @ETHproductions; Я пропустив обидві речі. Цікаво, чи застосовується це заднім числом для всіх рішень, де ми рахували прапори як 1 байт? Я розробляв альтернативне рішення, яке так і не використовувало прапор; вказуючи, âщо аргумент отримав мені економію, яку я шукав.
Кудлатий

Я би припустив це, оскільки раніше насправді не дотримувались консенсусу. До речі, я грав з õ Åдо і знайшов пару 8- і 9-byters: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. І поєднуючи õі Åз вашим геніальним xoтрюком, я знайшов 7-
байтне

3

MATL, 12 байт

q:Q"@Z\l_)vs

Спробуйте в MATL Online

Пояснення

        % Implicitly grab input (N)
q       % Subtract one
:       % Create an array [1...(N-1)]
Q       % Add one to create [2...N]
"       % For each element
  @Z\   % Compute the divisors of this element (including itself)
  l_)   % Grab the next to last element (the largest that isn't itself)
  v     % Vertically concatenate the entire stack so far
  s     % Sum the result



3

Cubix , 27 39 байт

?%\(W!:.U0IU(;u;p+qu.@Op\;;

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

Кубіфікований

      ? % \
      ( W !
      : . U
0 I U ( ; u ; p + q u .
@ O p \ ; ; . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Дивись, як це працює

  • 0IUВстановіть стек за допомогою акумулятора та стартового цілого числа. Поверніть у зовнішню петлю
  • :(? дублювати поточну вершину стека, декремент та тест
  • \pO@ якщо нульовий цикл навколо куба на дзеркало, захопіть нижню частину стека, виведіть і зупиніть
  • %\! якщо позитивний, мод, відібрати та перевірити.
    • u;.W якщо truthy, u-turn, видаліть результат моди та перейдіть смугу назад у внутрішній цикл
    • U;p+qu;;\(якщо фальси, повороти, видалити результат моди, піднести акумулятор до вершини, додати поточний цілий (верхній) дільник, натиснути на нижній і перевернути. Очистіть стек, щоб було лише акумулятор і поточне ціле число, зменшити ціле число і знову ввести зовнішній цикл.

3

C # (.NET Core) , 74 72 байти

n=>{int r=0,j;for(;n>1;n--)for(j=n;--j>0;)if(n%j<1){r+=j;j=0;}return r;}

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

  • 2 байти поголилися завдяки Кевіну Крейсейну.

1
Я знаю, пройшло вже рік, але можна покататися breakна гольфі j=0.
Кевін Кройсейсен

@KevinCruijssen дуже простий, але ефективний трюк. Хороша ідея!
Чарлі


2

Пітон 3 , 78 75 73 71 байт

Навіть не підходить до відповіді пітонів Лікі монахині в підрахунку байтів.

f=lambda z:sum(max(i for i in range(1,y)if 1>y%i)for y in range(2,z+1))

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


1
Ви наближаєтесь до першого перегляду моєї відповіді ... ви можете перевірити мою історію редагування.
Leaky Nun

Ах, ха - ха ... Я клянусь , що я не крав його ... :)
officialaimm

2

Пітон 3 , 69 63 59 байт

4 байти завдяки Деннісу.

f=lambda n:n-1and max(j for j in range(1,n)if n%j<1)+f(n-1)

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

Я встановив обмеження рекурсії на 2000, щоб це працювало на 1000.


+1 У вас є мої точки огляду! Це рішення, про яке я говорив, коли говорив "менше 70 байт" ...
Містер Xcoder

Також це працює і в Python 2
Містер Xcoder

2

Вугілля деревне , 37 байт

A⁰βF…·²N«A⟦⟧δF⮌…¹ι«¿¬﹪ικ⊞δκ»A⁺β⌈δβ»Iβ

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

Посилання на багатослівну версію. Мені знадобилося майже цілий день, щоб зрозуміти, як я міг би вирішити питання, що не стосуються мистецтва ASCII, у "Вугільному вугіллі", але, нарешті, я це зрозумів і дуже пишаюся мною. :-D

Так, я впевнений, що це можна багато в гольф Я щойно переклав свою відповідь C #, і я впевнений, що у вугіллі все можна зробити інакше. Принаймні, це вирішує 1000справу за пару секунд ...



2

Python 2 (PyPy) , 145 байт

Оскільки перетворення змагань з кодового гольфу в змагання з найшвидшого коду - це цікаво, ось алгоритм O ( n ), який за TIO вирішує n = 5 000 000 000 за 30 секунд. ( Сито Денніса - O ( n log n ).)

import sympy
n=input()
def g(i,p,k,s):
 while p*max(p,k)<=n:l=k*p;i+=1;p=sympy.sieve[i];s-=g(i,p,l,n/l*(n/l*k+k-2)/2)
 return s
print~g(1,2,1,-n)

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

Як це працює

Підраховуємо розмір набору

S = {( a , b ) | 2 ≤ an , 2 ≤ b ≤ найбільший-власний дільник ( a )},

переписавши його як союз, над усіма праймерами p ≤ √n, of

S p = {( pd , b ) | 2 ≤ dn / p , 2 ≤ bd },

та використовуючи принцип включення – виключення :

| S | = ∑ (−1) m - 1 | S p 1 ∩ ⋯ ∩ S p m | над m ≥ 1 і простими рівнями p 1 <⋯ < p m ліній ≤ √n,

де

S p 1 ∩ ⋯ ∩ S p m = {( p 1p me , b ) | 1 ≤ en / ( p 1p m ), 2 ≤ bp 1p m - 1 e },
| S p 1 ∩ ⋯ ∩ S p m | = ⌊ n / ( p 1p m ) ⌋⋅ ( p 1 p m - 1 ⋅ (⌊н / ( р. 1с m ) ⌋ + 1) - 2) / 2.

Сума має Cn ненульових доданків, де C сходиться до деякої постійної, що, ймовірно, 6⋅ (1 - ln 2) / π 2 ≈ 0,186544. Кінцевим результатом є | S | + n - 1.


Ооо, це швидко ...
Містер Xcoder

2

NewStack , 5 байт

На щастя, насправді є вбудований.

Nᵢ;qΣ

Розбивка:

Nᵢ       Add the first (user's input) natural numbers to the stack.
  ;      Perform the highest factor operator on whole stack.
   q     Pop bottom of stack.
    Σ    Sum stack.

Фактично англійською мовою:

Запустимо приклад для введення 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.
Kevin Cruijssen

@KevinCruijssen Whoops, спасибі за те, що це зробив!
Гравітон

2

Java 8, 78 74 72 байти

n->{int r=0,j;for(;n>1;n--)for(j=n;j-->1;)if(n%j<1){r+=j;j=0;}return r;}

Порт відповіді CCloslosAlejo на C #.

Спробуйте тут.

Стара відповідь (78 байт):

n->{int r=0,i=1,j,k;for(;++i<=n;r+=k)for(j=1,k=1;++j<i;k=i%j<1?j:k);return r;}

Спробуйте тут.

Пояснення (старої відповіді):

n->{                    // Method with integer parameter and integer return-type
  int r=0,              //  Result-integers
      i=1,j,k;          //  Some temp integers
  for(;++i<=n;          //  Loop (1) from 2 to `n` (inclusive)
      r+=k)             //    And add `k` to the result after every iteration
    for(j=1,k=1;++j<i;  //   Inner loop (2) from `2` to `i` (exclusive)
      k=i%j<1?j:k       //    If `i` is dividable by `j`, replace `k` with `j`
    );                  //   End of inner loop (2)
                        //  End of loop (2) (implicit / single-line body)
  return r;             //  Return result-integer
}                       // End of method



1

Складено , 31 байт

[2\|>[divisors:pop\MAX]map sum]

Спробуйте в Інтернеті! (Усі тестові шкали, за винятком 1000, що перевищує 60 секундний онлайн-обмеження.)

Пояснення

[2\|>[divisors:pop\MAX]map sum]
 2\|>                               range from 2 to the input inclusive
     [                ]map          map this function over the range
      divisors                      get the divisors of the number (including the number)
              :pop\                 pop a number off the array and swap it with the array
                   MAX              gets the maximum value from the array
                           sum      sum's all the max's

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