Richtiges Divisor-Mash-up


20

Ein richtiger Teiler ist ein Teiler einer Zahl n , die nicht n selbst ist. Die richtigen Teiler von 12 sind beispielsweise 1, 2, 3, 4 und 6.

Sie erhalten eine ganze Zahl x , x ≥ 2, x ≤ 1000 . Ihre Aufgabe ist es, alle höchsten richtigen Teiler der ganzen Zahlen von 2 bis x (einschließlich) zu summieren (OEIS A280050 ).

Beispiel (mit x = 6):

  • Finden Sie alle ganzen Zahlen zwischen 2 und 6 (einschließlich): 2,3,4,5,6.

  • Holen Sie sich die richtigen Teiler von allen und wählen Sie aus jeder Zahl die höchsten aus:

    • 2 -> 1
    • 3 -> 1
    • 4 -> 1, 2
    • 5 -> 1
    • 6 -> 1, 2, 3 .
  • Addieren Sie die höchsten richtigen Divisoren: 1 + 1 + 2 + 1 + 3 = 8.

  • Das Endergebnis ist 8.

Testfälle

Eingabe | Ausgabe
------- + ---------
       |
 2 | 1
 4 | 4
 6 | 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1000 | 165279

Regeln



5
Wenn Sie etwas sandboxen möchten, lassen Sie es länger als zwei Stunden dort.
Peter Taylor

@PeterTaylor Ich habe den Post nur sandboxed, um Feedback zu erhalten, da dies eine sehr einfache Herausforderung ist, die ich normalerweise überhaupt nicht in der Sandbox posten würde. BTW danke für die Bearbeitung.
Mr. Xcoder

Antworten:



5

Schale , 7 Bytes

ṁȯΠtptḣ

Probieren Sie es online!

Erläuterung

Husk verfügt (noch) nicht über eine integrierte Funktion zur direkten Berechnung der Divisoren, daher verwende ich stattdessen die Primfaktor-Faktorisierung. Der größte richtige Teiler einer Zahl ist das Produkt seiner Primfaktoren mit Ausnahme des kleinsten. Ich ordne diese Funktion über den Bereich von 2 bis zur Eingabe zu und summiere die Ergebnisse.

ṁȯΠ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 Bytes

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

Dies ist langsam und kann nicht einmal Eingang 15 von TIO bewältigen .

Probieren Sie es online!

Mit Memoization ( danke @ musicman523 ) können jedoch alle Testfälle überprüft werden.

Probieren Sie es online!

Alternative Version, 52 Byte

Auf Kosten von 2 Bytes können wir wählen, ob wir berechnen f(n,k+1)oder 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))

Mit einigem Aufwand funktioniert dies für alle Testfälle, sogar für TIO.

Probieren Sie es online!


Da fes sich um eine reine Funktion handelt , können Sie sich diese merken, um die größeren Fälle auf TIO
musicman523 am

Richtig, nicht in der Lage zu sein, einen Dekorateur zu benutzen, warf mich ab. Vielen Dank!
Dennis

4

Gelee , 6 Bytes

ÆḌ€Ṫ€S

Probieren Sie es online!

Wie es funktioniert

ÆḌ€Ṫ€S
ÆḌ€    map proper divisor (1 would become empty array)
           implicitly turns argument into 1-indexed range
   Ṫ€  map last element
     S sum


4

JavaScript (ES6), 40 Byte

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>

Eine Zahl entspricht dem Produkt seines höchsten richtigen Divisors und seines kleinsten Primfaktors.


Stapelüberläufe für n>352(zumindest in diesem Snippet, weiß nicht, ob es meine Browser- / Maschinenabhängigkeit ist), während Sie mindestens upto unterstützen sollen n=1000.
Amtszeit

@officialaimm Es funktioniert, n=1000wenn Sie zB verwenden node --stack_size=8000.
Neil

4

05AB1E , 9 8 Bytes

-1 Byte dank Leaky Nuns Primfaktor-Trick in seiner Pyth-Antwort

L¦vyÒ¦PO

Probieren Sie es online!

Erläuterung

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

Alternative 8-Byte-Lösung (Funktioniert bei TIO nicht)

L¦vyѨθO    

und einer alternativen 9-Byte-Lösung (das funktioniert mit TIO)

L¦vyѨ®èO    

4

Retina , 31 24 Bytes

7 Bytes dank Martin Ender.

