ASCII Art of the Day #4 - Zodiac Signs
CJam, 296 284 272 265 264 bytes

"03½åÙªWË#å¥ÜZ2ò'ýðDc}¦Ð£RÞ5ä&lt;Üå§ÖÞYÏuäOe¤¶è2²|ZëßB«ô¬cm"257b2bSf*Qa/"®=&amp;ðS¢Òpût£Ð`ç«^º,[öÄ©3¸YÝæ[%$&gt;\D£(´õÓÆeUØRHáÄ¡ããîùK½ÊÆÇ:UBÍm¥·fèäBÓEwWOkQq×tÌVfè£g8·¨    q©ñäp-ÁgUÚ´Éõ'&gt;r    Ê#"256bDb"
.\"'()-/:\_|J"f=.+sSN+/l~\K&gt;+=


Try it online in the CJam interpreter.

Idea

We start by joining all twelve signs using the string &lt;SP&gt;&lt;LF&gt; as separator. We opt for the zodiac signs not to contain trailing spaces, so this allows to separate them easily.

The joined string is 542 bytes long. 236 of these bytes are spaces, which is almost half of them. We build an array that contains a 1 for every space and a 0 for every non-space. This way, encoding a space will only cost 1 bit.

Removing all spaces from the joined string, we are left with the characters &lt;LF&gt;."'()-/:J\_|. Assigning each of them a value (e.g., the index in this string) between 0 and 12

Finally, we decode the above base 2 and base 13 arrays as byte arrays.

In the final program, for a given input DD MM, we compute (int(MM) + (int(DD) &gt; 20)) % 12, reverse the above process to obtain the array of all zodiac signs and select the proper one.

Code

"03½åÙªWË#å¥ÜZ2ò'ýðDc}¦Ð£RÞ5ä&lt;Üå§ÖÞYÏuäOe¤¶è2²|ZëßB«ô¬cm"

        e# Push the encoded space positions.

257b2b  e# Convert from base 257 to base 2.
Sf*     e# Replace 1's with spaces and 0's with empty strings.
Qa/     e# Split at empty strings.

"®=&amp;ðS¢Òpût£Ð`ç«^º,[öÄ©3¸YÝæ[%$&gt;\D£(´õÓÆeUØRHáÄ¡ããîùK½ÊÆÇ:UBÍm¥·fèäBÓEwWOkQq×tÌVfè£g8·¨ q©ñäp-ÁgUÚ´Éõ'&gt;r    Ê#"

        e# Push the encoded non-space characters.

256bDb  e# Convert from base 256 to base 13.

"
.\"'()-/:\_|J"f=

        e# Replace each digit in base 13 by the corresponding character.

.+s     e# Interleave both arrays to create a string.
SN+/    e# Split at trailing spaces.
l~      e# Evaluate the input from STDIN.
\K&gt;+    e# Add 1 to the month if the day is larger than 20.
=       e# Retrieve the corresponding element from the array.