Geschichte:
Lucy fragte George, was seine Glückszahl sei. Nach einigem Nachdenken antwortete George, dass er mehrere Glückszahlen habe. Nach einigem Durcheinander fragte Lucy George, was seine ersten n
Glückszahlen seien. George bat Sie dann, seinen Kumpel, ihm ein Programm zu schreiben, um die Arbeit für ihn zu erledigen.
Die Herausforderung:
Sie schreiben ein Programm / eine Funktion, die vom Standardeingabe- / Funktionsargument einen String oder eine Ganzzahl erhält n
. Das Programm / die Funktion gibt dann die ersten n
Glückszahlen aus . Glückszahlen werden über ein Sieb wie folgt definiert.
Beginnen Sie mit den positiven ganzen Zahlen:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Entferne nun jede zweite Zahl:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
Die zweite verbleibende Zahl ist 3 , also entferne jede dritte Zahl:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Jetzt ist die nächste verbleibende Zahl 7 , also entferne jede siebte Zahl:
1, 3, 7, 9, 13, 15, 21, 25, ...
Entfernen Sie als Nächstes jede neunte Nummer und so weiter. Die Folge sind die Glückszahlen.
Gewinnen:
Wie bei Codegolf üblich, gewinnen die wenigsten Bytes.
Wie üblich werden Einsendungen mit Standardlücken disqualifiziert.
quelle
Antworten:
Python 2, 79
Die Magie, eine Liste zu durchlaufen, während die Schleife sie ändert!
Die Liste
L
beginnt mit allen ganzen Zahlen1
mit einem ausreichend hohen Wert. Der Code durchläuft jedes Elementr
vonL
, nimmt die Unterliste jedesr
Elements und entfernt jeden dieser Werte. Infolgedessen werden die entfernten Werte nicht wiederholt. Am Ende drucken Sie die erstenn
Elemente.Der Ausdruck
map(A.remove,B)
ist ein Trick, auf dessen Verwendung ich lange gewartet habe. Es ruftA.remove
für jedes Element von aufB
, wodurch alle Elemente vonB
entfernt werdenA
.B
Tatsächlich nimmt es den Listenunterschied , obwohl es eine Unterliste von sein mussA
. Es erfordert Python 2, da Python 3 die Map nicht wirklich auswerten würde.Die erste Schleife muss ein spezielles Gehäuse haben, um
r
von1
nach2
, as konvertieren zu könnenr+=r<2
.Die ausreichend hohe Obergrenze von
2**n
macht das Programm für große Werte von sehr langsamn
. Verwendenn*n+1
reicht aus, kostet aber einen Charakter. Beachten Sie, dassn*n
dies nicht funktioniertn=1
.quelle
n**2
Zahlen, nicht2**n
map
Sie dort haben. Ich habe mich gefragt, ob es einen besseren Weg gibt ...n**2+1
sofern der Falln=1
nicht vergeben werden kann.map(A.index,B)
die Indizes der Elemente von B in Amap(A.count,B)
finden, die Anzahl der Elemente von B in A finden,map(A.extend,B)
eine abgeflachte B-Liste zu A hinzufügen. Der Verstand verwirrt.Haskell,
7169 BytesDefiniert eine Funktion
f
. Der Ausdruck wird1:s[3,5..]3
zu einer unendlichen Liste von Glückszahlen ausgewertet undf
nimmt einfach die ersten
von ihnen durchtake n
.Mit einem parallelen Listenverständnis konnte ich 5 Bytes aus dem Sieb entfernen
Dazu müsste jedoch das humongous-Compiler-Flag
-XParallelListComp
an GHC übergeben werden, damit die Erweiterung aktiviert werden kann.Erklärung des Siebs
Die Grundidee ist, dass
s(n:k)p
die(p-1)
dritte Glückszahl erzeugt wirdn
, jeden
dritte Zahl aus dem Endlosschwanz entfernt wirdk
(ump
die zuvor erzeugten Zahlen zu berücksichtigen) und mit dem Akkumulator auf diese Liste zurückgegriffen wird(p+1)
. Inf
initialisieren wir den Prozess mit den ungeraden Zahlen von Ausgangs3
und Klebrigkeit1
an der Vorderseite, genau die Glückszahlen zu erhalten.quelle
Python 2,
71 6967Zuerst dachte ich, dass dies eine große Herausforderung für Pythons Array-Slicing sein würde. Ich bin jedoch auf einen Stolperstein gestoßen, als ich entdeckte, dass Slices mit einem anderen Schritt als 1 nur Slices mit identischer Länge zugewiesen werden können. Aber nachdem ich "Python Remove Slice" gegoogelt hatte, war mein Glaube wiederhergestellt: Ich fand eine funky
del
Aussage, die den Trick perfekt macht.Alte Version
-2 Bytes dank Sp3000.
quelle
> <> ,
121114111 BytesIch habe nur ein paar Worte zu sagen ...
... "Argh, mein Gehirn tut weh."
Erläuterung
> <> ist eine esoterische 2D-Programmiersprache und aufgrund des Fehlens von Arrays definitiv nicht für diese Aufgabe geeignet. Tatsächlich ist der einzige Datentyp in> <> eine seltsame Mischung aus int / float / char, und alles geschieht auf einem Stapel von Stapeln.
Hier ist der Überblick:
Hier ist ein Musterbeispiel, das ungefähr zeigt, wie das Sieben funktioniert (hier
k
ist die Glückszahl, mit der wir sieben):quelle
nao
anscheinend als "Print this thing now" interpretiert werden kann.CJam - 25
Probieren Sie es online aus
Erläuterung:
Diese Implementierung entfernt keine Zahlen nacheinander aus einem Array, sondern berechnet jede Zahl basierend darauf, wie viele zuvor entfernt worden wären.
Für jeden Index i (von 0 bis n-1) und jede vorherige Glückszahl l erhöhen wir i in umgekehrter Reihenfolge um i / (l-1), mit Ausnahme von l = 1 verwenden wir 1 anstelle von 0 und addieren auch 1 am Ende.
ZB für i = 4 haben wir die ersten 4 Zahlen [1 3 7 9] und berechnen:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
quelle
Pyth:
2322 BytesProbieren Sie es online aus: Pyth Compiler / Executor
Erläuterung:
Die Reduzierung berechnet tatsächlich mehr als
Q
Glückszahlen (der Entfernungsbefehl wird Q + 1 mal aufgerufen, Q-1 sollte ausreichen).quelle
R, 58 Bytes
Mit Zeilenumbrüchen:
Vorherige Version, 62 Bytes
Vorherige Version, 78 Bytes
quelle
n=as.numeric(readline())
infunction(n){...}
. Dadurch wird ein Funktionsobjekt erstellt, das zugewiesen und aufgerufen werden kann. Lassen Sie die geschweiften Klammern in derfor
Schleife fallen.n=scan(n=1)
?CJam,
3230 BytesÜbernimmt die Eingabe von STDIN.
Code Erklärung :
Probieren Sie es hier online aus
quelle
Python 2,
105101 BytesNur eine einfache Implementierung.
Pyth,
39,36,3532 BytesÄhnlich wie oben, aber die Dinge sind 0-indiziert und nicht 1-indiziert. Probieren Sie es online aus .
Vielen Dank an @Jakube für den Hinweis auf eine Byte-Speicherung.
quelle
Mathematica, 80 Bytes
Einfache Umsetzung der Definition. Beginnt, wie einige andere Antworten zeigen, mit einem Bereich von
1
bis und filtert dann weiter.n2
quelle
Perl,
86817886
UPDATE: ist natürlich
grep{...}
besser alsmap{...?$_:()}
81:UPDATE: OK, jetzt eigentlich ein Einzeiler. Ich kann aufhören. (?) 78:
quelle
Octave,
1398372Ungolfed:
quelle
J
6052 BytesErklärung (von rechts nach links):
2,1+2*i.@*:@>:
zu lang scheint Art und Weise , aber ich kann es nur um 1 Byte verkürzen Austausch*:
mit!
so dass die Liste exponentiell wachsen.quelle
JavaScript (ES6) 96
99Edit Countdown in der ersten Schleife - danke @DocMax
Ungolfed
Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 Bytes
Vielen Dank an @flawr für sehr zutreffende Kommentare und Vorschläge.
Beispiel an der Matlab-Eingabeaufforderung:
quelle
Bash + Coreutils, 136
Ich hatte gehofft, noch mehr Golf spielen zu können, aber na ja. Nicht an jedem Tag, an dem Sie eine rekursive Funktion in einem Shell-Skript aufrufen:
Ausgabe:
Bash + Coreutils, 104
Kürzere Verwendung einer einfacheren Implementierung:
quelle
Los, 326
Einfache Implementierung mit Goroutine und Rohren zur Herstellung von Sieben.
quelle
MATLAB, 62 Zeichen
Ich habe die Herausforderung zunächst falsch interpretiert - meine überarbeitete Version ist jetzt tatsächlich kürzer.
quelle
Schläger 196 Bytes
Erzeugt Glückszahlen bis n:
Ungolfed-Version:
Testen:
Ausgabe:
quelle