MATL , 56 53 bytes
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Experimente online!
Explicação
Cabra acordada
A cabra acordada pode ser empacotada na corda
'' '' ")___(->o/___ \
e descompactado como será explicado em breve. No entanto, os símbolos de aspas simples precisariam ser duplicados para escapar deles, portanto a literal da cadeia de caracteres teria que ser definida como (observe os símbolos de aspas simples e a duplicação dos originais):
' '''' '''' ")___(->o/___ \'
Para salvar bytes, definimos a string usando caracteres um ponto de código acima , evitando assim a duplicação. A string literal se torna
'!!((!((!!#*```).?p0```!!!]'
No final do código, subtrairemos 1 e converteremos em char. (Poderíamos fazê-lo agora, logo após a string literal; mas deixá-la para o final economizará outra duplicação de aspas simples, como veremos).
Para explicar como a string é descompactada, trabalharemos com os caracteres originais (que são produzidos no final do código com a subtilação de 1), para que a explicação seja mais fácil de seguir. Primeiro remodelamos a string
'' '' ")___(->o/___ \
em um array de caracteres 2D de 8 linhas, na ordem principal da coluna (para baixo e depois para o outro lado). Isso preenche automaticamente a última coluna com o caractere 0 (no final do código, subtrair 1 o transformará em número -1, que convertido em char retorna novamente o caractere 0). O caractere 0 é exibido como um espaço. Tão efetivamente estamos preenchendo espaços. O resultado da remodelagem é
>
"o\
')/
'__
__
'__
'(
-
Agora, alternamos verticalmente:
-
'(
'__
__
'__
')/
"o\
>
e depois transponha e vire verticalmente novamente para produzir a cabra acordada:
\
___/o>
-(___)"
'' ''
As duas operações de inversão são necessárias porque a sequência empacotada original é "ao contrário". Isso é para explorar o fato de que a matriz de caracteres 2D real que representa a cabra possui 6 espaços iniciais em sua primeira linha, que são preenchidos automaticamente por preenchimento quando a string é remodelada em uma matriz 2D de 8 linhas. Mas o preenchimento é feito no final (não no início) da última coluna (não na linha), daí os movimentos e transposição.
Cabra adormecida
Uma cabra dormir é gerado a partir de uma cabra acordado por caracteres Transliterando o
, '
, -
em -
, `
, ,
respectivamente. Na verdade, por causa da transformação de um código de ponto-acima, transliterá caracteres p
, (
, '
para .
, a
, -
, que mais uma vez nos salva de ter que duplicar o símbolo aspas simples. É por isso que a operação subtrair uma foi deixada para o final do programa.
Estrutura de código
- Gere uma cabra acordada
N
, trabalhando com pontos de código aumentados em 1.
- Transforme a última cabra em uma cabra adormecida.
- Concatene todas as cabras horizontalmente. Subtrair 1 para codificar pontos e converter para char.
Código comentado
: % (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