Erstellen wir ein N × N-Raster aus Leerzeichen und Unterstrichen, mit dem visuell festgestellt werden kann, ob eine Zahl eine Primzahl ist. (N kann eine beliebige positive ganze Zahl sein.)
Dieses Raster hat drei einfache Regeln:
- Die n-te Spalte enthält das wiederholte Muster von n-1 Unterstrichen, gefolgt von einem Leerzeichen. Dieses Muster beginnt in der ersten Zeile und endet möglicherweise in der Mitte der Zeile N. (Zeilen und Spalten sind 1-indiziert.)
- Die erste Spalte wird durch alle Unterstriche anstelle aller Leerzeichen ersetzt.
- Wenn irgendwo ein Leerzeichen vorkommt, entspricht der Zeilenindex dem Spaltenindex und wird durch einen Unterstrich ersetzt.
Beispiel: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Die Indizes dienen nur der Übersichtlichkeit. Das einfache Raster selbst (was Ihr Programm ausgeben muss) ist:
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Beachte das:
- Die erste Spalte enthält alle Unterstriche.
- Die zweite Spalte enthält Unterstrich, Unterstrich usw., mit Ausnahme des Unterstrichs in Zeile 2.
- Die dritte Spalte enthält Unterstreichungszeichen, Unterstreichungszeichen usw., mit Ausnahme des Unterstreichungszeichens in Zeile 3.
- etc.
Beachten Sie außerdem, dass außer 1 nur Zeilen mit Primzahlen in jeder Spalte Unterstriche aufweisen.
Da sich Unterstriche über die gesamte Schriftbreite erstrecken, bildet jede Zeile mit Primzahlen eine durchgehende durchgezogene Linie. Es ist also visuell recht einfach zu überprüfen, ob eine Zahl eine Primzahl ist oder nicht. Überprüfen Sie einfach, ob die Linie in allen Spalten durchgehend ist. (Tatsächlich reicht ein Blick auf die Quadratwurzel des Zeilenindex aus, aber die Ausgabe dieses Rasters erscheint weniger elegant.)
Programm
Schreiben Sie ein Programm, das diese Gitter mit N über stdin (oder die nächstliegende Alternative) zeichnet. Die Ausgabe erfolgt nach stdout (oder nach der nächstgelegenen Alternative) und sollte nur Leerzeichen, Unterstriche und Zeilenumbrüche mit einer optionalen nachgestellten Zeile enthalten.
Der kürzeste Code gewinnt.
n
Machen Sie für die th-Zeile dask
th-Zeichen zu einem Leerzeichen, wennk
es sich um einen Teilerm
handelt, der nicht 1 oder istm
.Antworten:
CJam,
332827 BytesProbieren Sie es online aus.
Wie es funktioniert
Beispiellauf
quelle
Ruby,
7773 ZeichenEinige Tricks, die ich benutzt habe:
Der
..
Operator hat fast die niedrigste Priorität aller Operatoren in Ruby,(1..n=gets.to_i)
funktioniert also einfach.Anstatt ein Extra hinzuzufügen
a!=1
Bedingung , wenn geprüft wird, ob das Zeichen ein Leerzeichen anstelle eines Unterstrichs sein soll (da die erste Zeile nur Unterstriche enthält), habe ich gerade den Bereich von gestartet2
und einem zusätzlichen vorangestellt?_
.Zeile A kann zu Zeile B werden:
weil ich ein extra Leerzeichen zwischen
b
und?
in Zeile A haben muss, das aber nicht zwischen0
und?
in Zeile B benötigt wird,b?
ist aber eine gültige Ruby-Methode0?
nicht.puts
werden Arrays automatisch mit Zeilenumbrüchen verbunden, sodass keine zusätzlichen Zeilen benötigt werden*"\n"
.Ausgabe für
n=100
:Jetzt inklusive Extra-Special ™ Mega-Buntes Rot © Highlight-Magic ™ ® Extended Edition ©: (zum Vergrößern auf das Bild klicken)
Ruby mit Farbe, 110 Zeichen
quelle
' '
. Wahrscheinlich bringt es Ihren Syntax-Textmarker durcheinander, aber es funktioniert immer noch einwandfrei. Also,a%b<1
*''
die gleichen wie beitreten wird funktionieren, und Sie können überprüfen ,a<b
statt ,a!=b
da kein Faktor a größer als ein. Es kann auch zu Einsparungen kommen, wenn Sie ein Segment in eine Zeichenfolge mit zwei Zeichen aufteilen, und zwar mit dem Ergebnis einiger Berechnungen für a und b, anstatt eine ternäre Zeichenfolge zu verwenden.J - 28 Zeichen
Erklärt durch Explosion:
Wie es aussieht:
quelle
Python 2,
7671Nicht sicher , ob es bekommen kann jede kürzer als diese ... Diese Stichworte:
range
,input
undprint
kostet ziemlich viel.quelle
i>j>1and i%j<1
durchi>j>1>i%j
i%j<1<j<i
:-P. Vielleicht wird es wirklich nicht kürzer.i%j<1
. Es implizierti>=j
.i>j
,i>=j
um Leerzeichen auf der Diagonale nicht zu vermeiden.APL (28)
Erläuterung:
⍳2⍴⎕
: Lies eine Zahl N und erstelle eine N-mal-N-Koordinatenmatrix(
...)/¨
: Wenden Sie für jedes Koordinatenpaar die folgende Funktion an:0=|⍨
: ymod
x = 0 und≠
: x ist nicht gleich y und1≠⊢
: x ist nicht1
.1+
:1
Zur resultierenden Bitmatrix hinzufügen, da APL-Arrays bei 1 beginnen.'_ '[
...]
: Ersetzen Sie jeweils1
durch einen Unterstrich und2
ein Leerzeichen.quelle
Perl,
6961Aktualisierte Version (danke, Dennis !)
Originalfassung:
quelle
join
noch2..$n
Notwendigkeit. 2. Mit dem-n
Schalter können Sie$_
anstelle von verwenden$n
. 3._
ist ein gültiges Bareword, daher sind keine Anführungszeichen erforderlich. 4. Sie können$"
anstelle von verwenden" "
. 5. Sie können|
anstelle von verwenden||
.-n
Ding nicht gemacht , weil ich es als eigenständiges Programm behalten wollte und nicht sagen muss$^N=1
. Die Verwendung_
als Bareword funktionierte im Fall von$i==_
, funktionierte aber nicht im Fall von,$i%_
weil der Parser-Gedanke%_
ein Hash war.#!/bin/perl -n
wird normalerweise als 1 Byte gezählt), aber das liegt natürlich an Ihnen. Ich habe keine Ahnung, was$^N=1
... 2.$i==_
nicht richtig funktioniert; es wird testen ob$i == "_"
. Was ich meinte, ist die Verwendung_
von"_"
, dhsay _
und$i==$_?_:$"
._
="_"
jetzt. Leider funktioniert es im letzteren Fall, aber es gibt mir einen Fehler neben dem,say
weil es scheint, als wäre es ein Dateihandle.CJam, 27 Bytes
Probieren Sie es online aus.
Dieser Ansatz erreicht die gleiche Byteanzahl wie meine andere Antwort, aber ich dachte, dass es sich trotzdem lohnt, etwas zu posten. Anstatt in jeder Zeile die richtigen Vielfachen zu markieren, wird genau das getan, was in der Spezifikation angegeben ist.
Wie es funktioniert
Beispiellauf
quelle
C 143
C ist offensichtlich nicht die richtige Wahl der Sprache dafür. Der Vollständigkeit halber ist hier eine Möglichkeit, dies in C zu tun. Funktioniert für Werte von n bis 1048575. Liest n von der Standardeingabe.
Es ist jedoch sehr schnell.
Die Laufzeit für n = 1.000.000 (was ein Raster mit 1.000.000.000.000 Elementen ergibt) beträgt auf meinem System ungefähr 55 Minuten.
Die Laufzeit für n = 1000 (was ein Raster mit 1.000.000 Elementen ergibt) beträgt weniger als 1/100 Sekunde.
quelle
int
, damit Sie sie verwenden könnenchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
speichert zwei Bytes überscanf("%d",&n);for(;++i<=n;)
.