Bestimmen Sie die Überfülle

21

Eine übergroße Zahl ist eine ganze Zahl n , die eine neue Obergrenze für ihr Verhältnis mit der Divisorsummenfunktion σ festlegt . Mit anderen Worten, n ist genau dann überreichlich, wenn für alle positiven ganzen Zahlen x , die kleiner als n sind :

σ(n)n>σ(x)x

Für einige der Werte:

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

Eine längere Liste (für Testfälle) finden Sie unter OEIS A004394 .

Ein dringend empfohlener negativer Testfall (wenn Ihr Dolmetscher damit umgehen kann) ist 360360, da er mit der letzten übergroßen Zahl verknüpft ist.

Herausforderung

Ihr Programm sollte eine einzelne positive Ganzzahl aufnehmen und einen Wahrheits- oder Falschwert ausgeben, der angibt, ob diese Ganzzahl überreichlich ist.

Da es sich um , die kürzeste Antwort in Bytes gewinnt.

Nissa
quelle

Antworten:

7

Gelee , 7 Bytes

Æs÷$ÞṪ=

Probieren Sie es online!

Gelee , 8 Bytes

Æs÷$ÐṀ⁼W

Probieren Sie es online!

Test Suite!

Erläuterung

Æs ÷ $ ÐṀ⁼W ~ Volles Programm (monadisch).

    ÐṀ ~ Behalte die Elemente mit maximalem Verknüpfungswert (automatisch sortiert).
Sums ~ Divisorsumme.
  ÷ $ ~ Dividiere durch das aktuelle Element.
      ⁼W ~ Überprüfen Sie die Gleichheit mit der Eingabe in einem Singleton.
         ~ (für ganze Zahlen wie 360360)
Mr. Xcoder
quelle
Ich denke, Sie können Æs÷$ÐṀ=für 7 Bytes tun . Mir ist nicht klar ÐṀgeworden, dass das nützlich ist zu wissen.
Dylnan
@ Dylnan Nein, ich kann nicht. Obwohl es nicht online getestet werden kann, schlägt es für fehl 360360. In der Tat war dies meine erste Version
Mr. Xcoder
Warum sollte es scheitern 360360?
Dylnan
@dylnan 360360ist die erste Zahl, für die es fehlschlagen würde (glaube ich), weil es die erste Zahl ist, die ein zuvor aufgetretenes Ergebnis ermittelt. (und unser Ergebnis wäre [0, 1])
Mr. Xcoder
@ Mr.Xcoder Ich verstehe, danke
dylnan
5

Haskell , 73 Bytes

-1 Byte danke an Herrn Xcoder. -7 Bytes dank Laikoni.

r=read.show
s n=sum[r i|i<-[1..n],n`mod`i<1]/r n
f n=all((s n>=).s)[1..n]

Probieren Sie es online!

Haskells Typensystem ist nicht sehr golfen ...

total menschlich
quelle
4

Oktave , 41 Bytes

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

Probieren Sie es online!

Erläuterung

