Die Aufgabe besteht darin, die Divisorsumme einer Zahl aufgrund ihrer Primfaktorisierung zu berechnen.
Eingang
Zwei Arrays (oder etwas Äquivalentes) der Länge n , von denen eines den Primfaktor und das andere den entsprechenden Exponenten enthält.
Ausgabe
Die Summe aller Teiler (einschließlich der Zahl selbst).
Beispiel
Die Zahl 240 hat 2, 3 und 5 als Primfaktoren mit 4, 1 und 1 als jeweiligen Exponenten. Die erwartete Ausgabe wäre dann 744.
Input: [2,3,5] [4,1,1]
Output: 744
Wertung
Der kürzeste Code in Bytes gewinnt!
Wenn die Laufzeitkomplexität Ihrer Lösung O (Summe der Exponenten) und nicht O (Produkt der Exponenten) ist, kann Ihre Punktzahl mit 0,8 multipliziert werden.
Hier wurde eine ähnliche Frage gestellt , aber es war keine Herausforderung. Ich denke, das Problem ist interessant genug, um Golf zu spielen.
Der Gewinner wird an diesem Wochenende ausgewählt
Antworten:
Pyth, 13 Bytes * 0,8 = 10,4
Demonstration.
Diese Antwort funktioniert etwas anders als oben. Um die Summe der Faktoren der Primzahlen der Zahl zu berechnen, werden anstelle einer arithmetischen Formel die Faktoren explizit konstruiert und summiert.
Zum Beispiel bilden
[2, 4]
wir auf dem [Primzahl, Exponent] -Paar2 ^ x
ab0, 1, 2, 3, 4
und geben[1, 2, 4, 8, 16]
, was dann zu 31 summiert wird.Die Ergebnisse werden dann miteinander multipliziert und gedruckt.
Wenn die Potenzierung ordnungsgemäß implementiert ist oder wenn ein Zwischenergebnis-Caching vorliegt, ist dies der Fall
O(sum of exponents)
.quelle
O(n)
wenn wir annehmen können, dass die Basis eine Konstante ist.CJam, 15 Bytes * 0,8 = 12
Probieren Sie es online aus . Die Eingabereihenfolge ist zuerst die Exponentenliste und dann die Liste der Primzahlen (-3 Bytes dank @Dennis) .
(p, e)
Finden Sie für jedes Prim-Exponenten-Paardann finden Sie das Produkt von all diesen. ZB für 240 wäre das
Abhängig davon, wie die Potenzierung implementiert wird, kann dies besser sein als
O(sum of exponents)
.quelle
APL,
1813 Bytes * 0,8 = 10,4Dadurch entsteht ein dyadischer Funktionszug, der die Reihe der Faktoren links und die Exponenten rechts berücksichtigt.
Probieren Sie es online aus . Beachten Sie, dass dies der gleiche Ansatz ist wie die unglaublich clevere CJam-Antwort von Sp3000 .
5 Bytes dank Dennis gespart!
quelle
TI-BASIC, 17 Bytes * 0,8 = 13,6
Verwendet auch die Methode von Sp3000, obwohl ich sie unabhängig gefunden habe. Nimmt eine Liste von Input und eine vom Homescreen.
Verwenden von prod (zweimal ist kleiner, da wir damit die offene Klammer kostenlos verwenden können. Beachten Sie, dass diese Antwort keine leeren Arrays unterstützt, da in TI-BASIC keine leeren Arrays vorhanden sind.
quelle
Haskell, 38 * 0,8 = 30,4
Verwendung:
Die anonyme Funktion übernimmt
(p,e)
die Divisorsumme für die Summe derp^e
geometrischen Reihen. Wenn Sie die beiden Listen zusammenfügen, um das Produkt zu verbinden und zu entnehmen, erhalten Sie das Ergebnis.Ich konnte nichts kürzeres finden als den arithmetischen Ausdruck
Vielleicht gibt es einen Weg, das loszuwerden
(\p e->_)
.Die Definition der Infix-Funktion ergibt dieselbe Länge (38):
quelle
C ++,
1118077 Bytes * 0,8 = 61,6Dies berechnet (p ^ (e + 1) -1) / (p-1) und multipliziert rekursiv alle Faktoren. Hab das vor einem Jahr selbst herausgefunden.
Vielen Dank für Ihre Hilfe. Ich habe die boolesche Verwendung im C ++ - Stil völlig vergessen.
quelle
n==0
vereinfacht zu!n
- oder Sie könnten die Ergebnisse umkehren und einfach verwendenn
Matlab, 53
Beispiel:
quelle
s
und teste dann alle möglichen Teiler von1
biss
. Es ist also (mindestens) O (s), was wahrscheinlich zwischen O (Summe der Exponenten) und O (Produkt der Exponenten) liegtPython 2.156
Eingang
Ausgabe
Erläuterung
Dieses Programm erhält eine Liste mit 2 Listen: Faktoren und Exponenten.
Dann wird eine Liste aller möglichen Kombinationen der Exponentenliste erstellt.
und zip es mit den Faktoren:
Berechnen Sie die Faktoren nach Potenz der Exponenten:
und multipliziere jede Liste (dies gibt uns alle Teiler):
Zum Schluss summieren Sie alle Listen und drucken:
quelle
Python 3,
134120117Eingabe: zwei durch Kommas getrennte Arrays, die durch Komma getrennt sind.
Beispiel:
Mit NumPy kann auf 100 Bytes reduziert werden:
quelle
operator
für die Verwendung vonmul
einmal, können Siefloat.__mul__
eine Reihe von Bytes speichern zu.Gelee, nicht konkurrierend
Diese Antwort ist nicht konkurrierend, da die Herausforderung vor der Schaffung von Gelee liegt.
5 Bytes (kein Bonus)
Probieren Sie es online aus!
Wie es funktioniert
7 Bytes (5,6 Bytes nach Bonus)
Wie es funktioniert
Probieren Sie es online aus!
quelle
APL, 12 Bytes * 0,8 = 9,6
Dies liest zwei Listen von der Tastatur, Exponenten zuerst, dh:
Erläuterung:
⎕
: Lesen Sie eine Liste von der Tastatur (die Exponenten)⍳¨
: Generieren Sie für jede Nummer in der Liste eine Liste[1..n]
.⎕*
: Lesen Sie eine andere Liste von der Tastatur (die Primzahlen) und erhöhen Sie jede Primzahl auf jeden der Exponenten in den entsprechenden Listen+/¨
: summiere jede Liste1+
: Fügen Sie jedem Ergebnis eine hinzu, um das Fehlenx^0
in jeder der Listen zu kompensieren×/
: Nehmen Sie das Produkt der Ergebnissequelle
Schläger (Schema), 65 * 0,8 = 52 Bytes
Gleiche Arithmetik wie alle anderen
Erläuterung:
quelle
Python 2, 80 Bytes * 0,8 = 64
Dies setzt voraus, dass die Eingabe nacheinander eingeht. Folgt der gleichen Formel wie in der CJam-Antwort von Sp3000.
Wenn dies nicht erlaubt ist, verwende ich dies als Lösung, die eine Punktzahl von 84 Bytes * 0,8 = 67,2 erhält. Die Eingabe sollte durch ein Komma getrennt werden, d
[2,3,5],[4,1,1]
. H.Psst. Hallo! Dies ist eine mögliche Lösung in Symbolic, an der ich arbeite:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
quelle
Mathematica, 40 Bytes
Ohne die Inbuilts zu verwenden, die sich mit Teilern befassen, um sich von der anderen mathematica-Lösung im Thread zu unterscheiden.
Eingabe ist (am Beispiel)
[{2, 3, 5}, {4, 1, 1}]
quelle
Perl 5, 96 Bytes
Natürlich gewinnt das nicht, aber ich habe beschlossen, es zum Spaß zu schreiben.
Es ist eine Unterroutine:
Sehen Sie es in Aktion so:
Wie es funktioniert:
($b,$e)=@_
liest die eingegebenen Arrayrefs$b
(Basen) und$e
(Exponenten).$s=1
initialisiert das Produkt.map$s*=$b->[$_]**$e->[$_],0..@$b-1
multipliziert$s
mit aufeinanderfolgenden Basisexponentenkräften. Jetzt$s
ist die zusammengesetzte Nummer.$_=1x$s
Sätze$_
gleich einer Folge von Einsen,$s
lang.$i
wird bei 0 initialisiert.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
versucht für jede Zahl$j
zwischen 1 und$s
, sich zu trennen$_
, wenn$j
Zeichen beliebig oft wiederholt werden. Wenn sie kann, dann$j
teilt$s
, und/^(.{$j})*$/
1 ist (ansonsten ist es 0) und$i
wird verstärkt durch$j
. Daher erhöhen wir$i
die Anzahl der Partitionen in einer gleich großen Partition von$_
. Wie Omar E. Pol betont ,$i
ist dies die Nummer, die wir suchen.$i
am Ende kehrt zurück$i
.quelle
J, 14 Bytes * 0,8 = 11,2
Verwendung
quelle