MATL , 56 53 байти
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Спробуйте в Інтернеті!
Пояснення
Прокинься козел
Козла, що не буває, можна упакувати в струну
'' '' ")___(->o/___ \
і розпаковано, як буде пояснено найближчим часом. Однак символи з однією цитатою потрібно дублювати , щоб уникнути їх, тому літеральний рядок повинен бути визначений як (зверніть увагу на додані символи з одною цитатами та дублювання оригінальних):
' '''' '''' ")___(->o/___ \'
Для збереження байтів ми визначаємо рядок, використовуючи символи, на одну кодову точку вище , тим самим уникаючи дублювання. Буквальний рядок стає
'!!((!((!!#*```).?p0```!!!]'
В кінці коду віднімемо 1 і перетворимо на char. (Ми могли б зробити це зараз, відразу після буквеного рядка; але залишивши його для кінця, ми збережемо ще одне дублювання з одною цитатою, як ми побачимо).
Щоб пояснити, як розпаковується рядок, ми будемо працювати з оригінальними символами (які створюються в кінці коду, віднімаючи 1), тому пояснення простіше прослідкувати. Спочатку переробляємо рядок
'' '' ")___(->o/___ \
у 8-рядовий двовимірний масив знаків у порядку основного стовпця (вниз, потім поперек). Це автоматично прошиває останній стовпчик із символом char 0 (наприкінці коду віднімання 1 перетворить його на число −1, яке перетворене в char дає знову char 0). Char 0 відображається як пробіл. Настільки ефективно ми прокладаємо пробіли. Результатом переформатування є
>
"o\
')/
'__
__
'__
'(
-
Тепер перевертаємо вертикально:
-
'(
'__
__
'__
')/
"o\
>
а потім знову перенесіть і переверніть вертикально, щоб створити неспану козу:
\
___/o>
-(___)"
'' ''
Дві операції фліп потрібні, оскільки початкова упакована рядок "знаходиться в зворотному порядку". Цим потрібно скористатися тим фактом, що фактичний 2D-матричний діапазон, що представляє козу, має в своєму першому рядку 6 початкових пробілів, які автоматично заповнюються за допомогою прокладки, коли рядок переробляється в 8-рядовий 2D-масив. Але прокладка робиться в кінці (не на початку) останнього стовпця (а не ряду), звідси перевертається і переноситься.
Спляча коза
Сплячий козел генерується з активного козла з допомогою транслітерації символів o
, '
, -
в -
, `
, ,
відповідно. На насправді, з - за один-код-точка-вище трансформації в, ми транслітерації символи p
, (
, '
в .
, a
,-
, що знову рятує нас від необхідності дублювати символ одинарної лапки. Ось чому операція віднімання-одна була залишена на кінець програми.
Структура коду
- Створіть час неспання кози
N
, працюючи з кодовими точками, збільшеними на 1.
- Перетворіть останню козу в сплячу козу.
- З’єднайте всіх козлів горизонтально. Відніміть 1 до кодових точок і додайте до символів.
Коментований код
: % (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