Визначте надмірність


21

В надлишку число є цілим числом п , який встановлює нову верхню межу для її співвідношення з функцією дільником суми а. Іншими словами, n є надлишковим тоді і лише тоді, коли для всіх натуральних чисел x , менших ніж n :

σ(n)n>σ(x)x

Для кількох значень:

n   σ(n)   σ(n)/n   superabundant
1   1      1.0000   yes
2   3      1.5000   yes
3   4      1.3333   no
4   7      1.7500   yes
5   6      1.2000   no
6   12     2.0000   yes
7   8      1.1429   no
8   15     1.8750   no
9   13     1.4444   no

Більш довгий перелік цих (для тестових випадків) можна знайти на OEIS A004394 .

Один настійно рекомендований негативний тестовий випадок (якщо ваш перекладач може впоратися) - це 360360, оскільки він пов'язаний з останнім додатковим номером.

Виклик

Ваша програма повинна приймати єдине додатне ціле число та виводити значення триті або фальси, що представляє, чи є це ціле число надмірним.

Оскільки це , виграє найкоротша відповідь у байтах.

Відповіді:


7

Желе , 7 байт

Æs÷$ÞṪ=

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

Желе , 8 байт

Æs÷$ÐṀ⁼W

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

Тестовий сюїт!

Пояснення

Fulls ÷ $ ÐṀ⁼W ~ Повна програма (монадійна).

    ÐṀ ~ Зберігайте елементи з максимальним значенням посилання (автоматичне ранжирування).
~s ~ Дільник сума.
  ÷ $ ~ Розділіть на поточний елемент.
      ⁼W ~ Перевірте рівність із входом, загорнутим у сингтон.
         ~ (для цілих чисел, таких як 360360)

Я думаю, ви можете зробити Æs÷$ÐṀ=за 7 байт. Я не усвідомлював ÐṀ, що розгалужується, що корисно знати.
dylnan

@dylnan Ні, я не можу. Хоча це неможливо перевірити в Інтернеті, це не вдається 360360. Насправді це була моя початкова версія
містер Xcoder

Чому б не вдалося 360360?
ділнан

@dylnan 360360- це перше число, яке воно не вдасться (я думаю), оскільки це перше число, яке пов'язало результат, який відбувся раніше. (і наш результат був би [0, 1])
Містер Xcoder

@ Mr.Xcoder Бачу, дякую
dylnan



4

Октава , 41 байт

