MATL , 56 53 byte
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Provalo online!
Spiegazione
Capra sveglia
La capra sveglia può essere inserita nella corda
'' '' ")___(->o/___ \
e spacchettato come verrà spiegato a breve. Tuttavia, i simboli a virgoletta singola dovrebbero essere duplicati per sfuggirli, quindi il valore letterale stringa dovrebbe essere definito come (notare i simboli racchiusi tra virgolette singole e la duplicazione di quelli originali):
' '''' '''' ")___(->o/___ \'
Per salvare i byte, definiamo la stringa usando caratteri un punto di codice sopra quello, evitando così la duplicazione. La stringa letterale diventa
'!!((!((!!#*```).?p0```!!!]'
Alla fine del codice sottrarremo 1 e convertiremo in carattere. (Potremmo farlo ora, subito dopo la stringa letterale; ma lasciarla per la fine salverà un'altra duplicazione a virgoletta singola, come vedremo).
Per spiegare come la stringa è spacchettata, lavoreremo con i caratteri originali (che vengono prodotti alla fine del codice sottraendo 1), quindi la spiegazione è più facile da seguire. Per prima cosa rimodelliamo la stringa
'' '' ")___(->o/___ \
in un array di caratteri 2D a 8 righe, in ordine di colonna maggiore (verso il basso, quindi attraverso). Questo riempie automaticamente l'ultima colonna con char 0 (alla fine del codice, sottraendo 1 la trasformerà in numero −1, che convertita in char restituisce char 0). Il carattere 0 viene visualizzato come spazio. In modo efficace stiamo riempiendo di spazi. Il risultato del rimodellamento è
>
"o\
')/
'__
__
'__
'(
-
Ora giriamo verticalmente:
-
'(
'__
__
'__
')/
"o\
>
e quindi trasporre e capovolgere di nuovo verticalmente per produrre la capra sveglia:
\
___/o>
-(___)"
'' ''
Le due operazioni di inversione sono necessarie perché la stringa imballata originale è "al contrario". Questo per sfruttare il fatto che l'attuale array di caratteri 2D che rappresenta la capra ha 6 spazi iniziali nella sua prima riga, che vengono riempiti automaticamente con il riempimento quando la stringa viene rimodellata in un array 2D a 8 righe. Ma il padding viene eseguito alla fine (non all'inizio) dell'ultima colonna (non riga), quindi i lanci e la trasposizione.
Capra addormentata
Una capra a pelo è generato da una capra sveglio caratteri traslitterazione o
, '
, -
in -
, `
, ,
rispettivamente. In realtà, a causa della trasformazione di un codice-punto-sopra, traslitterare caratteri p
, (
, '
in .
, a
, -
, che ci salva ancora una volta di dover duplicare il simbolo singolo-preventivo. Questo è il motivo per cui l'operazione di sottrazione 1 è stata lasciata per la fine del programma.
Struttura del codice
- Genera
N
tempi di capra svegli , lavorando con punti di codice aumentati di 1.
- Trasforma l'ultima capra in una capra dormiente.
- Concatena tutte le capre in orizzontale. Sottrai 1 per codificare i punti e il cast per char.
Codice commentato
: % (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