Sachen zu wissen:
Erstens Glückszahlen.
Glückszahlen werden wie folgt generiert:
Nehmen Sie alle natürlichen Zahlen:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Entfernen Sie dann jede zweite Zahl.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Jetzt 3
ist sicher.
Entfernen Sie jede dritte Nummer:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Jetzt 7
ist sicher.
Entfernen Sie jede 7. Nummer.
Fahren Sie fort und entfernen Sie jede n
dritte Nummer. Dabei n
handelt es sich um die erste sichere Nummer nach einer Eliminierung.
Die endgültige Liste der sicheren Zahlen sind die Glückszahlen.
Die Unglückszahlen setzen sich aus separaten Zahlenlisten zusammen, die es sind [U1, U2, U3... Un]
.
U1
ist der erste Satz von Zahlen, der von den glücklichen "Kandidaten" entfernt wurde, also sind sie:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
ist der zweite Satz von Zahlen entfernt:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
Und so weiter und so fort ( U3
ist die dritte Liste, U4
ist die vierte usw.)
Herausforderung:
Ihre Aufgabe ist es, bei zwei Eingaben m
und n
die m
th Nummer in der Liste zu generieren Un
.
Beispiel Ein- und Ausgänge:
(5, 2) -> 29
(10, 1) -> 20
Technische Daten:
- Ihr Programm muss für
m
bis zu1e6
undn
bis zu100
.- Sie sind garantiert, dass beide
m
undn
positive ganze Zahlen sind. - Wenn Sie neugierig sind,
U(1e6, 100)
=5,333,213,163
. (Danke @pacholik!)
- Sie sind garantiert, dass beide
- Ihr Programm muss dies innerhalb eines Tages auf einem vernünftigen modernen Computer berechnen.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
PS: Es wäre schön, wenn jemand eine allgemeine Formel zur Erzeugung dieser Formeln ausdenken würde. Wenn Sie eine Formel haben, geben Sie diese bitte in Ihre Antwort ein!
(1e6,1e6)
?n=1
Fall nicht funktioniert ? Da dies besonders ist - für alle anderen Fälle ist der 0-basierte Index der nächsten Glückszahln-1
.Antworten:
CJam , 74 Bytes
Probieren Sie es online! Bei größeren Fällen tritt eine Zeitüberschreitung auf. Weitere Informationen zu Zeitbeschränkungen finden Sie weiter unten.
Erläuterung:
Unser Programm leiht sich schamlos den Code von Aditsu aus , um eine Liste mit N Glückszahlen zu erstellen. Wenn Sie 1 durch 2 ersetzen, erhalten Sie das Inkrement in jeder Phase des Siebs. Der verbleibende Code dekrementiert jedes Element, bis eine Null gefunden wird (durch Schneiden und Anhängen eines nicht dekrementierten Endes), und zählt effektiv die Schritte in jeder der N Phasen des Siebs gleichzeitig.
Zeitliche Koordinierung:
Wenn Sie das Programm für größere Zahlen unbedingt im Browser ausführen müssen, können Sie diesen Interpreter verwenden und zulassen, dass das Skript fortgesetzt wird, wenn Sie dazu aufgefordert werden. Dies ist jedoch möglicherweise zu langsam, um eine Qualifizierung vorzunehmen. Die Verwendung von ( M , N ) = (100, 100) dauert ~ 247s. Die Programmiteration ist in Bezug auf M relativ linear , daher kann die Berechnung (1e6,100) ~ 29 Tage dauern.
Unter Verwendung des Shell-Interpreters auf einem PC berechnet das Programm (100, 100) in ~ 6s und (1e4, 100) in ~ 463s. Das Programm sollte in der Lage sein, (1e6,100) in ~ 13-17 Stunden zu berechnen. In diesem Fall gehe ich davon aus, dass sich das Programm qualifiziert.
Beachten Sie, dass alle Zeiten in Messungen und Berechnungen aufgerundet wurden.
quelle
Perl,
87858281 BytesBeinhaltet +4 für
-pX
Geben Sie STDIN als eine Zeile mit n als erstes ein (beachten Sie, dass dies die Umkehrung der in der Challenge vorgeschlagenen Reihenfolge ist). So berechnen Sie
U(1000000, 100)
:Algorithmus basierend auf der Antwort von aditsu auf Glückszahlen Die Zeitkomplexität ist so, dass sie für den erforderlichen Bereich ziemlich schnell ist. Der Fall gibt in 0,7 Sekunden. Aufgrund der Probleme, die Perl mit der basierten Rekursion hat , verbraucht es viel Speicher. Das Umschreiben als Funktion würde den Speicher belegen , ist aber einige Bytes länger
O(n^2)
100, 1000000
5333213163
do$0
O(n)
unlucky.pl
:Dies funktioniert wie gezeigt, aber verwenden Sie Literal
^S
, um die beanspruchte Punktzahl zu erhalten.Mir ist keine frühere Verwendung von
$^S
Perlgolf bekannt.quelle
(1e6,100)
?do$0
ist es auf keinem realistischen Computer erreichbar. Aber wenn so viel Gedächtnis vorhanden ist, dann ungefähr 2 Jahre. Ich habe noch nicht wirklich eine normale, auf Unterprogrammen basierende Version geschrieben und getestet, aber ich würde erwarten, dass diese in ein paar Monaten fertig ist und sogar auf Computern mit sehr wenig Arbeitsspeicher ausgeführt wird. Gut, dass diese Werte für diese Herausforderung nicht im erforderlichen Bereich liegen.(1e6,100)
innerhalb eines Tages zu rechnen ? Was meinst du, diese Werte sind nicht erforderlich?n
undm
in umgekehrter Reihenfolge angegeben werden. Die100 1000000
Eingabe berechnetU(1000000, 100)
und gibt5,333,213,163
in 0,7 Sekunden. Es ist bei weitem das schnellste Programm dieser derzeit geposteten(100,1e6)
, dass es viel schneller geht als(1e6,100)
und dachte, das wäre die Erklärung für die blitzschnellen 0,7 Sekunden!Python 3, 170
Die Funktion L erzeugt die Reihe möglicher Glückszahlen (wenn k Wahr ist) oder Un (wenn Falsch). Faul ausgewertet (damit ich keine n-1 unendlichen Listen generieren muss, wenn ich Un will ).
Führen Sie die Funktion U aus .
Geschwindigkeit
U (1.000.000; 100) benötigt ca. 1 Stunde und 45 Minuten, um mit PyPy auf meinem Computer ausgeführt zu werden. Ich vermute etwa vier Stunden mit CPython. (Ja, 4h 20min um genau zu sein.)
Wenn ich eine Liste anstelle von Generatoren verwenden würde, könnte ich etwas an Geschwindigkeit gewinnen, aber ich würde eine Liste mit größerer Größe benötigen, als mir Python erlaubt. Und wenn doch, würde es Dutzende von Gigabyte RAM benötigen.
Ja und U (1.000.000; 100) = 5.333.213.163 .
quelle
Haskell
Für n = 1:
175160 Byte kann nicht berechnet werdenBeim Kompilieren benötigte mein Computer 2 Stunden 35 Minuten, um eine Eingabe zu berechnen, in der Folgendes
(1000000,100)
verwendet wurde:Ich habe versucht, die
where
Module zu bereinigen , aber sie scheinen die Geschwindigkeit zu beeinträchtigen, und ich bin mir nicht sicher, warum ... Aber ich denke, hier gibt es mehr zu bereinigen.Die zu verwendende Methode dient
m?n
zum Abfragen der Antwort mitm
undn
.Ungolfed
Ich gehe davon aus, dass es möglich sein könnte, die Funktionen 'skipeverynth' und 'everynth' zu einer einzigen Funktion zu kombinieren, die ein Paar zurückgibt.
Ich habe den Code dieser freundlichen Person verwendet, um jedes n-te Element zu überspringen. Ich habe es selbst ein paar Mal gemacht, aber es war immer viel ineffizienter und ich konnte nicht herausfinden, warum.
Kann für alle n: 170 Bytes rechnen
Dies ist im Grunde das gleiche, aber ein paar
max
Funktionen mussten eingebaut werden, um den Sonderfall von zu behandelnn=1
.quelle
R 82 Bytes
Verwendung
Zunächst muss der Vektor groß genug sein, damit genügend Zahlen übrig bleiben, um den Wert zurückzugeben. Der erzeugte Vektor ist bereits ungefähr 800 MB groß und die Funktion kann bis zu m = 1e4 und n = 100 verarbeiten, also immer noch weit hinter dem Ziel.
Um einen Vektor zu erstellen, der groß genug ist, um f (1e6,100) zu berechnen, würde ein Startvektor von 1: 2e10 verwendet. Aufgrund der Zuweisung von Rs-Daten wird ein Vektor> 70 GB erstellt, der auf keinem mir bekannten Computer ausgeführt werden kann, obwohl der Code ausgeführt werden würde.
Als Referenz läuft f (1e4,100) in ungefähr 30 Sekunden. Basierend auf diesem und ein paar kleineren Tests würde f (1e6,100) ungefähr eine Stunde dauern.
quelle
Schläger 332 Bytes
Ungolfed-Version:
Testen:
Ausgabe:
quelle
Clojure, 221 Bytes
Mächtig lang aber behandelt den Fall
(f 1)
. Ohne diesen Sonderfall waren es 183 Bytes. Das war zu viel Aufwand, um es nicht zu veröffentlichen.Beispielausgaben:
1000000 100 Fall wurde in ca. 4,7 Stunden berechnet, zumindest stürzte es nicht ab.
quelle