@(n)([~,p]=max((x=1:n)*~mod(x,x')./x))==n

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

Пояснення

@(n)                                       % Define anonymous function of n
                x=1:n                      % Range from 1 to n. Call that x
                        mod(x,x')          % n×n matrix of all pair-wise moduli
                       ~                   % Logical negate. True means it's a divisor
               (     )*                    % Matrix-multiply x times the above matrix
                                           % (gives the dot product of vector x times
                                           % each column of the matrix)
                                 ./x       % Divide each column by each entry in x
     [~,p]=max(                     )      % Index of first occurrence of maximum
    (                                )==n  % Does it equal n?

3

J , 35 байт

Дякуємо Mr.Xcoder за те, що він знайшов проблему та вирішив її вирішити!

[:([:*/{:>}:)@(%~>:@#.~/.~&.q:)1+i.

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


1
Це не вдається 360360(див. Виклик для отримання більш детальної інформації. Один настійно рекомендований негативний тестовий випадок - 360360, оскільки він пов'язаний з останнім додатковим номером. ).
Містер Xcoder

1
Виправлено на +3 байти. Спробуйте в Інтернеті . Робота з гольфу. Мені подобається використання #.~багато (чесно кажучи, вся функція суми дільника дуже приємна). Що було не так, це те, що, хоча думка робити {:=>./розумну, вона не задовольняє "більшу" частину питання.
Коул

1
Ось що я придумав замінити функцію сигми, яка в тій же довжини в даний час: (1#.{:(]*0=|~)])\ . Щось із цим не в порядку, можливо, у вас є думки?
Коул

1
@cole Кредити на суму дільника функціонують у цьому рефераті Роджеру Хую . Я також почав писати ще одну функцію сигми, але зупинився, коли я досяг 9 байт і вирішив, що вона не буде коротшою, ніж функція з основним фактором. Дякуємо, що вирішили проблему!
Гален Іванов

@cole Найкоротший інший дієслово для суми дільників, який я придумав, це такий: (1#.]*0=|~)1+i.це гачок і не вміщується так легко, хоча :)
Гален Іванов,

3

Джулія 0,6 , 52 байти

n->indmax(sum(x for x=1:m if m%x<1)//m for m=1:n)==n

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

Це рішення використовує раціональні числа для забезпечення правильності у випадку рівності. (Тестування 360360 зайняло майже 10 хвилин.)

Використовуючи плаваючу крапку, 2 байти можна зберегти за допомогою лівого розділення:

n->indmax(m\sum(x for x=1:m if m%x<1)for m=1:n)==n

3

Піт , 14 байт

( FryAmTheEggman зберег 1 байт)

qh.Mcs*M{yPZZS

Спробуйте тут! або переглянути інші тестові випадки.

Просто моє обов'язкове подання Pyth, яке, швидше за все, є зграйним.

Як?

qh.Mcs * M {yPZZS ~ Повна програма. Q = вхід.

             S ~ Цілі числа в діапазоні [1, Q].
  .M ~ Отримати елементи з максимальним значенням функції.
    cs * M {yPZZ ~ Ключова функція: використовує змінну Z.
         yPZ ~ Набір потужності основних факторів Z.
        {~ Дублюється.
      * M ~ Продукт кожного.
     s ~ І підсумував.
    c Z ~ Ділиться на Z.
 h ~ Перший елемент.
q ~ Перевірте рівність із входом. Виводить істинні, або помилкові.

3

05AB1E , 10 байт

LÑOā/ZQ¨_P

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

L            # push range [1 ... input]
 Ñ           # divisors of each
  O          # sum of each
   ā/        # divide each by its 1-based index
     Z       # get max
      Q      # compare to each
       ¨     # remove the last element
        _    # logical negation
         P   # product

Я думаю (хоча я не впевнений) це не вдається 360360(див. Виклик для більш детальної інформації. Один настійно рекомендований негативний тестовий випадок - 360360, оскільки він пов'язаний з останнім додатковим номером. ).
Містер Xcoder

@ Mr.Xcoder: Правда. Виправлено це, але може бути кращий спосіб зробити це зараз.
Емінья



2

Математика, 53 50 байт

a=Tr@Divisors@#/#&;AllTrue[a@#-Array[a,#-1],#>0&]&

Чиста функція. Бере ціле число як вхід і повернення Trueабо Falseяк вихід.


Чи хотілося б щось, як Tr@Divisors@#твори?
користувач202729

1

Japt v2.0a0, 12 16 байт

Мозок, позбавлений сну, здається, не покращиться на цьому далі!

Повертається 1до трибути чи 0фальси.

Æâ x÷U >Xâ x÷XÃ×

Спробуй це

Пожертвував 4 байти для обробки 360360.


Пояснення

  • Неявне введення цілого числа U .
  • Æ Ãстворює масив цілих чисел від 0до U-1і проходить через кожен з наступної функції якX .
  • â отримує дільники U .
  • ÷U ділить кожну з них на U .
  • x підсумовує результати.
  • отримує дільники X .
  • ÷X ділить кожну з них на X .
  • x підсумовує результати.
  • > перевіряє, якщо перший результат більший за другий.
  • × зменшує отриманий масив булевих елементів шляхом мультиплікації.

1
Якщо ваш поточний підхід відповідає вашому поясненню, він не відповідає 360360чи іншим таким цілим числам. Один настійно рекомендований негативний тестовий випадок (якщо ваш перекладач може це впоратися) - 360360, оскільки він пов'язаний з останнім додатковим номером
містером Xcoder

@ Mr.XCoder: Горіхи, ти маєш рацію! Це, мабуть, коштуватиме мені декількох байт, коли я отримаю хвилину, щоб виправити це.
Кудлатий

@ Mr.Xcoder: Виправлено зараз, доведеться повернутися пізніше, щоб побачити, чи можу я вдосконалити його.
Кудлатий

0

APL + WIN, 37 байт

 ↑1=⍒⌽(+/¨((0=(⍳¨n)|¨n)×⍳¨n)~¨⊂0)÷n←⍳⎕

Підказки для введення екрана.


0

C (gcc), 99 байт

s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;n=k;}f(n,i,r){for(i=r=0;++i<n;)r=1.*s(n)/n<1.*s(i)/i?:r;r=!r;}

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

C, 108 байт

float s(n,j,k){for(j=k=0;j++<n;)k+=n%j?0:j;return k;}f(n,i,r){for(i=r=0;++i<n;)s(n)/n<s(i)/i&&++r;return!r;}

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


Отже, навіщо sпотрібно повертати поплавок?
Нісса

@StephenLeppik Використовувати поплавковий поділ замість цілого поділу при порівнянні s(n)/nз s(i)/i.
Steadybox



0

Фанки , 79 байт

d=n=>fors=i=0i<=n i++s+=i*!n%i
f=n=>{forc=1c<n c++if(d(n)/n)<=d(c)/c return0 1}

Пояснив

Спочатку визначається функція, dяка є σфункцією, і це версія для гольфу

function d(n){
    var s = 0;
    for(var i=0; i<n; i++){
        if(n%i == 0){
            s += i;
        }
    }
    return s;
}

Ми можемо встановити i на 0, тому що i*n%0завжди буде рівним0*... , таким чином ,0 .

Наступна половина цього визначає функцію f, яка є функцією Superabandunce, і це просто гольф-форма

function f(n){
    for(var c=1; c<n; c++){
        if( (d(n)/n) <= (d(c)/c) ){
            return 0;
        }
    }
    return 1;
}

І це просто перевіряє, як підказує специфікація виклику, що всі цілі числа від 1 до n-1 мають a d(n)/nменше, ніж вхідні дані.

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



0

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

εü<m§ṁ/Ḋṫ

Спробуйте в Інтернеті! Занадто повільно для тестового випадку 360360.

Пояснення

εü<m§ṁ/Ḋṫ  Implicit input, say n=6.
        ṫ  Decreasing range: [6,5,4,3,2,1]
   m       Map this function (example argument k=4):
       Ḋ    Divisors of k: [1,2,4]
    §ṁ      Map and sum
      /     division by k: 7/4
           Result: [2,6/5,7/4,4/3,3/2,1]
 ü         Remove duplicates by
  <        strict comparison. This greedily extracts a non-decreasing subsequence: [2]
ε          Is it a singleton list? Yes.

Я отримав £ü¤<§ṁ/ḊN. Створення всього списку додаткових номерів
H.PWiz

0

Perl 5, 84 байти

say!grep$a[-1]<=$a[$_],0..(@a=map{$i=$_;my$j;map{$i%$_ or$j+=$_/$i}1..$i;$j}1..<>)-2

вимагає -E (безкоштовно)

пряма реалізація специфікації, гольф


0

APL (NARS), 61 символів, 122 байти

r←f w;m;k
r←m←0
r+←1⋄k←r÷⍨11πr⋄→3×⍳r≥w⋄→2×⍳∼m<k⋄m←k⋄→2
r←k>m

11π - сума функцій факторів

  (⍳9),¨ f¨1..9
1 1  2 1  3 0  4 1  5 0  6 1  7 0  8 0  9 0 
  f 360360
0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.