MATL、56 53バイト
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
オンラインでお試しください!
説明
目がさめているヤギ
覚醒したヤギはひもに詰めることができます
'' '' ")___(->o/___ \
すぐに説明するように解凍します。ただし、シングルクォート記号はエスケープするために複製する必要があるため、文字列リテラルを次のように定義する必要があります(囲むシングルクォート記号と元の記号の複製に注意してください)。
' '''' '''' ")___(->o/___ \'
バイトを節約するために、コードポイントの1つ上の文字を使用して文字列を定義し、重複を避けます。文字列リテラルは
'!!((!((!!#*```).?p0```!!!]'
コードの最後で、1を減算してcharに変換します。(文字列リテラルの直後にできますが、最後に残しておくと、後で説明するように、単一引用符の重複が保存されます)。
文字列がどのように展開されるかを説明するために、元の文字(1を差し引くことでコードの最後に生成される)を使用するため、説明を読みやすくします。最初に文字列を変形します
'' '' ")___(->o/___ \
列優先順(下、次に横)の8行の2D char配列に変換します。これにより、最後の列に自動的にchar 0が埋め込まれます(コードの最後で、1を引くと-1に変換され、charに変換されて再びchar 0になります)。Char 0はスペースとして表示されます。事実上、スペースでパディングしています。再形成の結果は
>
"o\
')/
'__
__
'__
'(
-
垂直に反転します:
-
'(
'__
__
'__
')/
"o\
>
そして、再び転置して垂直に反転し、覚醒したヤギを生成します。
\
___/o>
-(___)"
'' ''
元のパックされた文字列は「逆順」であるため、2つのフリップ操作が必要です。これは、ヤギを表す実際の2D char配列の最初の行に6つの初期スペースがあり、文字列が8行の2D配列に再形成されると、パディングによって自動的に埋められるという事実を利用するためです。ただし、パディングは最後の列(行ではなく)の最後(行ではなく)で行われるため、フリップと転置が行われます。
眠っているヤギ
睡眠ヤギ翻字文字によって覚醒したヤギから生成されるo
、'
、-
に-
、`
、,
それぞれ。実際には、理由は1コード・ポイント・上記の変換を、私たちは文字を翻字p
、(
、'
へ.
、a
、-
、再び単一引用符記号を複製することから私たちを保存します。これが、プログラムの終わりまで減算1操作が残された理由です。
コード構造
- 目覚めたヤギの
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