VI, 108 Bytes
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>
<CR>
ist der Enter
Hub, <C-?>
entspricht Control + ?
, und <Esc>
zu Escape
offensichtlich. Diese zählen jeweils 1 Byte (siehe Meta ). Die Zeilenumbrüche in der Lösung dienen der Lesbarkeit. Nur <CR>
stellt echte Enter
Schlaganfällen.
Eingang
Die Eingabedatei sollte nur 1 Zeichen enthalten n
.
Starten
VI sollte gestartet werden wie:
vi -u NONE input
Erklärungen
Die Lösung besteht aus 3 Teilen. Ich werde zuerst den 2. Teil (2. Zeile) beschreiben, da dies am einfachsten zu erklären ist.
Die Sonne zeichnen
Der Befehl zum Zeichnen der Sonne lautet:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Die Sonne muss mit gezogen werden
, *
, 0
, 1
und 3
, wie folgt aus :
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Eine Symmetrie hätte dazu beigetragen, die Bytegröße dieses Teils zu reduzieren, aber das ist nicht so wichtig. Ich werde die ganze Zeile nicht erklären, aber das Muster *****
wird verwendet, um die letzte Zeile auf einfache Weise zu generieren, und das Muster **1110333**
wurde als Referenz genommen, um die 3 anderen Zeilen zu generieren 0
, die 1
und enthalten 3
.
Es ist wichtig 0
, 1
und 3
für Sonne Teile zu verwenden, die gefüllt werden können (siehe nächste Erläuterungen). Das Zeichnen dieser Sonne dauert 55 Bytes und kann wahrscheinlich mit ein paar Tricks gespielt werden.
Füllen Sie die Sonne nach n
Um die Sonne richtig auszufüllen, müssen folgende Anweisungen befolgt werden:
- wenn
n = 0
, dann 0
, 1
und 3
(alle Ziffern) sollte ersetzt werden durch
- Wenn
n = 1
, dann 1
sollten
die anderen Ziffern durch ersetzt werden*
- wenn
n = 2
, dann 0
, 1
und 3
(alle Ziffern) sollte ersetzt werden durch*
- Wenn
n = 3
, dann 3
sollten
die anderen Ziffern durch ersetzt werden*
- wenn
n = 4
, dann 0
, 1
und 3
(alle Ziffern) sollte ersetzt werden
(wie n = 0
)
Daraus können wir schließen, dass folgende Substitutionen erforderlich sind:
- ersetze einige Ziffern durch
( erste Ersetzung )
- Ersetzen Sie alle anderen Ziffern durch
*
( zweite Ersetzung )
Beachten Sie, dass "einige Ziffern" beispielsweise "keine Ziffern" bedeuten können n = 2
. Und "alle anderen Ziffern" können auch "keine Ziffern" darstellen, wenn ( n = 0
zum Beispiel) bereits alle Ziffern durch die erste Ersetzung ersetzt wurden .
Die zweite Ersetzung kann leicht in 11 Bytes geschrieben werden :
:%s/\d/*/g<CR>
Die erste Ersetzung hängt davon ab n
, also müssen wir zuerst berechnen, welche Ziffern ersetzt werden sollen. Wenn ersetzte Zeichen im Register gespeichert sind a
, wird der Ersetzungsbefehl auch in 11 Bytes geschrieben :
:%s/<C-r>a/ /g<CR>
<C-r>a
wird durch den Inhalt des Registers ersetzt, a
wenn der Befehl eingegeben wird.
Zur Berechnung des Werts von a
lautet der Algorithmus gemäß den vorherigen Anweisungen (in Pseudocode):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
string wird verwendet, weil wenn n = 2
keine Ziffern durch Leerzeichen ersetzt werden. Jede Zeichenfolge, die nicht die Sonne ist, kann hier verwendet werden, solange die erste Ersetzung nichts bewirkt.
Dies könnte in 31 Bytes geschrieben werden :
D # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
:let@a= # define register "a content
@"%2 # if (n % 2 != 0)
? # then
@" # n
: # else
@"%4 # if (n % 4 != 0)
? # then
"X" # "X"
: # else
"\\d" # "\\d"
<CR> # calculate "a
Lösung
Ordnen Sie all diese Teile in der richtigen Reihenfolge an und Sie haben die Lösung:
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR> # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR> # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR> # replace the remaining digits with stars