MATL , 56 53 byte
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Cobalah online!
Penjelasan
Bangunlah kambing
Kambing yang terjaga dapat dimasukkan ke dalam tali
'' '' ")___(->o/___ \
dan membongkar seperti yang akan dijelaskan segera. Namun, simbol tanda kutip tunggal perlu diduplikasi untuk menghindarinya, sehingga string literal harus didefinisikan sebagai (perhatikan simbol tanda kutip tunggal terlampir dan duplikasi yang asli):
' '''' '''' ")___(->o/___ \'
Untuk menyimpan byte, kita mendefinisikan string menggunakan karakter satu titik kode di atas itu, sehingga menghindari duplikasi. String literal menjadi
'!!((!((!!#*```).?p0```!!!]'
Di akhir kode kita akan mengurangi 1 dan mengonversi menjadi char. (Kita bisa melakukannya sekarang, tepat setelah string literal; tetapi membiarkannya sampai akhir akan menyimpan duplikasi kutipan tunggal, seperti yang akan kita lihat).
Untuk menjelaskan bagaimana string diurai, kami akan bekerja dengan karakter asli (yang diproduksi di akhir kode dengan subtak 1), sehingga penjelasannya lebih mudah diikuti. Kami pertama-tama membentuk kembali string
'' '' ")___(->o/___ \
menjadi array char 2D 8-baris, dalam urutan kolom-utama (turun, lalu lintas). Ini secara otomatis mengisi kolom terakhir dengan char 0 (di akhir kode, mengurangi 1 akan mengubahnya menjadi angka −1, yang dikonversi menjadi char memberi lagi char 0). Karakter 0 ditampilkan sebagai spasi. Jadi secara efektif kita dipenuhi ruang. Hasil pembentukan kembali adalah
>
"o\
')/
'__
__
'__
'(
-
Kami sekarang membalik secara vertikal:
-
'(
'__
__
'__
')/
"o\
>
dan kemudian transpos dan balik vertikal lagi untuk menghasilkan kambing yang terjaga:
\
___/o>
-(___)"
'' ''
Dua operasi flip diperlukan karena string yang dikemas asli "terbalik". Ini adalah untuk mengeksploitasi fakta bahwa array char 2D aktual yang mewakili kambing memiliki 6 spasi awal di baris pertama, yang secara otomatis diisi dengan padding ketika string dibentuk kembali menjadi array 2D 8-baris. Tetapi padding dilakukan di akhir (bukan awal) dari kolom terakhir (bukan baris), maka membalik dan transpos.
Kambing tidur
Seekor kambing tidur yang dihasilkan dari kambing terjaga dengan transliterasi karakter o
, '
, -
menjadi -
, `
, ,
masing-masing. Sebenarnya, karena transformasi satu-kode-point-atas, kita transliterasi karakter p
, (
, '
menjadi .
, a
, -
, yang lagi-lagi menyelamatkan kita dari keharusan untuk menduplikasi simbol single-quote. Inilah sebabnya mengapa operasi kurangi-satu dibiarkan pada akhir program.
Struktur kode
- Hasilkan kambing yang terjaga
N
kali, bekerja dengan poin kode meningkat sebesar 1.
- Ubah kambing terakhir menjadi kambing tidur.
- Gabungkan semua kambing secara horizontal. Kurangi 1 untuk kode poin dan berikan ke char.
Kode yang dikomentari
: % (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