VI、108バイト
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>
あるEnter
ストローク、<C-?>
対応にはControl + ?
、と<Esc>
にEscape
明らかに。これらはそれぞれ1バイトとしてカウントされます(metaを参照)。ソリューションの改行は読みやすさのためです。<CR>
実際のEnter
ストロークのみを表します。
入力
入力ファイルには、を表す1文字のみを含める必要がありますn
。
打ち上げ
VIは次のように起動する必要があります。
vi -u NONE input
説明
ソリューションには3つの部分があります。説明が最も簡単なので、最初に2番目の部分(2行目)について説明します。
太陽を描く
太陽を描画するコマンドは次のとおりです。
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
太陽がで描画されなければならない
、*
、0
、1
そして3
、このように:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
対称性は、この部分のバイトサイズを減らすのに役立ちますが、それほど重要ではありません。完全な行については説明しませんが、パターン*****
は最後の行を簡単に生成するために使用され、パターンは、および**1110333**
を含む他の3行を生成するための参照として使用されています。0
1
3
使用することが重要で0
、1
かつ3
充填することができる太陽の部品のために(次の説明を参照してください)。この太陽を描くには55バイトかかり、おそらくいくつかのトリックでゴルフをすることができます。
に従って太陽を満たす n
太陽を正しく満たすための手順は次のとおりです。
- if
n = 0
、then 0
、1
および3
(すべての数字)は、
- の場合
n = 1
、1
で置き換える必要が
あり、他の数字で*
- if
n = 2
、then 0
、1
および3
(すべての数字)は、*
- の場合
n = 3
、3
で置き換える必要が
あり、他の数字で*
- if
n = 4
、then 0
、1
および3
(すべての数字)を
(などn = 0
)に置き換える必要がある場合
それから、必要な置換は次のように推測できます。
- いくつかの数字を
(最初の置換)で置き換えます
- 他のすべての数字を
*
(2番目の置換)に置き換えます
「一部の数字」は「数字なし」(n = 2
たとえば)を意味する場合があることに注意してください。また、「他のすべての数字」は、すべての数字がすでに最初の置換(n = 0
たとえば)で置き換えられている場合、「数字なし」を表すこともできます。
第2の置換は容易に書くことができる11バイト。
:%s/\d/*/g<CR>
最初の置換が依存するn
ので、最初に我々は数字を交換しようとしているものを計算する必要があり、。置き換えられた文字がregister a
に格納されている場合、置換コマンドも11バイトで書き込まれます。
:%s/<C-r>a/ /g<CR>
<C-r>a
a
コマンドを入力すると、registerの内容に置き換えられます。
の値を計算するためにa
、前の指示に従って、アルゴリズムは(擬似コードで)です:
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
が使用されるのはn = 2
、数字がスペースに置き換えられないためです。最初の置換が何もしない限り、太陽ではない任意の文字列をここで使用できます。
これは31バイトで書くことができます:
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
溶液
これらの部品をすべて正しい順序で配置すると、解決策が得られます。
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