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个部分。我将首先描述第二部分(第二行),因为它最容易解释。
画太阳
绘制太阳的命令是:
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
要正确填充太阳,请遵循以下说明:
- 如果
n = 0
,那么0
,1
和3
(所有的数字)应该被替换
- 如果
n = 1
,1
则应替换为
,其他数字替换为*
- 如果
n = 2
,那么0
,1
和3
(所有的数字)应该被替换*
- 如果
n = 3
,3
则应替换为
,其他数字替换为*
- 假如
n = 4
,然后0
,1
和3
(所有数字)应改为
(像n = 0
)
由此,我们可以推断出所需的替换是:
- 用
(第一次替换)替换一些数字
- 将所有其他数字替换为
*
(第二个替换)
请注意,“某些数字”可能表示“无数字”(n = 2
例如)。如果所有数字均已被第一个替换字符替代(n = 0
例如),则“所有其他数字”也可以表示“无数字” 。
所述第二取代可以容易地写入11字节:
:%s/\d/*/g<CR>
第一次替换取决于n
,因此首先我们必须计算要替换的数字。如果替换的字符存储在寄存器中a
,则替换命令也将写入11个字节:
:%s/<C-r>a/ /g<CR>
<C-r>a
a
键入命令时,将被寄存器的内容替换。
a
按照前面的说明,要计算的值,算法为(伪代码):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
使用string的原因是,当时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