Zeichne mit einer gegebenen Zahl N eine linksbündige N x N- Tafel mit Zahlen und lasse 1 frei (als Leerzeichen) (ich zeige Diagramme mit N = 5)
2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Ihre Aufgabe ist es, Schritt für Schritt das Sieb des Eratosthenes zu bauen. Beginnen Sie zuerst mit 2. Es ist eine Primzahl. Lassen Sie es also dort und ersetzen Sie alle anderen durch 2 teilbaren Zahlen durch die richtige Anzahl von Leerzeichen.
2 3 5
7 9
11 13 15
17 19
21 23 25
Gehen Sie als Nächstes zur nächsten nicht gedruckten Nummer ( 3
in diesem Fall) und machen Sie dasselbe.
2 3 5
7
11 13
17 19
23 25
Und so weiter, bis Sie N erreichen .
Sie müssen zuerst das vollständige Raster ausdrucken und jedes Mal, wenn Sie zu einer neuen Zahl wechseln, die Tafel mit den entfernten Vielfachen ausdrucken. Stellen Sie sicher, dass Sie eine leere Zeile dazwischen drucken!
Beispiele
Text in Klammern dient ()
nur als Referenz. Sie müssen ihn nicht ausdrucken
N = 2:
2 (complete grid)
3 4
2 (remove multiples of 2)
3
N = 3:
2 3 (complete grid)
4 5 6
7 8 9
2 3 (remove multiples of 2)
5
7 9
2 3 (remove multiples of 3)
5
7
Denken Sie daran, dies ist Code-Golf , also gewinnt der Code mit der geringsten Anzahl von Bytes.
N=10
,100
nicht prim ist, wird so zu einem bestimmten Zeitpunkt entfernt werden. Müssen alle Zahlen mit 3 Zeichen aufgefüllt werden, weil100
sie 3 Ziffern haben?Antworten:
Jelly , 34 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Perl,
250243231202157 BytesTesten Sie das aktuelle Golf online! (unbedingt ausführen als
perl -M5.010 main.pl
)Die beiden wörtlichen Zeilenumbrüche speichern jeweils 1 Byte anstelle von \ n.
Beispielausgabe (Eingabe von 7):
Ich bin mir sicher, dass ich nicht sehr gut Golf gespielt habe. Wenn ich nach Hause komme, werde ich es mir noch einmal ansehen, um zu sehen, wie viel ich abschneiden kann.
Edit 1: -7 Bytes (Ändern von "print sprintf" in das offensichtliche "printf")
Edit 2: 12 Bytes wurden gespeichert, indem $ d explizit an der Stelle verwendet wurde, an der es aufgerufen wurde, anstatt eine separate Variable zu erstellen, indem einige Deklarationen kombiniert wurden und eine meiner Bedingungen für die
next
Anweisung in der erstenforeach
Schleife durch Hinzufügen eines Leerzeichens an einer anderen Stelle beseitigt wurde . Weitere 29 Byte wurden ausgegeben, indem zwei for-Schleifen in eine einzige Schleife überarbeitet, zwei Variablendeklarationen entfernt undunless
Anweisungen in if-not-Anweisungen umgewandelt wurden. Das Deklarierenmy$e=$n*$n;
und Ersetzen der drei Instanzen von $ n * $ n durch $ e (wodurch ich einen Paren für einen von ihnen löschen konnte) ergab ± 0 Bytes, aber ich behielt es trotzdem bei.Edit 3: Dank @Dada wurden weitere 40 Bytes herausgefiltert (variable Deklarationen, 'foreach' wird 'for', implizites $ _ an mehreren Stellen und Reduzierung der printf-Anweisungsgröße). Ein zusätzliches Byte wurde durch Drehen
if!($c%$p||$c==$p||$p==1)
in abgeschabtif!($p~~[(1,$_)]||$_%$p)
. Leider ist das [] um das Array erforderlich, da der Smartmatch-Operator ~~ noch experimentell ist und bei tatsächlichen Arrays anscheinend nicht richtig funktioniert, sondern stattdessen bei Verweisen auf diese Arrays. 4 weitere Bytes wurden entfernt, indem zwei Semikolons und ein leerer Satz von Anführungszeichen nach dem letzten entfernt wurdensay
.quelle
my
). Verwenden Sie-p
flag, umN
innen zu haben,$_
anstatt zu verwenden$n=<>
. Schreiben Siefor
stattforeach
(diese Anweisung entspricht). Löschen Sie die Klammer um den Zustand der ,if
die in Anweisung Modifikator Position sind (zum Beispielif!$c%$n
stattif(!$c%$n)
keine Klammern benötigt zu initialisieren.@a
:@a=0..$e
. Sie fallen könnenfor
variabel und$_
wiil stattdessen verwendet werden schreiben.printf"%*s",1+length$e,$a[$c]
(Die `` sprintf` doc für Details über das*
)$"
anstelle von" "
.say""
stattdessenprint"\n"
(Sie haben einen kleinen Zeilenvorschub in Ihrem Code, aber ich kann ihn nicht in einem Kommentar schreiben) (Sie werden hinzufügen, um ihn-M5.010
zur Befehlszeile hinzuzufügen , aber das zählt nicht in der Byteanzahl). Sie können wahrscheinlich verwenden0..$e=$n*$n
, um ein Byte bei der Initialisierung von zu speichern$e
. Schauen Sie sich die Perl-Golftipps an , sie enthalten viele nützliche Tipps. Aber es ist schön, einen neuen Perlgolfspieler zu sehen, willkommen! :) (und verzeihen Sie meine Rechtschreibfehler, ich kann meinen vorherigen Kommentar zu schnell geschrieben haben)if!$c%$n
die! operator hat Vorrang vor dem% -Operator. Technisch gesehen ist dies alsoif((!$c)%$n)
der Wert, der für alles andere als $ c = 0 (was ich nicht möchte) als false ausgegeben wird. Was Ihre anderen Tipps angeht, werde ich sehen, was ich tun kann! Vielen Dank!!
, ich war nicht auf meinem Computer, um das zu überprüfen. Sie sollten in der Lage sein, bis zu 160 Zeichen zu bekommen, denke ich.PHP, 155 Bytes
@Crypto -3 Bytes Vielen Dank @Titus -6 Bytes Vielen Dank
Versuch es
Das erste Mal, dass ich print in einer After-Loop-Bedingung verwende
Nervenzusammenbruch
Vorherige Version 174 Bytes
quelle
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
für$l=log10($m)+2
$i=$d*$x=$d>1
statt$i=$d<2?0:$d
und$x
für die beiden anderen Vorkommen von$d>1
$n*$n>=$i+=$d
anstelle von($i+=$d)<=$m=$n**2
und$n*$n
für das andere Vorkommen von$m
Groovy,
201195191 BytesDies ist ein absoluter Cluster ... Die Linke hat meine Byteanzahl ermordet. Aber hey, es funktioniert. Hier ist die Ausgabe für 4:
Ungolfed:
Um die Umstellung zu erleichtern, müssen Sie
quelle
Perl,
115114113112 BytesBeinhaltet +1 für
-a
Mit der eingegebenen Nummer auf STDIN ausführen:
sieving.pl
:Benötigt eine aktuelle genug Perl, so dass
-a
impliziert-n
. Wenn Ihr Perl zu alt ist, fügen Sie eine-n
Option hinzu.Gibt eine abschließende neue Zeile aus, die zulässig ist.
quelle
Python 2,
199 202201 Bytes+3 Byte (ich habe nicht vorzeitig
angehalten ) -1 Byte dank @Oliver (Leerzeichen verpasst)
repl.it
quelle
1
und entfernenfor
JavaScript (ES6),
190 bis189 ByteDruckt direkt auf die Konsole.
Demo
Code-Snippet anzeigen
quelle
Batch, 464 Bytes
Das war etwas mühsam. Erläuterung: Beginnt mit dem Quadrieren,
n
damit mithilfe der Schleife die gewünschte Spaltenbreitec
und der entsprechende Abstand berechnet werden können . Die äußere Schleife von bis wird dann für jedes Raster einmal ausgeführt und ruft die Unterroutine auf . Zuerst wird geprüft, ob der Wert 1 oder eine Primzahl ist. Wenn nicht, wird dieses Gitter übersprungen. Die innere Schleife von bis behandelt dann die Zeilen und Spalten des Rasters und ruft die Unterroutine aufp
:l
1
n
:i
1
n*n
:j
. Jeder Wert wird überprüft, um festzustellen, ob es sich um eine der bisher gefundenen Primzahlen handelt oder ob keine der bisher gefundenen Primzahlen diese dividiert. In diesem Fall wird der Wert mit dem Ausgabepuffer verknüpft, der dann auf die gewünschte Spaltenbreite aufgefüllt wird. Der Puffer wird allen
Zeilen gedruckt und gelöscht , und am Ende des Rasters wird eine zusätzliche Leerzeile hinzugefügt. Das:f
Etikett kennzeichnet das Unterprogramm zur Faktorprüfung; f (x, y) addiert 1 zuf
jeder ganzen Zahl zwischen 2 undx
der dividierty
, ohne sichy
selbst.quelle
R
195,191185204 BytesDanke an @Billywob für 6 zusätzliche Bytes!
Eingerückt, mit Zeilenumbrüchen:
Verwendung:
quelle
^
ist die einzige, die nicht vektorisiert wird bei der Generierung von Sequenzen ,:
welche Mittel Sie zB verwenden können ,1:2^2
zu erhalten1 2 3 4
. Zweitens, wenn Sie definierena=b=1:n^2
, können Sie später einenfor(j in b)
anderen Vektor zum Schleifen verwenden, anstatt ihn zu definieren. Sollte Ihnen ein paar Bytes ersparen.J, 125 Bytes
Dies ist ausdrücklich, nicht stillschweigend, aber es sollte eine Möglichkeit geben, stillschweigend Golf zu spielen.
Verwendung
quelle
Mathematica, 133 Bytes
quelle
PHP,
155150147145142140 BytesNervenzusammenbruch
quelle
$a[$i]="";
stattunset($a[$i]);
4 Bytes sparen soll$i%$k<1
statt!($i%$k)
ein Byte zu speichern