Definition
Eine positive ganze Zahl n
ist eine praktische Zahl (OEIS-Sequenz A005153 ), wenn alle kleineren positiven ganzen Zahlen als Summen verschiedener Teiler von dargestellt werden können n
.
Ist beispielsweise 18
eine praktische Zahl: Die Teiler sind 1, 2, 3, 6, 9 und 18, und die anderen positiven ganzen Zahlen kleiner als 18 können wie folgt gebildet werden:
4 = 1 + 3 5 = 2 + 3 7 = 1 + 6
8 = 2 + 6 10 = 1 + 9 11 = 2 + 9
12 = 3 + 9 = 1 + 2 + 9 = 1 + 2 + 3 + 6
13 = 1 + 3 + 9 14 = 2 + 3 + 9 15 = 6 + 9
16 = 1 + 6 + 9 17 = 2 + 6 + 9
Dies 14
ist jedoch keine praktische Zahl: Die Teiler sind 1, 2, 7 und 14, und es gibt keine Teilmenge davon, die zu 4, 5, 6, 11, 12 oder 13 addiert.
Herausforderung
Schreiben Sie ein Programm, eine Funktion oder ein Verb, das eine positive Ganzzahl als Eingabe verwendet x
und entweder die x- te praktische Zahl zurückgibt oder ausgibt , die aus Gründen der Konsistenz mit OEIS von 1 indexiert wird. Ihr Code muss so effizient sein, dass er auf einem vernünftigen Desktop-Computer Eingaben von bis zu 250000 in weniger als zwei Minuten verarbeiten kann. (Hinweis: Meine Referenzimplementierung in Java verwaltet 250000 in weniger als 0,5 Sekunden und meine Referenzimplementierung in Python in 12 Sekunden.)
Testfälle
Input Expected output
1 1
8 18
1000 6500
250000 2764000
1000000 12214770
3000000 39258256
quelle
Antworten:
J (99 Zeichen)
Da die Problemstellung nach einem "Programm, einer Funktion oder einem Verb " fragt , musste jemand eine J-Vorlage machen. J Leute werden feststellen, dass ich nicht wirklich Golf (!) Gespielt oder dies optimiert habe. Wie bei den anderen Einträgen habe ich Stewarts Theorem verwendet, das im OEIS-Link erwähnt wurde, um zu testen, ob jede gerade Zahl praktisch ist oder nicht.
Ich habe keinen sofortigen Zugriff auf einen "vernünftigen Desktop-Computer", auf dem J installiert ist. Auf meinem sechs Jahre alten Netbook
f 250000
rechnet das in 120,6 Sekunden, was nicht ganz unter zwei Minuten liegt, aber vermutlich auf jedem etwas vernünftigeren Computer mit der Zeit erledigt.quelle
Mathematica,
126121 ZeichenDank an Belisarius.
Verwendung der Formel auf Wikipedia.
Beispiele:
Es dauerte 70er Jahre, um
f[250000]
auf meinem Computer zu rechnen .quelle
(i=j=1;While[j<#,If[And@@Thread[#[[;;,1]]<2+Most@DivisorSum[FoldList[#Power@@#2&,1,#],#&]&@FactorInteger@++i],j++]];i)&
Haskell - 329
Beispiele:
Hier ist eine kleine Testsuite (voranstellen):
Testergebnisse nach der Zusammenstellung mit
ghc -O3
:quelle
parse error on input `='
. Muss ich irgendeine Flagge benutzen?asdf.hs
und auszuführenghci asdf.hs
. Von dort aus können Sie dann auff
ghc --make -O3 [filename]
. Sie könnten es auch in ghci mit laden,:l [filename]
aber angesichts der kompilierten Zeitbeschränkungen ist es wahrscheinlich am besten. :)ghci
lädt Dateien in den angegebenen Argumentenghc
. Ihr Computer ist schneller als meiner, aber er liegt nach 98 Sekunden immer noch im Leistungskriterium meines Computers.Javascript,
306 307282B250k in ca. 6s auf meinem Laptop.
Kommentierter Code ohne Golfspiel: http://jsfiddle.net/82xb9/3/ jetzt mit besseren Sigma-Tests und einer besseren If-Bedingung (danke Kommentare)
Pre-Edit-Versionen: http://jsfiddle.net/82xb9/ http://jsfiddle.net/82xb9/1/
quelle
k--;
durch ersetzenreturn k-1
. Obwohl dies Ihre Byteanzahl geringfügig erhöht, können Sie einige davon durch Ersetzenp[i]>=P+2
durchp[i]>P+1
(und möglicherweise durch Entfernen des internen Funktionsaufrufs und Verwenden von abreak
) speichern .