.+
$*
M!&`(1+)(?=\1+$)
1

Probieren Sie es online!

Wie es funktioniert

Der reguläre Ausdruck /^(1+)\1+$/erfasst den größten richtigen Teiler einer bestimmten Anzahl, die in unary dargestellt ist. Im Code wird die \1+Lookahead-Syntax verwendet.




4

Python 2 (PyPy) , 73 71 70 Bytes

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

Nicht die kürzeste Antwort von Python, aber dies ist ein Kinderspiel in den Testfällen. TIO verarbeitet Eingaben bis zu 30.000.000, ohne ins Schwitzen zu geraten . Mein Desktop-Computer verarbeitet 300.000.000 in einer Minute.

Auf Kosten von 2 Bytesn>d könnte die Bedingung für eine Beschleunigung von ~ 10% verwendet werden.

Danke an @xnor für die r=[0]*nIdee, die 3 Bytes gespart hat!

Probieren Sie es online!


Komisch, ich habe nur im Grunde den gleichen Code geschrieben .
Xnor

l=[0]*nsollte Ihnen erlauben, loszuwerden -2. execirgendwie tötet die Geschwindigkeit, aber auch eine whileSchleife wäre kürzer als mein Ansatz.
Dennis

Dies scheint geringfügig schneller zu sein als mein Ansatz. Stört es mich, wenn ich das in meine Antwort bearbeite?
Dennis

Bitte machen Sie es.
Xnor

1
@ Mr.Xcoder Nicht in PyPy, aber ja, Siebe eignen sich gut für diese Art von Problem.
Dennis

4

Haskell, 48 46 43 Bytes

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

Probieren Sie es online!

Edit: @rogaos sparte zwei Bytes. Vielen Dank!

Edit II: ... und @nicht weitere 3 Bytes.


-2 Bytes:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos: Danke! Ich habe die explizite Rekursion selbst ausprobiert, sie aber nicht entfernt sum, weshalb ich dachte, dass sie nicht kürzer ist.
Nimi

1
untilspart etwas mehr:until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt , 8 + 2 = 10 8 6 Bytes

òâ1 xo

Probier es aus

  • Dank ETHproductions 1 Byte gespart.

Erläuterung

    :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

Beachten Sie, dass -xlaut diesem Beitrag zwei Bytes zählen . Ich denke jedoch, Sie können ein Byte mit speichern ò2_â1 o( âschließt die ursprüngliche Nummer aus, wenn ein Argument angegeben wird)
ETHproductions

Danke, @ETHproductions; Ich hatte beide Dinge verpasst. Ich frage mich, ob dies rückwirkend auf alle Lösungen zutrifft, bei denen wir Flags als 1 Byte gezählt haben. Ich arbeitete an einer alternativen Lösung, bei der sowieso keine Flagge verwendet wurde. Indem ich auf dieses âArgument hinwies, bekam ich die Rettung, nach der ich gesucht hatte.
Shaggy

Ich würde das annehmen, da wir vorher nicht wirklich einem Konsens gefolgt sind. Übrigens, ich hatte Spiel gewesen mit õ Åvor und fand ein paar 8- und 9-byters: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. Und durch Kombinieren õund Åmit Ihrem genialen xoTrick habe ich eine 7-Byte-Lösung gefunden :-)
ETHproductions

3

MATL, 12 Bytes

q:Q"@Z\l_)vs

Probieren Sie es bei MATL Online aus

Erläuterung

        % 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 Bytes

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

Probieren Sie es online!

Cubified

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

Beobachten Sie es laufen

  • 0IURichten Sie den Stapel mit einem Akkumulator und der Start-Ganzzahl ein. Wende dich in die äußere Schleife
  • :(? Dupliziere die aktuelle Spitze des Stapels, dekrementiere und teste
  • \pO@ Wenn der Würfel durch eine Nullschleife zu einem Spiegel geführt wird, greifen Sie nach dem Boden des Stapels, geben Sie ihn aus und halten Sie ihn an
  • %\! wenn positiv, mod, relect und test.
    • u;.W wenn es wahr ist, wende dich, entferne das Mod-Ergebnis und wechsle zurück in die innere Schleife
    • U;p+qu;;\(Wenn Sie falsch liegen, wenden Sie, entfernen Sie das Mod-Ergebnis, bringen Sie den Akku nach oben, fügen Sie den aktuellen ganzzahligen (oberen) Divisor hinzu, und drehen Sie. Räumen Sie den Stapel auf, um nur Akkumulator und aktuelle Ganzzahl zu haben, dekrementieren Sie die Ganzzahl und geben Sie die äußere Schleife erneut ein.



2

Python 3 , 78 75 73 71 Bytes

Nicht einmal annähernd die Python-Antwort von Leaky Nonne in der Byteanzahl.

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

Probieren Sie es online!


1
Sie nähern sich der ersten Überarbeitung meiner Antwort ... Sie können meinen Bearbeitungsverlauf überprüfen.
Undichte Nonne

Oh, haha ​​... Ich schwöre, ich habe es nicht gestohlen ... :)
officialaimm

2

Python 3 , 69 63 59 Bytes

4 Bytes dank Dennis.

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

Probieren Sie es online!

Ich habe das Rekursionslimit auf 2000 gesetzt, damit dies für 1000 funktioniert.


+1 Du hast meine Brownie-Punkte! Das ist die Lösung, von der ich gesprochen habe, als ich "kürzer als 70 Bytes" sagte ...
Mr. Xcoder

Dies funktioniert auch in Python 2
Mr. Xcoder

2

Holzkohle , 37 Bytes

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

Probieren Sie es online!

Link ist zur ausführlichen Version. Ich habe fast den ganzen Tag gebraucht, um herauszufinden, wie ich eine Frage in Bezug auf Nicht-ASCII-Kunst in Charcoal lösen könnte, aber schließlich habe ich es verstanden und bin sehr stolz auf mich. :-D

Ja, ich bin mir sicher, dass man hier viel Golf spielen kann. Ich habe gerade meine C # -Antwort übersetzt und bin sicher, dass die Dinge in Charcoal anders gemacht werden können. Zumindest löst es den 1000Fall in ein paar Sekunden ...



2

Python 2 (PyPy) , 145 Bytes

Da es Spaß macht, Codegolfwettbewerbe in Wettbewerbe mit dem schnellsten Code umzuwandeln, gibt es hier einen O ( n ) -Algorithmus, der bei TIO n = 5.000.000.000 in 30 Sekunden löst . ( Dennis Sieb ist 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)

Probieren Sie es online!

Wie es funktioniert

Wir zählen die Größe des Sets

S = {( a , b ) | 2 ≤ an , 2 ≤ b ≤ größter Eigenteiler ( a )},

durch Umschreiben als Vereinigung über alle Primzahlen p ≤ √n, von

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

und unter Verwendung des Einschluss-Ausschluss-Prinzips :

| S | = ∑ (−1) m - 1 | S p 1 ≤ ≤ S p m | über m ≥ 1 und Primzahlen p 1 <⋯ < p m ≤ √n,

woher

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 ≤ (≤ n / ( p 1p m ) ≤ + 1) - 2) / 2.

Die Summe hat Cn ungleich Null, wobei C gegen eine Konstante konvergiert, die wahrscheinlich 6 probably (1 - ln 2) / π 2 ≈ 0,186544 ist. Das Endergebnis ist dann | S | + n - 1.


Oooh, das ist schnell ...
Mr. Xcoder

2

NewStack , 5 Bytes

Zum Glück ist tatsächlich eine eingebaut.

Nᵢ;qΣ

Die Panne:

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.

Im eigentlichen Englisch:

Lassen Sie uns ein Beispiel für eine Eingabe von 8 ausführen.

Nᵢ: Liste der natürlichen Zahlen von 1 bis 8 erstellen: 1, 2, 3, 4, 5, 6, 7, 8

;: Berechnen Sie die größten Faktoren: 1, 1, 1, 2, 1, 3, 1, 4

q. Entfernen Sie das erste Element:1, 1, 2, 1, 3, 1, 4

ΣUnd nimm die Summe: 1+1+2+1+3+1+4=13


1+1+2+1+3+1+4= 13nicht 8. Ansonsten: tolle Antwort also +1.
Kevin Cruijssen

@ KevinCruijssen Whoops, danke, dass du das verstanden hast!
Graviton

2

Java 8, 78 74 72 Bytes

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

Port von @CarlosAlejos C # Antwort.

Probieren Sie es hier aus.

Alte Antwort (78 Bytes):

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

Probieren Sie es hier aus.

Erklärung (der alten Antwort):

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

Gestapelt , 31 Bytes

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

Probieren Sie es online!(Alle Testfälle mit Ausnahme von 1000, bei denen das Online-Zeitlimit von 60 Sekunden überschritten wird.)

Erläuterung

[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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.