Określ nadwyżkę


21

Liczba nieskończonych oznacza liczbę n , który wyznacza nową górną granicę jego stosunek z sumy dzielnik funkcji Ď. Innymi słowy, n jest nadmiarowy wtedy i tylko wtedy, gdy dla wszystkich liczb całkowitych dodatnich x, które są mniejsze niż n :

σ(n)n>σ(x)x

Dla kilku wartości:

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

Dłuższą listę (dla przypadków testowych) można znaleźć na stronie OEIS A004394 .

Jednym wysoce zalecanym negatywnym przypadkiem testowym (jeśli twój tłumacz może to obsłużyć) jest 360360, ponieważ wiąże się on z ostatnią nadliczbową liczbą.

Wyzwanie

Twój program powinien przyjąć jedną dodatnią liczbę całkowitą i wyprowadzić prawdziwą lub falsey wartość wskazującą, czy ta liczba całkowita jest nadwyżka.

Ponieważ jest to , wygrywa najkrótsza odpowiedź w bajtach.

Odpowiedzi:


7

Galaretka , 7 bajtów

Æs÷$ÞṪ=

Wypróbuj online!

Galaretka , 8 bajtów

Æs÷$ÐṀ⁼W

Wypróbuj online!

Pakiet testowy!

Wyjaśnienie

÷s ÷ $ ÐṀ⁼W ~ Pełny program (monadyczny).

    Keep ~ Zachowaj elementy o maksymalnej wartości linku (auto-rangify).
Sums ~ Suma dzielników.
  ÷ $ ~ Podziel przez bieżący element.
      ⁼W ~ Sprawdź równość z wejściem zapakowanym w singleton.
         ~ (dla liczb całkowitych takich jak 360360)

Myślę, że możesz zrobić Æs÷$ÐṀ=na 7 bajtów. Nie zdawałem sobie sprawy z ÐṀtego, że to rangowane, warto wiedzieć.
dylnan

@dylnan Nie, nie mogę. Chociaż nie można go przetestować online, nie działa 360360. W rzeczywistości była to moja początkowa wersja
Mr. Xcoder,

Dlaczego miałby zawieść 360360?
dylnan,

@dylnan 360360to pierwsza liczba, dla której by się nie powiodła (tak sądzę), ponieważ jest to pierwsza liczba wiążąca wynik, który wystąpił wcześniej. (a naszym wynikiem byłoby [0, 1])
Pan Xcoder,

@ Mr.Xcoder Rozumiem, dziękuję
dylnan



4

Oktawa , 41 bajtów

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

Wypróbuj online!

Wyjaśnienie