@(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?
Luis Mendo
quelle
3

J , 35 Bytes

Vielen Dank an Mr.Xcoder für das Auffinden des Problems und an cole für das Beheben des Problems!

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

Probieren Sie es online!

Galen Ivanov
quelle
1
Dies schlägt fehl 360360(siehe Herausforderung für weitere Details: Ein sehr empfohlener negativer Testfall ist 360360, da er mit der letzten übergroßen Zahl verknüpft ist. ).
Mr. Xcoder
1
Behoben für +3 Bytes. Probieren Sie es online aus . Golf spielen. Ich mag die Verwendung von #.~viel (ehrlich gesagt ist die ganze Divisorsummenfunktion wirklich nett). Was übrigens falsch war, ist, dass der Gedanke, etwas zu tun, {:=>./zwar klug ist, aber den "Größer als" -Teil der Frage nicht erfüllt.
Cole
1
Hier ist , was ich kam mit der Sigma - Funktion zu ersetzen, die auf der gleichen Länge ist zur Zeit: (1#.{:(]*0=|~)])\ . Irgendwas stimmt nicht, vielleicht hast du ein paar Gedanken?
Cole
1
@cole Die Credits für die Summe der Divisoren gehen in diesem Aufsatz an Roger Hui . Ich fing auch an, eine andere Sigma-Funktion zu schreiben, hörte aber auf, nachdem ich 9 Bytes erreicht hatte, und entschied, dass sie nicht kürzer als die mit der Primfaktorisierung sein wird. Vielen Dank für die Behebung des Problems!
Galen Ivanov
@cole Das kürzeste andere Verb für die Summe der Teiler, die ich mir ausgedacht habe, ist das: (1#.]*0=|~)1+i.Es ist ein Haken und passt nicht so leicht an seinen Platz :)
Galen Ivanov
3

Julia 0,6 , 52 Bytes

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

Probieren Sie es online!

Diese Lösung verwendet rationale Zahlen, um bei Gleichheit die Richtigkeit zu gewährleisten. (Das Testen von 360360 dauerte fast 10 Minuten.)

Mit Gleitkomma können 2 Bytes mit der linken Teilung gespeichert werden:

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

Pyth , 14 Bytes

( FryAmTheEggman hat 1 Byte gespeichert)

qh.Mcs*M{yPZZS

Probieren Sie es hier aus! oder sehen Sie mehr Testfälle.

Nur meine obligatorische Pyth-Vorlage, die höchstwahrscheinlich golfen kann.

Wie?

qh.Mcs * M {yPZZS ~ Volles Programm. Q = Eingabe.

             S ~ Die ganzen Zahlen im Bereich [1, Q].
  .M ~ Hole die Elemente mit maximalem Funktionswert.
    cs * M {yPZZ ~ Tastenfunktion: Verwendet eine Variable Z.
         yPZ ~ Die Potenz der Primfaktoren von Z.
        {~ Dedupliziert.
      * M ~ Produkt von jedem.
     s ~ Und summiert.
    c Z ~ geteilt durch Z.
 h ~ Erstes Element.
q ~ Gleichheit mit dem Eingang prüfen. Gibt entweder True oder False aus.
Mr. Xcoder
quelle
3

05AB1E , 10 Bytes

LÑOā/ZQ¨_P

Probieren Sie es online! oder als Testsuite

Erläuterung

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
Emigna
quelle
Ich denke (obwohl ich nicht sicher bin), dass dies fehlschlägt 360360(siehe Herausforderung für weitere Details: Ein sehr empfohlener negativer Testfall ist 360360, da er mit der letzten überfüllten Zahl zusammenhängt. ).
Mr. Xcoder
@ Mr.Xcoder: Stimmt. Es wurde ein Fehler behoben, aber es gibt möglicherweise eine bessere Möglichkeit, dies jetzt zu tun.
Emigna
3

Python 3 , 77 Bytes

-1 Byte dank Rod. -3 Bytes dank Dennis.

lambda n:max(range(1,n+1),key=lambda k:sum((k%i<1)/i for i in range(1,k)))==n

Probieren Sie es online!

total menschlich
quelle
2

R mit numbers 59 Bytes

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

Mathematica, 53 50 Bytes

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

Funktion pur. Nimmt eine Ganzzahl als Eingabe und gibt Trueoder Falseals Ausgabe zurück.

LegionMammal978
quelle
Möchte sowas Tr@Divisors@#funktionieren?
user202729
1

Japt v2.0a0, 12 16 Bytes

Schlafentzug im Gehirn scheint sich nicht weiter zu verbessern!

Returns 1für truthy oder 0für Falsey.

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

Versuch es

4 Bytes geopfert, um zu behandeln 360360.


Erläuterung

  • Implizite Eingabe einer Ganzzahl U.
  • Æ ÃErstellt ein Array von Ganzzahlen von 0bis U-1und durchläuft jeweils die folgende Funktion als X.
  • âbekommt die Teiler von U.
  • ÷Udividiert jeden von denen durch U.
  • x summiert die Ergebnisse.
  • bekommt die Teiler von X.
  • ÷X dividiert jeden von denen durch X.
  • x summiert die Ergebnisse.
  • > prüft, ob das erste Ergebnis größer als das zweite ist.
  • × reduziert das resultierende Array von Booleschen Werten durch Multiplikation.
Zottelig
quelle
1
Wenn Ihr aktueller Ansatz mit Ihrer Erklärung übereinstimmt, schlägt er für 360360oder andere solche Ganzzahlen fehl : Ein sehr empfehlenswerter negativer Testfall (wenn Ihr Interpreter damit umgehen kann) ist 360360, da er mit der letzten überreichlichen Zahl
verknüpft ist
@ Mr.XCoder: Nuts, du hast recht! Das wird mich wahrscheinlich ein paar Bytes kosten, wenn ich einen Moment Zeit habe, das Problem zu beheben.
Shaggy
@ Mr.Xcoder: Vorerst behoben, muss später nochmal schauen, ob ich mich verbessern kann.
Shaggy
0

APL + WIN, 37 Bytes

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

Fordert zur Eingabe des Bildschirms auf.

Graham
quelle
0

C (gcc), 99 Bytes

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

Probieren Sie es online!

C 108 Bytes

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

Probieren Sie es online!

Steadybox
quelle
Warum muss also sein Float zurückgegeben werden?
Nissa
@StephenLeppik Verwenden der Gleitkommadivision anstelle der Ganzzahldivision beim Vergleich s(n)/nmit s(i)/i.
Steadybox
0

Schnell , 120 118 Bytes

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

Aufgrund der impliziten Typdeklarationen in Swift dauert das Kompilieren einige Zeit (ungefähr 6 Sekunden bei TIO).

Probieren Sie es online!

Herman L
quelle
0

Funky , 79 Bytes

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}

Erklärt

Dies definiert zuerst die Funktion, ddie die σFunktion ist, und dies ist die Golfversion von

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

Wir können i auf 0 setzen, weil i*n%0es immer gleich 0*...ist0 .

Die nächste Hälfte davon definiert die Funktion f, die Superabandunce-Funktion, und ist nur die Golfform von

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

Und dies prüft nur, wie die Herausforderungsspezifikation nahelegt, dass alle Ganzzahlen von 1 bis n-1 einen d(n)/nWert kleiner als die Eingabe haben.

Probieren Sie es online!

Ein Taco
quelle
0

Schale , 9 Bytes

εü<m§ṁ/Ḋṫ

Probieren Sie es online! Zu langsam für den 360360-Testfall.

Erläuterung

εü<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.
Zgarb
quelle
Ich habe bekommen £ü¤<§ṁ/ḊN. Erstellen der gesamten Liste mit übergroßen Zahlen
H.PWiz
0

Perl 5, 84 Bytes

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

benötigt -E(kostenlos)

eine unkomplizierte umsetzung der spezifikation, golfed

msh210
quelle
0

APL (NARS), 61 Zeichen, 122 Byte

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π ist die Funktionssumme der Faktoren

  (⍳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
RosLuP
quelle