Schreiben Sie ein Programm, das (über STDIN / Kommandozeile) eine nicht negative ganze Zahl N aufnimmt.
Wenn N 0 ist, sollte Ihr Programm drucken O
(das ist das Kapital Oh, nicht Null).
Wenn N 1 ist, sollte Ihr Programm drucken
\|/
-O-
/|\
Wenn N 2 ist, sollte Ihr Programm drucken
\ | /
\|/
--O--
/|\
/ | \
Wenn N 3 ist, sollte Ihr Programm drucken
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
Für ein größeres N setzt sich dieses Muster auf die gleiche exakte Weise fort. Jede der acht Strahlen der „Sonne“ sollte von N der entsprechenden gemacht werden -
, |
, /
, oder \
Zeichen.
Einzelheiten
- Anstelle eines Programms können Sie auch eine Funktion schreiben, die eine Ganzzahl annimmt. Die Funktion sollte das Sonnenmuster normal drucken oder als Zeichenfolge zurückgeben.
Sie müssen entweder
- haben überhaupt keine nachgestellten Leerzeichen, oder
- Verfügen Sie nur über genügend nachgestellte Leerzeichen, damit das Muster ein perfektes (2N + 1) * (2N + 1) Rechteck ist.
Die Ausgabe für ein beliebiges oder alle N kann optional einen nachgestellten Zeilenumbruch enthalten.
Wertung
Der kürzeste Code in Bytes gewinnt.
code-golf
ascii-art
kolmogorov-complexity
Calvins Hobbys
quelle
quelle
N=0
.Antworten:
Pyth,
393836 BytesProbieren Sie es online aus: Pyth Compiler / Executor
Erläuterung
Eine weitere 36-Byte-Lösung wäre:
quelle
C:
11610299959290Ich denke, dass ich mit diesem Ansatz einer minimalen Lösung ziemlich nahe komme, aber ich kann nicht aufhören, das Gefühl zu haben, dass es bei C. Ungolfed einen viel besseren Ansatz gibt:
quelle
c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
GNU sed, 252 + 1
Puh - ich habe die PHP-Antwort geschlagen!
Punktzahl + 1 für die Verwendung des
-r
Parameters.Aufgrund von Einschränkungen müssen wir fast 100 Bytes brennen und nur N in eine Folge von N Leerzeichen umwandeln. Der Rest ist das lustige Zeug.
Erläuterung
:
) konvertieren N in eine Folge von N Leerzeichens/ //
Entfernt ein Leerzeichens^.*^\\&|&/^;ta
konvertiert N-1 Leerzeichen in:\
+ N-1 Leerzeichen +|
+ N-1 Leerzeichen +/
\
ein Leerzeichen nach rechts und/
ein Leerzeichen nach links ...\|/
, das durch ersetzt wird-O-
und zumn
Etikett springenmit
-
und drucken-0-
mit/|\
und ersetzenmit
-
und springen zurück in die Hauptschleife\
ein Leerzeichen nach rechts und/
ein Leerzeichen nach links ...\$
was anzeigt, dass es fertig ist, und beenden.Ausgabe
quelle
J,
373440 BytesVerwendungszweck:
Erklärung (von links nach rechts):
i:
Erzeugt Liste-n, -(n-1), ..., n-1, n
( )"*/~@i:
Erstellt das Descartes-Produkt von i: mit sich selbst in einer Matrixanordnung, zB für dien = 1
Erstellung der folgenden3-by-3
MatrixFür jedes Matrixelement mit ganzen Zahlen machen
x y
wir folgendes+&|,-,+,[,]
Berechnen Sie eine Liste von Eigenschaften+&|
abs(x)+abs(y)
, ist gleich0
iff (wenn und nur wenn)x=0
undy=0
-
xy, entspricht0
iffx=y
dh wir sind auf der Diagonale+
x + y, entspricht0
iffx=-y
dh wir sind auf der Antidiagonale[
x ist gleich0
iff,x=0
dh wir befinden uns in der mittleren Reihe]
y ist gleich0
iff,y=0
dh wir befinden uns in der mittleren Spalte'O\/-|'#~0=
Vergleichen Sie diese obigen Eigenschaftswerte mit0
und nehmen Sie dasi
th-Zeichen aus der Zeichenfolge,'O\/-|'
wenn diei
th-Eigenschaft wahr ist.{.
Nimmt das erste Zeichen einer Zeichenkette und gibt, wenn es kein Zeichen gibt, ein Leerzeichen als Auffüllung zurück, wie wir es brauchen1:echo
Probieren Sie es hier online aus.
quelle
PHP, 182 Bytes
Dies schien mir eine lustige Aktivität für meine erste Antwort zu sein. Kommentare zu meinem Code sind willkommen.
Hier ist der Code ohne Golfspieler mit Kommentaren:
Bearbeitet mit Code von royhowie
quelle
if(($y-$h)==($x-$h))
macht das gleiche wieif(($y==$x)
. Sie können durch das Ersetzen ein anderes Zeichen speichernif($x==y$)foo();else bar();
mitif($x^$y)bar();else foo();
. Sie sollten auch versuchen, ternäre Operatoren anstelle vonif .. else
Anweisungen zu verwenden.function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}
$r
; Verwenden Sie einfachecho
(entspricht$r.=
der Anzahl der Bytesecho
). 2. benutzter ternärer Operator (spart viele Zeichen). 3.$h
war nutzlos, da es gleich war$n
. 4. Sie musstenfloor
for nicht verwenden$x = floor($i%$e);
, da ein Modul für eine Ganzzahl nicht abgerundet werden muss.Python 2, 99
Druck Zeile für Zeile, wobei jede Zeile durch die Schaffung ob die Koordinaten Überprüfung
(i,j)
(zentrierte bei(0,0)
) genügtj==-i
,j==0
,j==i
, oder ohne, mit einem Hack der Mittellinie funktioniert.quelle
R
anstelle von.5
1 Byte speichern.CJam,
48 45 43 4138 BytesDas ist immer noch zu lang und ich mache immer noch ein paar überflüssige Dinge, aber hier ist:
Probieren Sie es hier online aus
quelle
SpecBAS - 117 Bytes
Dies druckt die Schrägstriche und Bindestriche in einer Schleife und setzt dann das "O" in der Mitte.
Ausgabe mit 1, 2 und 9
quelle
"-": NEXT y: PRINT AT s,s;"O"
um"-";AT s,s;"O": NEXT y
zwei Bytes zu speichern.JavaScript (ES6) 97
98Das scheint anders zu sein ...
quelle
OS / 2 Classic Rexx, 102 ... oder 14 für "Betrüger-Version"
Nehmen Sie die Zeilenvorschübe heraus, um Golf zu spielen.
Benennen Sie das Skript in der Cheater-Version mit einem beliebigen Quellcode unter 255 Zeichen (HPFS-Datenträger erforderlich):
EDIT: Nur um klar zu sein, die Version des Betrügers ist nicht dazu gedacht, zu zählen! Es ist nur dumm zu sein und zu zeigen, dass ein alter Hund immer noch Tricks machen kann. :)
zB Für echten Spaß und Spiel eine Implementierung von "Lambda" -Ausdrücken im Java-8 / C11-Stil auf einem Listeniterator. Nicht getestet, sollte aber auf einem IBM-Mainframe von ca. 1979 laufen. ;)
- Das Aufrufen von Code setzt natürlich voraus, dass Sie bereits einen Stamm (Array) erstellt haben.
quelle
Haskell,
1099896 BytesVielen Dank an Nimi und Mauris für ihre Hilfe!
Erläuterung:
Der Operator
#
gibt an, welches Zeichen bei den Koordinaten (i, j) angezeigt wird, wobei die Sonne bei (0,0) zentriert ist. Die Funktion erstelltf
die Ergebniszeichenfolge, indem#
sie alle Koordinatenpaare im Bereich von -n bis n abbildet.Verwendungszweck:
quelle
s
, zB0#0='O'
,0#_='-'
usw. und1<2
stattTrue
.map(i#)[-n..n]
um zwei Bytes zu sparen.R
177149 BytesMickey T. ist der Mann! Er hat mir geholfen, meine ursprünglich falsche Lösung zu reparieren und 28 Bytes zu sparen. Danke, Mickey!
Ungolfed + Erklärung:
Weitere Vorschläge sind willkommen!
quelle
scan
braucht der eigentlich nichtw=
. Es kann auch tiefer in die Befehle verschoben werden. Dasif
kann ditched werden , wenn man die Art und Weise ändern , die Matrix in ein paar Fällen behandelt wird. Anwenden diese bekomme ichm=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')
. Weiteres Golfen denk ich möglich.C #,
230226 BytesWie gewünscht, die ungolfed version: string ug (int n) {
Dies ist mein erster Beitrag, deshalb entschuldige ich mich, wenn ich etwas falsch gemacht habe. Kommentare und Korrekturen sind sehr willkommen.
quelle
s=2*n+1
eher alss=(n*2)+1
undw==s-h-1
eher alsw==(s-h)-1
wird dies ein wenig kürzer machen.Ruby:
9892 ZeichenProc, der einen String mit der Sonne zurückgibt.
Probelauf:
quelle
Rust, 215 Zeichen
Ich habe versucht, eine Methode zum Aufteilen von Zeichenfolgen zu verwenden (indem ich eine Zeichenfolge von
n-1
Leerzeichen erstellt und in und aus einem Index aufgeteilt habe):Aber das sind eigentlich 3 Zeichen länger.
Ungolfed-Code:
Der Teil, den ich mag, ist, wie ich ein paar Zeichen auf den Formatierungszeichenfolgen rasiere. Zum Beispiel,
ist äquivalent zu
da der "Auto-Inkrementierer" für die Position des Format-String-Arguments nicht durch die manuelle Angabe der Zahl beeinflusst wird und völlig unabhängig arbeitet.
quelle
Oktave 85
Bulding Matrizen wie immer =)
eye
ergibt eine Identitätsmatrix, der Rest ist meiner Meinung nach selbsterklärend.quelle
IDL 8,3, 135 Bytes
Keine Ahnung, ob man hier mehr Golf spielen kann ... Es ist sehr einfach. Zuerst erstellen wir ein
m x m
Array (m=2n+1
) von leeren Strings; Dann wir die Zeichen in Linien zeichnen (y=x
,y=-x
,y=n
undx=n
). Dann legen wir das O an der Stelle ab(n, n)
und drucken das Ganze, formatiert alsm
Zeichenketten der Länge 1 in jeder Zeile, so dass es keinen zusätzlichen Abstand zum Drucken des Arrays von Haus aus gibt.Prüfung:
quelle
Matlab,
9387 BytesLeider muss der Funktionsheader so groß sein ... Abgesehen davon denke ich, dass es ziemlich gut golfen ist. Ich frage mich, ob es mit einigen Syntaxunterschieden in Octave besser gehen könnte.
quelle
N=input('')
erstellen, um 2 Zeichen zu speichern. Ansonsten können Sie einfach schreiben,[E V D;H 79 H;D V E '']
um die gesamte Matrix in ein Zeichen-Array umzuwandeln, wodurch Sie ein oder zwei weitere Bytes sparen. (Ich habe gerade ein Octave-Programm mit einem etwas anderen Ansatz eingereicht, aber bevor ich deins gefunden habe =)Javascript ( ES7 Draft ) 115
quelle
Pyth - 52 Bytes
Das Schwierige war, herauszufinden, wie man die Schrägstriche für jede Seite vertauscht. Ich entschied mich dafür, ein Lambda zu definieren, das die zu verwendenden Symbole verwendet.
Kann wahrscheinlich mehr golfen werden, Erklärung folgt in Kürze.
Probieren Sie es hier online aus .
quelle
Perl, 94
Es gibt viele verschachtelte ternäre Operatoren, aber ich denke, der Code ist ziemlich einfach.
Probieren Sie es hier aus: ideone.com/E8MC1d
quelle
for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}
- Ein paar Verbesserungen: konvertiere inner for zu map und ändere $ y zu $ _; Inline($n=<>)
.C # - 291 (vollständiges Programm)
quelle
JavaScript (ES6),
139135140 + 1 Byte(+1 ist für
-p
Flag mit Node in der Konsole)Fest:
Verwendungszweck:
ungolfed:
quelle
(A=Array).from(A(m))
Python 3,
193186 BytesGolf gespielt
Ausgabe
Ungolfed
quelle
s=' ',b='\\',f='/',d='|',g='-'
ist sehr lang, daher sollten Sie es besser verschieben, indem Sie ess,b,f,d,g=" \/|-"
in die zweite Zeile einfügen." \/|-"
als einzelne Zeichenfolge, anstatt sie in einzelne Zeichen aufzuteilen. Sie können aus einer Zeichenfolge wie entpackenx,y,z="123"
, die machenx="1"
,y="2"
undz="3"
.CJam,
5955 BytesDies wird im jetzigen Zustand keine Preise gewinnen, aber ich war froh, dass es funktioniert hat!
Danke an Sp3000 für die Golftipps.
quelle
S
anstelle der'
Version für Leerzeichen verwenden und 2)'-A*'O'-A
Sie können dies'-A*_'O\
stattdessen tun, da das zweimalige Generieren lang istPython,
175 129 127125 BytesProbieren Sie es hier online aus .
quelle
Ruby - 130 Bytes
Verwendungszweck:
quelle
f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}
(WeiterePerl
8591908986BUngolfed:
quelle
Prolog, 219 Bytes
Nein, es ist keine Golfsprache. Aber ich denke, diese Seite braucht mehr Prolog.
Getestet mit
swipl
unter Linux. Rufen Sie wie folgt:swipl -s asciiSun.prolog
; Dann fragen Sie nach Ihrer gewünschten Sonnengröße:Ungolfed:
quelle
JavaScript (ES6),
142140134117 ByteVersuch es
quelle