@(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

jot , 35 bajtów

Dzięki Mr.Xcoder za znalezienie problemu i cole za jego naprawienie!

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

Wypróbuj online!


1
Nie udaje się to 360360(więcej szczegółów można znaleźć w wyzwaniu: Jednym wysoce zalecanym negatywnym przypadkiem testowym jest 360360, ponieważ wiąże się on z ostatnią nadliczbową liczbą ).
Pan Xcoder,

1
Naprawiono dla +3 bajtów. Wypróbuj online . Praca nad golfem. Bardzo podoba mi się użycie #.~(szczerze mówiąc, cała funkcja sumy dzielników jest naprawdę fajna). Tym, co było złe, jest to, że choć myśl o zrobieniu {:=>./jest sprytna, nie zaspokaja „większej niż” części pytania.
cole

1
Oto co wymyśliłem zastąpić funkcję Sigma, który jest w tej samej długości obecnie: (1#.{:(]*0=|~)])\ . Coś jest jednak nie tak, może masz jakieś przemyślenia?
cole,

1
@cole Kredyty na sumę funkcji dzielników trafiają do Rogera Hui w tym eseju . Zacząłem też pisać kolejną funkcję sigma, ale przestałem po osiągnięciu 9 bajtów i zdecydowałem, że nie będzie ona krótsza niż ta z pierwszą faktoryzacją. Dziękujemy za naprawienie problemu!
Galen Iwanow,

@cole Najkrótszy inny czasownik na sumę dzielników, który wymyśliłem, to: (1#.]*0=|~)1+i.haczyk i nie pasują tak łatwo na miejscu :)
Galen Iwanow

3

Julia 0.6 , 52 bajty

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

Wypróbuj online!

To rozwiązanie używa liczb wymiernych w celu zapewnienia poprawności w przypadku równości. (Testowanie 360360 zajęło prawie 10 minut.)

Używając liczb zmiennoprzecinkowych, można zapisać 2 bajty z lewą podziałką:

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

3

Pyth , 14 bajtów

( FryAmTheEggman zapisał 1 bajt)

qh.Mcs*M{yPZZS

Wypróbuj tutaj!lub zobacz więcej przypadków testowych.

Tylko moje obowiązkowe zgłoszenie w języku Pyth, które najprawdopodobniej jest możliwe do gry w golfa.

W jaki sposób?

qh.Mcs * M {yPZZS ~ Pełny program. Q = dane wejściowe.

             S ~ Liczby całkowite z zakresu [1, Q].
  .M ~ Uzyskaj elementy o maksymalnej wartości funkcji.
    cs * M {yPZZ ~ Funkcja klucza: używa zmiennej Z.
         yPZ ~ Zbiór czynników pierwszych Z.
        {~ Deduplikowane.
      * M ~ Produkt każdego.
     s ~ I podsumowane.
    c Z ~ Dzielony przez Z.
 h ~ Pierwszy element.
q ~ Sprawdź równość z wejściem. Zwraca wartość Prawda lub Fałsz.

3

05AB1E , 10 bajtów

LÑOā/ZQ¨_P

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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

Myślę, że (choć nie jestem pewien) to się nie udaje 360360(zobacz wyzwanie, aby uzyskać więcej informacji: jeden wysoce zalecany negatywny przypadek testowy to 360360, ponieważ wiąże się on z ostatnią superobfitą liczbą ).
Pan Xcoder,

@ Mr.Xcoder: True. Naprawiono to, ale może być teraz lepszy sposób na zrobienie tego.
Emigna,


2

R z wykorzystaniem numbers59 bajtów

f=function(n)which.max(sapply(1:n,numbers::Sigma)/(1:n))==n

2

Mathematica, 53 50 bajtów

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

Czysta funkcja. Pobiera liczbę całkowitą jako dane wejściowe i zwraca Truelub Falsedane wyjściowe.


Czy coś jak Tr@Divisors@#działa?
user202729,

1

Japt v2.0a0, 12 16 bajtów

Mózg pozbawiony snu nie wydaje się poprawiać tego dalej!

Zwraca 1za prawdę lub 0falsey.

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

Spróbuj

Poświęcono 4 bajty do obsługi 360360.


Wyjaśnienie

  • Domniemane wprowadzenie liczby całkowitej U.
  • Æ Ãtworzy tablicę liczb całkowitych od 0do U-1i przechodzi przez następującą funkcję jako X.
  • âdostaje dzielniki U.
  • ÷Udzieli każdy z nich przez U.
  • x sumuje wyniki.
  • dostaje dzielniki X.
  • ÷Xdzieli każdy z nich przez X.
  • x sumuje wyniki.
  • > sprawdza, czy pierwszy wynik jest większy niż drugi.
  • × zmniejsza wynikową liczbę boolanów przez pomnożenie.

1
Jeśli twoje obecne podejście pasuje do twojego wyjaśnienia, nie powiedzie się 360360lub dla innych takich liczb całkowitych: Jeden wysoce zalecany negatywny przypadek testowy (jeśli twój tłumacz może to obsłużyć) to 360360, ponieważ wiąże się z ostatnią
superobliczną

@ Mr.XCoder: Orzechy, masz rację! To prawdopodobnie będzie mnie kosztowało trochę bajtów, kiedy będę miał chwilę, aby to naprawić.
Shaggy,

@ Mr.Xcoder: Naprawiono na razie, będę musiał wrócić później, aby sprawdzić, czy mogę to poprawić.
Shaggy,

0

APL + WIN, 37 bajtów

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

Monity o wprowadzenie ekranu.


0

C (gcc), 99 bajtów

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

Wypróbuj online!

C, 108 bajtów

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

Wypróbuj online!


Dlaczego więc strzeba zwrócić liczbę zmiennoprzecinkową?
Nissa,

@StephenLeppik podziałowi zastosowanie float o całkowitą podziału porównując s(n)/ndo s(i)/i.
Steadybox,

0

Szybki , 120 118 bajtów

let s={n in Float((1...n).reduce(0){n%$1>0 ?$0:$0+$1})}
{n in(1..<n).reduce(0){max($0,s($1)/Float($1))}<s(n)/Float(n)}

Kompilacja zajmuje trochę czasu (około 6 sekund na TIO) z powodu niejawnych deklaracji typu w Swift.

Wypróbuj online!



0

Funky , 79 bajtów

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}

Wyjaśnił

To pierwsze określa funkcję, dktóra jest σfunkcją, a jest to wersja gry w golfa

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

Możemy ustawić i na 0, ponieważ i*n%0 zawsze będzie 0*...więc równe 0.

Kolejna połowa tego definiuje funkcję f , która jest funkcją Superabandunce, i jest to po prostu gra w golfa

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

A to tylko sprawdza, jak sugeruje specyfikacja wyzwania, że ​​wszystkie liczby całkowite od 1 do n-1 mają wartość d(n)/n mniejszą niż wartość wejściowa.

Wypróbuj online!



0

Łuska , 9 bajtów

εü<m§ṁ/Ḋṫ

Wypróbuj online! Zbyt wolno dla przypadku testowego 360360.

Wyjaśnienie

εü<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.

Mam £ü¤<§ṁ/ḊN. Tworzenie całej listy liczb
nadpobudliwych

0

Perl 5, 84 bajtów

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

wymaga -E (za darmo)

prosta implementacja specyfikacji, golfa


0

APL (NARS), 61 znaków, 122 bajty

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π jest sumą funkcji czynników

  (⍳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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.