:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
在线尝试!
说明
清醒的山羊
清醒的山羊可以装进绳子里
'' '' ")___(->o/___ \
并打开包装,稍后将对此进行说明。但是,单引号符号必须进行复制才能转义,因此字符串文字必须定义为(请注意,单引号符号与原始符号重复):
' '''' '''' ")___(->o/___ \'
为了节省字节,我们使用比字符串高一个代码点的字符来定义字符串,从而避免重复。字符串文字变为
'!!((!((!!#*```).?p0```!!!]'
在代码末尾,我们将减去1并转换为char。(我们现在可以在字符串文字之后立即执行此操作;但是将其保留在末尾将保存另一个单引号重复项,正如我们将看到的那样)。
为了说明如何解压缩字符串,我们将使用原始字符(在代码末尾加上1来产生),因此更易于理解。我们首先重塑琴弦
'' '' ")___(->o/___ \
进入8行2D char数组,按列优先顺序排列(从下到上)。这会自动用char 0填充最后一列(在代码末尾,减去1会将其转换为数字-1,转换为char会再次给出char 0)。字符0显示为空格。因此,我们有效地填充了空格。重塑的结果是
>
"o\
')/
'__
__
'__
'(
-
现在,我们垂直翻转:
-
'(
'__
__
'__
')/
"o\
>
然后转置并再次垂直翻转以产生清醒的山羊:
\
___/o>
-(___)"
'' ''
因为原始打包的字符串是“反向”,所以需要两个翻转操作。这是为了利用以下事实:代表山羊的实际2D字符数组在其第一行中有6个初始空格,当字符串重新成形为8行2D数组时,这些空格会通过填充自动填充。但是填充是在最后一列(不是行)的末尾(不是开始)完成的,因此是翻转和转置。
睡山羊
睡眠山羊从清醒山羊由字符音译产生o
,'
,-
成-
,`
,,
分别。其实,这是因为一个码点,上述改造,我们音译字符p
,(
,'
为.
,a
,-
,这又不必重复单引号符号拯救我们。这就是在程序结束时保留减一运算的原因。
代码结构
- 生成一个清醒的山羊
N
时间,使代码点增加1。
- 将最后一只山羊变成沉睡的山羊。
- 水平连接所有山羊。减去1以编码点并转换为char。
注释代码
: % (Step 1) Implicitly input N. Push range [1 2 ... N]
" % For each (i.e. repeat N times)
'!!((!((!!#*```).?p0```!!!]' % Push this string. Quotes are escaped by duplicating
8e % Reshape into an 8-row 2D array of char, in
% column-major order, padding last column with
% char 0
P % Flip vertically
!P % Transpose and flip vertically
] % End
'p(.' % (Step 2) Push this string: source for transliteration
'.a-' % Push this string: target for transliteration
XE % Transliterate. Transforms last goat into sleeping
&h % (Step 3) Horizontally concat all 2D char arrays
qc % Subtract 1 and convert to char. 0 becomes −1, which
% is converted to char 0, which is displayed as a space
% Implicitly display