MATL , 56 53 bajtów
:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc
Wypróbuj online!
Wyjaśnienie
Przebudźcie się koza
Przebudzoną kozę można zapakować w sznurek
'' '' ")___(->o/___ \
i rozpakowane, co zostanie wkrótce wyjaśnione. Jednak symbole pojedynczego cudzysłowu musiałyby zostać zduplikowane , aby je uniknąć, więc literał ciąg musiałby zostać zdefiniowany jako (zwróć uwagę na otaczające symbole pojedynczego cudzysłowu i powielenie oryginalnych):
' '''' '''' ")___(->o/___ \'
Aby zapisać bajty, definiujemy ciąg za pomocą znaków o jeden punkt kodowy powyżej , unikając w ten sposób powielania. Literał łańcuchowy staje się
'!!((!((!!#*```).?p0```!!!]'
Na końcu kodu odejmiemy 1 i przekonwertujemy na char. (Moglibyśmy to zrobić teraz, zaraz po literałach ciągu; ale pozostawienie go na koniec uratuje kolejne powielanie pojedynczych cudzysłowów, jak zobaczymy).
Aby wyjaśnić, w jaki sposób ciąg jest rozpakowywany, będziemy pracować z oryginalnymi znakami (które są tworzone na końcu kodu przez odjęcie 1), więc wyjaśnienie jest łatwiejsze do naśladowania. Najpierw przekształcamy ciąg
'' '' ")___(->o/___ \
w 8-rzędową tablicę znaków 2D, w porządku według kolumny (w dół, potem w poprzek). To automatycznie uzupełnia ostatnią kolumnę char 0 (na końcu kodu odejmowanie 1 przekształci ją w liczbę -1, co po konwersji na char daje ponownie char 0). Char 0 jest wyświetlany jako spacja. Tak skutecznie wypełniamy spacjami. Rezultatem przekształcenia jest
>
"o\
')/
'__
__
'__
'(
-
Teraz odwracamy w pionie:
-
'(
'__
__
'__
')/
"o\
>
a następnie transponuj i ponownie obróć w pionie, aby obudzić kozę:
\
___/o>
-(___)"
'' ''
Dwie operacje odwracania są potrzebne, ponieważ oryginalny spakowany ciąg znaków jest „odwrócony”. Ma to na celu wykorzystanie faktu, że rzeczywista tablica znaków 2D reprezentująca kozę ma 6 początkowych spacji w pierwszym rzędzie, które są automatycznie wypełniane przez wypełnienie, gdy łańcuch jest przekształcany w 8-rzędową tablicę 2D. Ale wypełnianie odbywa się na końcu (nie na początku) ostatniej kolumny (nie w wierszu), stąd odwrócenie i transpozycja.
Śpiąca koza
Śpiąca koza jest generowany z obudzić kozła przez transliteracji znaków o
, '
, -
na -
, `
, ,
odpowiednio. W rzeczywistości, ze względu na transformację jednego kodu punktowego powyżej, transliteracji znaków p
, (
, '
na .
, a
, -
, który ponownie ratuje nas od konieczności powielania symbolu apostrofu. Dlatego na końcu programu pozostawiono operację odejmowania-jeden.
Struktura kodu
- Generuj
N
czasy przebudzenia kozy , pracując z punktami kodowymi zwiększonymi o 1.
- Przekształć ostatnią kozę w śpiącą kozę.
- Połącz wszystkie kozy poziomo. Odejmij 1 od punktów kodowych i rzutuj na char.
Skomentowany kod
: % (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