MATL , 56 53 байта
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Попробуйте онлайн!
объяснение
Бодрствующий козел
Бодрствующий козел может быть упакован в строку
'' '' ")___(->o/___ \
и распаковывается, как будет объяснено в ближайшее время. Однако символы одинарных кавычек должны быть продублированы , чтобы избежать их, поэтому строковый литерал должен быть определен как (обратите внимание на символы в одинарных кавычках и дублирование исходных символов):
' '''' '''' ")___(->o/___ \'
Чтобы сохранить байты, мы определяем строку, используя символы на одну кодовую точку выше, что позволяет избежать дублирования. Строковый литерал становится
'!!((!((!!#*```).?p0```!!!]'
В конце кода мы вычтем 1 и преобразуем в char. (Мы могли бы сделать это сейчас, сразу после строкового литерала; но оставив его на конец, мы увидим еще одно дублирование в одинарных кавычках).
Чтобы объяснить, как распаковывается строка, мы будем работать с оригинальными символами (которые создаются в конце кода с помощью подтактинга 1), поэтому объяснение легче следовать. Сначала мы изменим строку
'' '' ")___(->o/___ \
в 8-рядный двумерный массив символов, в главном порядке столбцов (вниз, затем поперек). Это автоматически дополняет последний столбец символом 0 (в конце кода вычитание 1 преобразует его в число -1, что при преобразовании в символ снова возвращает символ 0). Char 0 отображается как пробел. Так эффективно мы дополняем пробелы. Результатом изменения формы является
>
"o\
')/
'__
__
'__
'(
-
Теперь мы перевернем вертикально:
-
'(
'__
__
'__
')/
"o\
>
а затем переставить и перевернуть вертикально снова, чтобы получить бодрствующего козла:
\
___/o>
-(___)"
'' ''
Две операции переворота необходимы, потому что оригинальная упакованная строка «в обратном порядке». Это делается для того, чтобы использовать тот факт, что фактический двумерный массив символов, представляющий козу, имеет 6 начальных пробелов в первой строке, которые автоматически заполняются заполнением, когда строка преобразуется в 8-рядный двумерный массив. Но заполнение выполняется в конце (не в начале) последнего столбца (не в строке), поэтому происходит переворот и транспонирование.
Спящая коза
Спящий козел генерируется из активного козла с помощью транслитерации символов o
, '
, -
в -
, `
, ,
соответственно. На самом деле, из - за один-код-точечным выше преобразования в, мы транслитерации символов p
, (
, '
в .
, a
, -
, что опять избавляет нас от необходимости дублировать символ одинарной кавычки. Именно поэтому операция вычитания-1 была оставлена на конец программы.
Структура кода
- Создайте время активного козла
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