MATL , 56 53 octets
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Essayez-le en ligne!
Explication
Éveiller la chèvre
La chèvre éveillée peut être emballée dans la ficelle
'' '' ")___(->o/___ \
et déballé comme cela sera expliqué sous peu. Toutefois, les symboles entre guillemets devraient être dupliqués pour pouvoir y échapper. Le littéral chaîne doit donc être défini comme suit (notez les symboles entre guillemets et la duplication des symboles originaux):
' '''' '''' ")___(->o/___ \'
Pour sauvegarder des octets, nous définissons la chaîne à l'aide de caractères un point de code au - dessus , évitant ainsi les doublons. Le littéral de chaîne devient
'!!((!((!!#*```).?p0```!!!]'
À la fin du code, nous allons soustraire 1 et convertir en caractères. (Nous pourrions le faire maintenant, juste après le littéral chaîne; mais le laisser à la fin sauvera une autre duplication entre guillemets, comme nous le verrons).
Pour expliquer comment la chaîne est décompactée, nous allons travailler avec les caractères originaux (produits à la fin du code en sous-traitant 1), ainsi l'explication est plus facile à suivre. Nous remodelons d'abord la ficelle
'' '' ")___(->o/___ \
dans un tableau de caractères 2D à 8 lignes, dans l'ordre des colonnes (bas, puis à travers). Ceci remplit automatiquement la dernière colonne avec le caractère 0 (à la fin du code, soustraire 1 le transformera en nombre -1, ce qui converti en caractère donnera à nouveau le caractère 0). Char 0 est affiché comme un espace. Donc, effectivement, nous remplissons d'espaces. Le résultat du remodelage est
>
"o\
')/
'__
__
'__
'(
-
Nous retournons maintenant verticalement:
-
'(
'__
__
'__
')/
"o\
>
puis transposez et retournez verticalement pour produire le bouc éveillé:
\
___/o>
-(___)"
'' ''
Les deux opérations de retournement sont nécessaires car la chaîne compressée d'origine est "en sens inverse". Cela tient compte du fait que le tableau de caractères 2D représentant la chèvre a 6 espaces initiaux dans sa première ligne, qui sont automatiquement remplis par un remplissage lorsque la chaîne est remodelée dans un tableau 2D à 8 lignes. Mais le remplissage est fait à la fin (pas au début) de la dernière colonne (pas à la ligne), d’où les retournements et la transposition.
Chèvre endormie
Une chèvre de couchage est généré à partir d' une chèvre éveillé par les caractères translittération o
, '
, -
en -
, `
, ,
respectivement. En fait, à cause de l'un code point ci - dessus transformation, nous Translittérer caractères p
, (
, '
en .
, a
,-
, qui encore une fois nous évite d'avoir à dupliquer le symbole guillemet simple. C’est pourquoi l’opération soustraction 1 a été laissée à la fin du programme.
Structure du code
- Générer une chèvre éveillée
N
, en travaillant avec des points de code augmentés de 1.
- Transformez la dernière chèvre en une chèvre endormie.
- Concaténer toutes les chèvres horizontalement. Soustrayez 1 aux points de code et transformez-les en caractères.
Code commenté
: % (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