MATL , 56 53 bytes
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Pruébalo en línea!
Explicación
Cabra despierta
La cabra despierta se puede meter en la cuerda.
'' '' ")___(->o/___ \
y desempaquetado como se explicará en breve. Sin embargo, los símbolos de comillas simples tendrían que duplicarse para escapar de ellos, por lo que el literal de cadena tendría que definirse como (tenga en cuenta los símbolos de comillas simples y la duplicación de los originales):
' '''' '''' ")___(->o/___ \'
Para guardar bytes, definimos la cadena usando caracteres un punto de código por encima de eso, evitando así la duplicación. La cadena literal se convierte en
'!!((!((!!#*```).?p0```!!!]'
Al final del código restaremos 1 y convertiremos a char. (Podríamos hacerlo ahora, justo después del literal de cadena; pero dejarlo para el final ahorrará otra duplicación de comillas simples, como veremos).
Para explicar cómo se desempaqueta la cadena, trabajaremos con los caracteres originales (que se producen al final del código al sustraer 1), por lo que la explicación es más fácil de seguir. Primero reformamos la cuerda
'' '' ")___(->o/___ \
en una matriz de caracteres 2D de 8 filas, en orden de columna mayor (abajo, luego a través). Esto rellena automáticamente la última columna con char 0 (al final del código, restando 1 lo transformará en el número −1, que convertido a char devuelve char 0). Char 0 se muestra como un espacio. Así que efectivamente estamos rellenando con espacios. El resultado de la remodelación es
>
"o\
')/
'__
__
'__
'(
-
Ahora volteamos verticalmente:
-
'(
'__
__
'__
')/
"o\
>
y luego transponer y voltear verticalmente de nuevo para producir la cabra despierta:
\
___/o>
-(___)"
'' ''
Las dos operaciones de volteo son necesarias porque la cadena empaquetada original está "en reversa". Esto es para explotar el hecho de que la matriz de caracteres 2D real que representa a la cabra tiene 6 espacios iniciales en su primera fila, que se rellenan automáticamente al rellenar cuando la cadena se forma en una matriz 2D de 8 filas. Pero el relleno se realiza al final (no al principio) de la última columna (no fila), por lo tanto, se voltea y se transpone.
Cabra dormida
Una cabra dormir se genera a partir de una cabra despierto por caracteres transliteración o
, '
, -
en -
, `
, ,
respectivamente. En realidad, a causa de la transformación de un código de punto anterior, transliteramos caracteres p
, (
, '
en .
, a
,-
, que a su vez nos salva de tener que duplicar el símbolo con una comilla simple. Esta es la razón por la cual la operación de restar uno se dejó para el final del programa.
Estructura de código
- Genere un
N
tiempo de cabra despierto , trabajando con puntos de código aumentados en 1.
- Transforma la última cabra en una cabra dormida.
- Concatenar todas las cabras horizontalmente. Resta 1 a los puntos de código y lanza a 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