# Display “Happy Easter!”

 _     _                            _______                           _
| |   | |                          (_______)          _              | |
| |__ | | ____ ____  ____  _   _    _____   ____  ___| |_  ____  ____| |
|  __)| |/ _  |  _ \|  _ \| | | |  |  ___) / _  |/___)  _)/ _  )/ ___)_|
| |   | ( ( | | | | | | | | |_| |  | |____( ( | |___ | |_( (/ /| |    _
|_|   |_|\_||_| ||_/| ||_/ \__  |  |_______)_||_(___/ \___)____)_|   |_|
|_|   |_|   (____/


Remember, this is , so the code with the smallest amount of bytes wins. Good luck.

• @FryAmTheEggman this is quite different from the supposed duplicate Rickroll. Only a few symbols are used: |()/\_ which leads to completely different forms of compression. We have had similar ASCII art challenges before, but I'd like to see this question run to see if anyone takes advantage of the geometry. On the other hand it's not hugely remarkable, and you'r right, we don't need an Easter tag. – Level River St Mar 27 '16 at 1:06
• @FryAmTheEggman The best solution to a kolmogorov-complexity depends heavily on the structure of the output. This isn't text, so it isn't a dupe. – lirtosiast Mar 27 '16 at 1:08
• @lirtosiast The limited character set might matter, but I feel like this will almost certainly be dominated by the same techniques as in the text based questions. That's just my opinion though, the community gets to decide which of our views to enforce, after all. – FryAmTheEggman Mar 27 '16 at 1:25
• Possible duplicate of Minecraft Mirrored – Blue Mar 28 '16 at 9:13
• This is different, as there is no input, and so it is not necessary to take input and analyze it. – thepiercingarrow Mar 29 '16 at 15:59

# Bubblegum, 130 bytes

0000000: 758f b579 0530 18c4 7a4f a1d2 7fe5 8102  u..y.0..zO......
0000010: 5ae4 760f 5de8 91ee b3cc 8400 f523 2c3c  Z.v.]........#,<
0000020: 4656 0850 3f60 5b86 5fe4 8290 15a2 84a0  FV.P?[._.......
0000030: 5a61 4d0b b64f 2b35 c476 eb1e 844e c841  ZaM..O+5.v...N.A
0000040: 08c8 731d 1a02 ead0 1547 1d70 beba 9fd6  ..s......G.p....
0000050: 31bf 5fdb 6c72 1d7b 1051 ed8a a884 7c76  1._.lr.{.Q....|v
0000060: 0fa7 db91 1503 c43c 9b18 124f cdb3 4220  .......<...O..B
0000070: 9631 716b a71c 3bd6 ed8b 0b62 7ebd 55cf  .1qk..;....b~.U.
0000080: 7a07                                     z.


Try it online.

Compressed using zopfli --deflate --i10000.

• Isn't this 588 bytes? – thepiercingarrow Mar 27 '16 at 9:39
• @MarkWright What quartata posted is a hexdump of the actual code – Sp3000 Mar 27 '16 at 11:08

# JavaScript (ES6), 377373360359 345 bytes

Thanks to @Neil for a one byte savings, and to @edc65 for another 14!

Figured I'd give it a shot. Compresses common repeating patterns in the text.

_____ (5 underscores) is stored as _5

      (5 spaces) is stored as  5

 | | | | | (5 of the  | pattern) is stored as ~5

console.log( _ 5_ 28_7 27_
|~ 2~2 26(_7) 10_ 13~2
|~_2~2 _4 _4 2_4 2_ 3_ 4_5 3_4 2_3|~_ 2_4 2_4|~
| 2_2)|~/ _ ~ 2_ \\| 2_ \\|~3 ~ 2_3) / _ ~/_3) 2_)/ _ 2)/ _3)_|
|~ 2~ ( (~9_|~ ~2_4( (~2_3~2_( (/ /|~ 4_
|_| 2~_|\\_|2_|~|_/|~|_/ \\_2 ~ ~_7)_|2_(_3/ \\_3)_4)_| 2~_|
13~_| 2~_| 3(_4/.replace(/(.)(\d+)/g,(_,a,b)=>a.repeat(b)).replace(/~/g,' |'))

• Note the ES6 =>. – CalculatorFeline Mar 27 '16 at 3:43
• Seems like bytes might be saved by RLEing _s. – CalculatorFeline Mar 27 '16 at 4:14
• @CatsAreFluffy What do you mean by that? It compresses runs of _ with an _ followed by how many there are in the run – jrich Mar 27 '16 at 4:15
• Oops, I was still on the 377 byte version. – CalculatorFeline Mar 27 '16 at 5:07
• ~1 or _2 hardly seems worth it. (Why not use |2 for instance?) – Neil Mar 27 '16 at 20:12

# BinaryFuck, 565 378 bytes

This basically stores the characters used in the array, then navigates through the array, printing them accordingly. Currently quite long, will shorten it up.

1000010000000000000000110011110001010010000011011111010010110001011011000000010010111011001111011110010010010000010000010000000000000010000010000000000010000010000000000011011011011011011011011011001111010010000000000110001010000000000000000010000000000011011111010010001010001001001001010010001010000000000000000000000000000010001001001001010000000000000000000000000000000011011011011100010100011100100100100100010100011100100100100100100100100100100100100100100100100100100100100100100100100100100100100010100100100100100100100011100100100100100100100100100100100100100100100100100100100100100100100100100100100010100011100010010010010100011011011011011100010100011100010100100100011100010100011100010100100100100100100100100100100100100100100100100100100100100100100100100100100011011100010010010100100100100100100100010100011011100100100100100100100100100100010100011100100100100100100100100100100100100100100011100010100011100010010010010010100011011011011011100010100011100010010100100011100011100010100011100010100010100100100100011100010100100100100011100100010100100100100011100100010100011100100100010100011100100100100010100100100100100011100100100010100100100100011100100010100100100011011100010100011100010010100011100100010100100100100011100100010100100100100011011100010100011100010010010010010100011011011011011100010100100010100100010100011011011100010100011100011011100010010010100010100011100100011100010100100010100011100010010010100011011011011100010100100010100011100010010010100011011011011100010100011100010100011100010100011100010100100011100010100100010100100100010100011011100011011011100010010010100010100011100100011100011011100010010010010100100100010100011011100100010100010100011011011011011100010010010100010100011100100010010100011011011011011100010010010100010100100100010100011100011011100010010010010010100011011011011011100010100011100010100100100011100010100011011100010010100011011100010010100011100010100011100010100011100010100011100010100011100010100011100010100011100010100011100010100011100010010100011011100010100011100010100100011100010100011100010010100100100100011011011100010010100011011100010010100011100010100011100010010100100100011100011100010100011100010010100011011011100010010100011011100011100010010010100011011011100010010100010100011100010100100100100010100011100010010010010100011011011011011100010010100011011100010100100100011100010010100011011100010010010010100011011100011011100100010010100011011100010100011100100010010100011011011011100010010100010100011100100010010100011011011011100010010010100010010010100011011100100011100100011100010100100011100010010100100100100100100100010100011100011011100100010010100011011011100010010010100100100011011011011100010010010100010010010100011011100100100010100011100100100100010100011100011011100010100100100011100010010100011011100010010010010010100011011011011100100100100100100100100100100100100100100011100010010100011011100010100100100011100010010100011011100010100100100011011100010010010100100100100011011011011100


Here is the ungolfed code:

+>+++++[<[->>+<<]>>[-<<++>>]<-]<
[>>>+>+>++++>+>+++>+>+++<<<<<<<<<-]
>>+++[->+++++>+++<<]>>->---->>->+++++++++>---->++++++++++
<<<<.>.<.....>.<............................>.......<...........................>.<.>>>>.<<<<<.>.<.>...<.>.<.>..........................<<.>>>.......>.<<..........>.<..............<.>.<.>>>>>.<<<<<.>.<.>>..<.<.>.<.>.>....<.>....<..>....<..>.<...>.<....>.....<...>....<..>...<<.>.<.>>.<..>....<..>....<<.>.<.>>>>>.<<<<<.>..>..>.<<<.>.<.<<.>>>.>.<..<.>..>.<.>>>.<<<<.>..>.<.>>>.<<<<.>.<.>.<.>.<.>..<.>..>...>.<<.<<<.>>>.>.<..<.<<.>>>>...>.<<..>.>.<<<<<.>>>.>.<..>>.<<<<<.>>>.>...>.<.<<.>>>>>.<<<<<.>.<.>...<.>.<<.>>.<<.>>.<.>.<.>.<.>.<.>.<.>.<.>.<.>.<.>.<.>>.<<.>.<.>..<.>.<.>>....<<<.>>.<<.>>.<.>.<.>>...<.<.>.<.>>.<<<.>>.<<.<.>>>.<<<.>>.>.<.>....>.<.>>>>.<<<<<.>>.<<.>...<.>>.<<.>>>>.<<.<<..>>.<<.>.<..>>.<<<<.>>.>.<..>>.<<<<.>>>.>>>.<<..<..<.>..<.>>.......>.<.<<..>>.<<<.>>>...<<<<.>>>.>>>.<<...>.<....>.<.<<.>...<.>>.<<.>>>>>.<<<<..............<.>>.<<.>...<.>>.<<.>...<<.>>>....<<<<.


EDIT: by rearranging the order of the characters in the cells, I saved 186 bytes!

• That's not how a byte count works. If you can't pass the exact sequence of bytes to the interpreter, you can't claim that number of bytes as your byte count. – Doorknob Mar 27 '16 at 15:13
• If there is a BF-interpreter which takes in 3-bits/char. Please add a link to the interpreter and a hexdump/pastebin of the encoded code, if you wish to claim 565 bytes. – Downgoat Mar 27 '16 at 15:23
• Yes, there is a 3-bit brainfuck interpreter. Add a link to this in your answer along with a hexdump/binary representation of your code. The language wouldn't be brainfuck anymore so you'd have to specify "CompressedFuck" in the header. I recommend keeping it as-is as when seeing brainfuck people don't expect it to be very short. – Downgoat Mar 27 '16 at 15:28
• This doesn't look like a valid BinaryFuck program; it doesn't start with a 1. Please provide a link to an interpreter and the hexdump of the source code so your results can be reproduced. – Dennis Mar 27 '16 at 16:12
• If you're going to claim 3 bits per instruction as per Binaryfuck, you need to post the Binaryfuck source code (probably in a hex dump or base64-encoded) and calculate bytes based off of that. As it stands, this submission is a brainfuck submission with 1012 bytes, of which 3 are extraneous (the newlines). – user45941 May 29 '16 at 8:14

## JavaScript (ES6), 380 bytes

For completeness this is my effort to use a different compression method, although as it turns out it's not as efficient as run length encoding. Each digit specifies that the last N already generated characters are repeated. Subsequent digits can repeat already repeated characters, e.g. | 23 turns into | | |. I only wish I could compress a run of three characters.

f=(s= _  26  2479__23   2499_
| 2  6  2379(__23)   25_  237|2
| |__ |2 __25  __2  _ 4   ___2   __2  ___| |_  ___6_| |
|  __)| |/ _  |  _ \\6| 24 |  ___) / _  |/___)  _)/ _  )/ ___)_|
| 2  | (2 |248 |_| 23|__2( 2| |___ |2_( (/ /| 2   _
|_|   |_|\\_||_| ||_/6 \\__  |3__23)_||_(___/ \\___)_5|   |_|
237|_|6   (__2/,r=s.replace(/(.*?)(\d)/,(_,p,n)=>p+p.slice(-n)))=>r==s?r:f(r)

o.textContent = f()
<pre id=o></pre>

# C, 517427 407 bytes

• saved few bytes, thanks to @ceilingcat
c,i;main(m){for(char*s=" _ 4_ 999_6 998_ 1\n|B 2|B 997(_6) 9_ 94|B \n| |_1C _3 _3 1_3 1_ 2_ 3_4 2_3 1_2|B_ 1_3 1_3|B \n| 1_1)|B/ _ 1\\| 1_ \\| 1_E 1| 1_2) / _ 1|/_2) 1_)/ _ 1)/ _2)_| \n|B 2| ( (J_|B 1|B_3( (C_2C_( (/ /|B 3_ 1\n|_| 2|_|\\_||_|B1_/|B1_/ \\_1 1| 1|_6)_|1_(_2/ \\_2)_3)_| 2|_| \n 94|_| 2|_| 2(_3/\n";*s;s++)for(i=isdigit(*s)?c=m,*s-48:isalpha(*s)?c=0,*s-65:(c=*s,1);i--;)printf(c?m=c,&c:" |");}


Ungolfed Try Online

#include <stdio.h>
#include <stdint.h>

char m = 0;

void g(char c, int i)
{
while(i--) c ? m=putchar(c) : printf(" |");
}

void p(char* s)
{
while(*s)
isdigit(*s) // golfed if-else-if
? g(m,*s-48)
: isalpha(*s)
? g(0,*s-65)
: g(*s,1)
,
s++;
}

int main()
{
p(" _ 4_ 999_6 998_ 1\n|B 2|B 997(_6) 9_ 94|B \n| |_1C _3 _3 1_3 1_ 2_ 3_4 2_3 1_2|B_ 1_3 1_3|B \n| 1_1)|B/ _ 1\\| 1_ \\| 1_E 1| 1_2) / _ 1|/_2) 1_)/ _ 1)/ _2)_| \n|B 2| ( (J_|B 1|B_3( (C_2C_( (/ /|B 3_ 1\n|_| 2|_|\\_||_|B1_/|B1_/ \\_1 1| 1|_6)_|1_(_2/ \\_2)_3)_| 2|_| \n 94|_| 2|_| 2(_3/\n");
return 0;
}


## JavaScript, 297 bytes

console.log( 29 288999002889 3
19 18899 500_)82891
1__ 1 0_ 02022 290_2 02012020_1
|3_)162|3 \\|3 \\1 19|90) 62|/0)3)62)60)_|
19 |55 1 1 1 1 71910_(5 10 1_(56/193
7|4\\_|717/176\\_2|9|00_)_|7(06\\0)0_)_|4
8 44950_/.replace(/\d/g,n=>___,| |,_  ,  _,   |_|, (,/ ,|_,          ,  .split,[n]))


Simple encoding of the ten most (as far as I can tell) common substrings. They are not in order because of overlaps; my encoder (below) needs to see e.g. '_ ' and ' _' before ' '.

(s,a,t=s)=>a.map((t,i)=>s=s.split(t).join(i))&&[s,(b=>{b=new Map;for(i=0;i<s.length;i++)for(j=0;j<i;j++)b.set(s.slice(j,i),s.length-s.split(s.slice(j,i)).join().length-i+j-1);return[for(x of b)if(x[1]>0&&!/\d/.test(x[0]))x].sort(([a,b],[c,d])=>b-d)})(),t.length-(s+' '+a).length]


This takes a string and an array of substrings to encode and returns a) the encoded string b) the list of potential next savings c) the number of bytes saved so far.

# 𝔼𝕊𝕄𝕚𝕟, 72 chars / 209 bytes

Эć훼쎧漤詼媰਀㻆僚픈耊Ⓢኍ⋱쬝ᇑ덆䖇䂊՛樥첾㨭쯠ཁ톇:덱螟醮䖉⥊覂削ꇉ漈涹႘챘ඕ꼳⁒᭷Ừ䒕鶀놜㆝〢ﱱꎀ쎴䋈㗂䅉Ⴄቀ쳵菨ⶩ∉툲耀


Try it here (Firefox only).

Well, at least the char count is great, but we can't use the custom code page. It's just an LZString-decompression. I'm also working on another solution - more on that later.

# Perl 5, 286 bytes

perl -M5.01 happy.pl, where happy.pl is:

$_='u5u28 7_27u ~~x~~25 (7_)10u7x~~ ~p_ ~~4_ 4_x4_x_3u4 5_3 4_x3_~px4_x4_~~ ~u_)~|/ux~u \~u \4~ ~ 3_) /ux|/3_)x_)/ux)/ 3_)_| ~~x~( ( 8~p~~ ~|4-( ( ~p__ ~p( (/ /~~3u p~xp|\_|p~|p/~|p/ \__x~ p6_)_|p(3_/ \3_)4_)_~xp| 14 p~xp~x(4_/';s/u/ _/g;s/\d+(.)/$1x$&/ge;s/x/ /g;s/~/| /g;s/p/|_/g;say  Thanks to Dom Hastings (in a comment hereon) for an idea that saved me two bytes and led to another idea of mine that saved four more. • Surely you should use L as the shorthand for |_ ;-) – Neil Mar 28 '16 at 17:03 # Python 2, 343328 316 bytes This solution uses no decompression functions or other imports. o="" for i in range(250):j=ord(")*I*yyQZyyI*(!+9!+yyA,Z-q*y9!+(!+2)!!B)B1B1*9*AJ9B1:!+*1B1B!+(+12-!+/)*1+1*).+1*).!!!+1+1:-)/)*1+/:-1*-/)*1-/):-*+(!+9!,),)!!!!!!!!+*!+1!+B,),)!+:)!+*,),/)/!+A*(+*+9+*+.*3*!3*/!3*/).21+1+Z-*3*,:/).:-B-*+9+*+(y9+*+9+*+9,B/(".replace("!","+)")[i])-40;o+="\n _|()\/"[j&7]*(j/8+1) print o  Readable version: DATA=(")*I*yyQZyyI*(" "!+9!+yyA,Z-q*y9!+(" "!+2)!!B)B1B1*9*AJ9B1:!+*1B1B!+(" "+12-!+/)*1+1*).+1*).!!!+1+1:-)/)*1+/:-1*-/)*1-/):-*+(" "!+9!,),)!!!!!!!!+*!+1!+B,),)!+:)!+*,),/)/!+A*(" "+*+9+*+.*3*!3*/!3*/).21+1+Z-*3*,:/).:-B-*+9+*+(" "y9+*+9+*+9,B/(").replace("!","+)") SIZE=250 o="" for i in range(SIZE): j=ord(DATA[i])-40 o+="\n _|()\/"[j&7]*(j/8+1) print o  Uses a version of run length encoding with 3 bits for a symbol from the set "\n _|()/". The remainder of the byte is the length, but I have limited the length to 10 and manipulated it so that the results are printable characters that are valid in a python string without any escaping. Replacing the string corresponding with "| " with a single character in the encoded data saves a few more bytes. I removed the trailing spaces on lines 1 and 5, which may be bending the rules a bit, but seems practical. This program generates the packed data: message=""" _ _ _______ _ | | | | (_______) _ | | | |__ | | ____ ____ ____ _ _ _____ ____ ___| |_ ____ ____| | | __)| |/ _ | _ \| _ \| | | | | ___) / _ |/___) _)/ _ )/ ___)_| | | | ( ( | | | | | | | | |_| | | |____( ( | |___ | |_( (/ /| | _ |_| |_|\_||_| ||_/| ||_/ \__ | |_______)_||_(___/ \___)____)_| |_| |_| |_| (____/"""[1:] size=len(message) symbols="\n _|()\/" i=0 encoded="" while i<size: count=0 while count<10 and i+count+1<size and message[i+count+1]==message[i]: count+=1 n = symbols.find(message[i]) | count<<3 encoded+=chr(n+40) i+=count+1 encoded_lines = encoded.replace("+)","!").split(chr(40)) for line in encoded_lines: print line+chr(40) print len(encoded)  • Hello, and welcome to PPCG! Great post! – NoOneIsHere Jun 4 '16 at 4:09 • @NoOneWasLiterallyEverHereEver not that it's their first post or anything, but sure :) – cat Jun 28 '16 at 3:27 # Python 2, 159 bytes This source contains non-printable characters, so it is presented as a hexdump that can be decoded with xxd -r. 00000000: efbb bf70 7269 6e74 2278 017d 8fb5 7540 ...print"x.}..u@ 00000010: 3114 c5fa 3f85 4abb f240 012d a2dd 432f 1...?.J..@.-..C/ 00000020: 4cba c732 1302 20ff e0c0 dfc8 1501 e33f L..2.. ........? 00000030: 580e 9b77 e40b d115 2911 aa23 1c33 05a7 X..w....)..#.3.. 00000040: cf54 6ae4 74c7 7310 baa3 8310 c86d 8c27 .Tj.t.s......m.' 00000050: 04ea 6656 9c79 9bfb a5fb 6cdd f6fe b5c5 ..fV.y....l..... 00000060: a2ef 3182 4875 56a4 123d 770f 2702 902b ..1.HuV..=w.'..+ 00000070: 03b2 5bcb 28cf 985b 8520 876d b974 a6dc ..[.(..[. .m.t.. 00000080: be28 20bb f842 f6ee a57a 1e01 c1a2 733e .( ..B...z....s> 00000090: 222e 6465 636f 6465 2827 7a69 7027 29 ".decode('zip')  # Racket, 367 364 bytes (require file/gunzip net/base64)((λ(o)(gunzip-through-ports(open-input-bytes(base64-decode #"H4sIAOhN/lYAA31QwQ3EMAj7dwqezYuFInkRhj+MoWor9UBCmGBDMBhN8cMg+9dhR1hkovhhZwutO/FhSadQzqJQDdXkjsOYfa5Hkm4QEsp0ZeYkEdmeKK8i91GHazesgoyJEdfXzvR4O1ooOLY7oA8QunnfhDdCCSE2oogBV7QN7RhzI3bwYPWUUDXRj9fVpj439h/OlCKU1gEAAA=="))o)(displayln(get-output-string o)))(open-output-bytes))  ### Ungolfed (require file/gunzip net/base64) ((λ (o) (gunzip-through-ports (open-input-bytes (base64-decode #"H4sIAOhN/lYAA31QwQ3EMAj7dwqezYuFInkRhj+MoWor9UBCmGBDMBhN8cMg+9dhR1hkovhhZwutO/FhSadQzqJQDdXkjsOYfa5Hkm4QEsp0ZeYkEdmeKK8i91GHazesgoyJEdfXzvR4O1ooOLY7oA8QunnfhDdCCSE2oogBV7QN7RhzI3bwYPWUUDXRj9fVpj439h/OlCKU1gEAAA==")) o) (displayln (get-output-string o))) (open-output-bytes))  # ///, 282 279 bytes Improvement: I noticed that there are too many // in the replacement commands, so I decided to compress them also (to m), which saved me 3 bytes. /m/\/\///l/ _mk/|amj/b_mi/\\\m/h/|cmg/ddmf/ccme/bbmd/aamc/ |mb/__ma/ /ldlgggdejgggal hafggga(ej)ga_gdah hbf e eaea_alde_a eajh_aeaeh kb)hilak_ \\k_ \\|fcakj) ila|ij)a_)ila)i j)_| hac ( (ffffc_hahe( (fjf_( (i ihd_ |_kc_|\\_||_h|_ih|_i \\bak|ej)_||_(ji \\j)e)_kc_| gda|_kc_k (ei  Repeatly compress the most frequent substring. ### Thirteenth generation, 282 bytes /l/ _//k/|a//j/b_//i/\\\///h/|c//g/dd//f/cc//e/bb//d/aa//c/ |//b/__//a/ /ldlgggdejgggal hafggga(ej)ga_gdah hbf e eaea_alde_a eajh_aeaeh kb)hilak_ \\k_ \\|fcakj) ila|ij)a_)ila)i j)_| hac ( (ffffc_hahe( (fjf_( (i ihd_ |_kc_|\\_||_h|_ih|_i \\bak|ej)_||_(ji \\j)e)_kc_| gda|_kc_k (ei  Try it online! ### First generation, 486 bytes No compression. Escaped the / and the \.  _ _ _______ _ | | | | (_______) _ | | | |__ | | ____ ____ ____ _ _ _____ ____ ___| |_ ____ ____| | | __)| |\/ _ | _ \\| _ \\| | | | | ___) \/ _ |\/___) _)\/ _ )\/ ___)_| | | | ( ( | | | | | | | | |_| | | |____( ( | |___ | |_( (\/ \/| | _ |_| |_|\\_||_| ||_\/| ||_\/ \\__ | |_______)_||_(___\/ \\___)____)_| |_| |_| |_| (____\/  Try it online! ### Second generation, 402 bytes Compressed two spaces to a. The /a/ / means "replace all occurrences of a to two spaces". /a/ / _aa _aaaaaaaaaaaaaa_______aaaaaaaaaaaaa _ | |a | |aaaaaaaaaaaaa(_______)aaaaa_aaaaaaa| | | |__ | | ____ ____a____a_a _aa_____a ____a___| |_a____a____| | |a__)| |\/ _a|a_ \\|a_ \\| | | |a|a___) \/ _a|\/___)a_)\/ _a)\/ ___)_| | |a | ( ( | | | | | | | | |_| |a| |____( ( | |___ | |_( (\/ \/| |aa_ |_|a |_|\\_||_| ||_\/| ||_\/ \\__a|a|_______)_||_(___\/ \\___)____)_|a |_| aaaaaaa|_|a |_|a (____\/  Try it online! ### Third generation, 369 bytes Compressed __ to b. The /b/__/ at the beginning means "replace all occurrences of b to __". /b/__//a/ / _aa _aaaaaaaaaaaaaabbb_aaaaaaaaaaaaa _ | |a | |aaaaaaaaaaaaa(bbb_)aaaaa_aaaaaaa| | | |b | | bb bbabba_a _aabb_a bbab_| |_abbabb| | |ab)| |\/ _a|a_ \\|a_ \\| | | |a|ab_) \/ _a|\/b_)a_)\/ _a)\/ b_)_| | |a | ( ( | | | | | | | | |_| |a| |bb( ( | |b_ | |_( (\/ \/| |aa_ |_|a |_|\\_||_| ||_\/| ||_\/ \\ba|a|bbb_)_||_(b_\/ \\b_)bb)_|a |_| aaaaaaa|_|a |_|a (bb\/  Try it online! ### Fourth generation, 339 bytes Compressed  | to c. The /c/ |/ at the beginning means "replace all occurrences of c to  |". /c/ |//b/__//a/ / _aa _aaaaaaaaaaaaaabbb_aaaaaaaaaaaaa _ |caccaaaaaaaaaaaaa(bbb_)aaaaa_aaaaaaa|c |cbcc bb bbabba_a _aabb_a bbab_|c_abbabb|c |ab)|c\/ _a|a_ \\|a_ \\|ccca|ab_) \/ _a|\/b_)a_)\/ _a)\/ b_)_| |cac ( (ccccccccc_|ca|cbb( (ccb_cc_( (\/ \/|caa_ |_|ac_|\\_||_|c|_\/|c|_\/ \\ba|a|bbb_)_||_(b_\/ \\b_)bb)_|ac_| aaaaaaa|_|ac_|a (bb\/  Try it online! ### The rest of the compression rules So, the list of compression rules: • Compress two spaces to a. • Compress __ to b. • Compress  | to c. • Compress aa to d. • Compress bb to e. • Compress cc to f. • Compress dd to g. • Compress |c to h. • Compress \/ to i. Both the \ and the / in the rules are further escaped. • Compress b_ to j. • Compress |a to k. • Compress  _ to l. • Compress // to m. As you can see, there are overlapping compression rules. For example, g encodes dd which encodes aaaa which encodes 8 spaces. • If you want to sound drunk but don't have any alcohol in reach just try pronouncing one of these. proven to work on parents – cat Jun 28 '16 at 3:29 ## Your Mom (non-competing), 331 bytes Decode the string and decompress it using the Jelly compressor 'IF8KfCgpL1z/AQAAAQAAAAAAAAAAAAAAAAAAEREREAAAAAAAAAAAAAAAAAAQIwMAAwMAAAAAAAAAAAAAAAAAQREREVAAAAAAAQAAAAAAAAAwMjAxEDAwEREBERABERABAAEAABEREAAREQAREwMQAREQARETAyMAEVMDYBADABBzABBzAwMDADABEVBgEANhEVABVgEAVgERUTIwMAAwQEAwMDAwMDAwMDEwMAMDERFAQDAxEQMDFARgYwMAABAjEwADE3EzEwMxYwMxYHEQAwAxERERUTMUERYHERUREVEwADEyAAAAAAAAADEwADEwAEERFg=='  • How did you compete in my mom?!?! Registration closed months ago... – Magic Octopus Urn Apr 25 '19 at 19:28 # Python 3, 377 bytes from re import*;i=0 r=r'2_.7_./ .|2.| .4_.\\. _._d|.( (.3_). _ .2|_. |2 ._| |.a| |./ _2 .|3 |_. 4_2 . | |.\n' e='an5n28 t27jf3b26 (t)10n14bfub pcp2n3n4 5_3c3g_2c4gar u)q|erjorjo|bhr k e|/k2n)e)sk_|f3 qlbbbb |g2bplb3_b_ls/q|4ja|mo_iqi/qisou2h|t)_i(3_sokp)ma14 |m3 (p/' for j in r.split('.'):e=sub(chr(117-i),j,e);i+=1 print(sub('(\d+)(.)',lambda x:int(x.group(1))*x.group(2),e))  similar to the javascript answer, used RLE plus a bunch of replacements for common substrings. Think I went a bit over the top with the replacing stuff, probably didn't help that much but oh well. # JavaScript (ES6), 354 bytes Another attempt. Not as efficient as run length, unfortunately. i=0,console.log(1c1bt96zfx1!1n4ikabr1w5!1n4iut4kyue!krgqthnkpkem8!43tb4j2urme!8hwrsagny80!69dfowb7hvk!2xj89rpvcb2!23l14ken5i1!1xzn6ns7j78!1tzyivgb4h2!1yy885vts00!12du7km7f51!1lvpcyzgbfq!17nicizf8og0!1246xqebgb9!1n4j181hywz!.replace(/\w+!/g,v=>parseInt(v,36).toString(4).replace(/./g,w=>"_ |"[w]|| () )/\\\\)//))/)/) ((((((// \\//\\)(/\\)) (/[i++])))  Stores a bunch of base-36 numbers in the first string, delimited by a ! separator. Then replaces the numbers (along with the !) with the numbers' base-4 representations. Replaces all the 0's, 1's, and 2's in the base-4 number with _,  , and | respectively, and all the 3's are replaced with the elements in the second string sequentially. # Python 3, 263 bytes Initial pass using builtins. from base64 import* from zlib import* print(decompress(a85decode(b"Gas1Y_%\"=:#lAfQT$<1I,'acT5E):N/+l.oQs98(esP<+T'c!7p'"
b";rpgIeCXZQ&]8Z,D1U/2<LjGq-FIBH)'D@dH'FCjS[&_Wa(Y9N^<LMJiMJrGNuf@S=?GWT(W34:oA%hQ<"
b"thh3pT#pD4$L]LSa%IG!R,BiQaoor91d>uo0VEQs4+2O[m4o")).decode())  some extra quotes and linebreaks added to avoid horizontal scroll for display purposes only (not counted in score) • Don't worry about horizontal scroll. Just copy-paste the text as-is, because that's what we're interested in. – El'endia Starman Mar 27 '16 at 18:44 • I know, I just prefer to avoid it. May as well also not do hex dumps all pretty. – Nick T Mar 27 '16 at 19:41 • You could try to store the zlib data in a string. You slould escape some characters, but it's probably a lot shorter. See this answer as reference. – agtoever Mar 28 '16 at 6:05 • @agtoever the repr() of the raw string was much longer than ascii85 – Nick T Mar 28 '16 at 18:56 • @NickT Please remove the additional quotes and whitespace. Your code should be such that we can copy/paste it into a byte-counter and get the same result. Thanks. If you want a nice, displayable version, post an un-golfed version. – mbomb007 Mar 29 '16 at 16:08 # CJam, 229 "3WPPEFXvN'vlFBse/cTD>.x:Na,Y&NJH^tZ%xL(NkYzo0Rq%BeV&Zl1T^2y69,W/QC4pLnv<Jo$'Cq.'m2-3H#9teHi&<uyO>f V)D\E y'*]oGq*ODjQLyoS*GyM7;\Z.n6B;J@OyEaE!4'E5p5MOl^#[,ZtA;jy,gTP^\;;i<A6^:k1%"' fm91b31b"}*+{~'NHIF\JLM
OGQK)(P/RST|_- \""f=~


No funky characters and no built-in compression :)

Try it online

# Lua, 353 bytes

Program:

a=(" _ 5_ 28_7 27_\n|~ 2~2 26(_7) 10_ 13~2\n|~_2~2 _4 _4 2_4 2_ 3_ 4_5 3_4 2_3|~_ 2_4 2_4|~\n| 2_2)|~/ _ ~ 2_ \\| 2_ \\|~3 ~ 2_3) / _ ~/_3) 2_)/ _ 2)/ _3)_|\n|~ 2~ ( (~9_|~ ~2_4( (~2_3~2_( (/ /|~ 4_\n|_| 2~_|\\_|2_|~|_/|~|_/ \\_2 ~ ~_7)_|2_(_3/ \\_3)_4)_| 2~_|\n 13~_| 2~_| 3(_4/"):gsub("(.)(%d+)",function(a,b)return a:rep(b)end):gsub("~"," |")print(a)


Thanks to @jrich for compression.

# Ruby, 271262 248 bytes

require'zlib'
require'base64'


Try it here

# Vim, 374365326319313311 keystrokes

9 keystrokes thanks to @Dr Green Eggs and Ham DJ .

:im @ ___<CR>
:im % _|<CR>
a _## _<esc>28a <esc>yl7a_<esc>27pa_ <CR>
|!#!!<esc>26pa(<esc>7a_<esc>a)<esc>10pa_<esc>14pa|!<CR>
|!__!!<esc>3a @_<esc>bi <esc>A#_# _##@__# @_#@|!_#@_#@%!<CR>
|#__)|!/ _ !#_ \|#_ \<esc>4a| <esc>a!#@) / _ !/@)#_)/ _#)/ @)%<CR>
|!#! ( (<esc>9a!<esc>a%! !!@_( (!!@!!_( (/ /|!##_ <CR>
|%#!%\%|_<esc>2a|!|_/<esc>a \__ ! !<esc>7a_<esc>a)%|_(@/ \@)@_)%#!%<CR>
<esc>14pa|%#!%# (@_/<esc>
:%s/!/ |/g<CR>
:%s/#/  /g<CR>


Probably can be golfed further by using :nn?

• Here's a couple quick tips after one glance over. 1. You do <number>a <esc> a lot. If you do yl on a space, you could replace this with <number>p. That should save around 8. 2. You could replace ea with A. You could probably take even more if you change your approach, but those are the quick tips I see. – James May 29 '16 at 14:58
• @DrGreenEggsandHamDJ Is there any way that I could map a single keystroke to typing _ and | etc? – Leaky Nun May 29 '16 at 15:16
• I'm on my phone, so I can't test this, but I think this is incorrect. :s only replaces on one line. You want :% s. You could also save some keystrokes by doing :im (imap) instead of search and replace. (Although you might need to use ctrl-v or ctrl-q to map to a space) – James May 29 '16 at 16:50
• @DrGreenEggsandHamDJ Excellent, but using :im can only golf a few more bytes I suppose. – Leaky Nun May 29 '16 at 16:59

# Javascript (ES6) 464 352 bytes

00000000  63 6f 6e 73 6f 6c 65 2e  6c 6f 67 28 60 08 09 28  |console.log(..(|
00000010  09 c3 a0 39 c3 98 09 08  0f 0c 08 0c 18 0c 08 0c  |...9............|
00000020  c3 90 0a 39 0e 50 09 70  0c 08 0c 0f 0c 08 0c 11  |...9.P.p........|
00000030  08 0c 08 0c 08 21 08 21  10 21 10 09 18 09 20 29  |.....!.!.!.... )|
00000040  18 21 10 19 0c 08 0c 09  10 21 10 21 0c 08 0c 0f  |.!.......!.!....|
00000050  0c 10 11 0e 0c 08 0c 0a  08 09 10 0c 10 09 08 0c  |................|
00000060  10 09 08 0c 08 0c 08 0c  08 0c 10 0c 10 19 0e 08  |................|
00000070  0a 08 09 10 0c 0a 19 0e  10 09 0e 0a 08 09 10 0e  |................|
00000080  0a 08 19 0e 09 0c 0f 0c  08 0c 18 0c 08 0a 08 0a  |................|
00000090  08 0c 08 0c 08 0c 08 0c  08 0c 08 0c 08 0c 08 0c  |................|
000000a0  08 0c 09 0c 08 0c 10 0c  08 0c 21 0a 08 0a 08 0c  |..........!.....|
000000b0  08 0c 19 08 0c 08 0c 09  0a 08 0a 08 0a 0c 08 0c  |................|
000000c0  20 09 08 0f 0c 09 0c 18  0c 09 0c 09 14 09 0c 08  | ...............|
000000d0  14 09 0a 0c 08 14 09 0a  08 11 10 0c 10 0c 39 0e  |..............9.|
000000e0  09 14 09 0a 19 0a 08 19  0e 21 0e 09 0c 18 0c 09  |.........!......|
000000f0  0c 0f 70 0c 09 0c 18 0c  09 0c 18 0a 21 60 2e 73  |..p.........!.s|
00000100  70 6c 69 74 28 22 22 29  2e 6d 61 70 28 61 3d 3e  |plit("").map(a=>|
00000110  61 2e 63 68 61 72 43 6f  64 65 41 74 28 29 29 2e  |a.charCodeAt()).|
00000120  6d 61 70 28 61 3d 3e 41  72 72 61 79 28 28 61 3e  |map(a=>Array((a>|
00000130  3e 33 29 2b 31 29 2e 6a  6f 69 6e 28 22 20 5f 2f  |>3)+1).join(" _/|
00000140  5c 5c 7c 28 29 5c 6e 22  2e 73 70 6c 69 74 28 22  |\\|()\n".split("|
00000150  22 29 5b 61 26 37 5d 29  29 2e 6a 6f 69 6e 28 22  |")[a&7])).join("|
00000160  22 29 29                                          |"))|


Try it here!

# HTML, 482481 475 bytes

<pre> _     _                            _______                           _
| |   | |                          (_______)          _              | |
| |__ | | ____ ____  ____  _   _    _____   ____  ___| |_  ____  ____| |
|  __)| |/ _  |  _ \|  _ \| | | |  |  ___) / _  |/___)  _)/ _  )/ ___)_|
| |   | ( ( | | | | | | | | |_| |  | |____( ( | |___ | |_( (/ /| |    _
|_|   |_|\_||_| ||_/| ||_/ \__  |  |_______)_||_(___/ \___)____)_|   |_|
|_|   |_|   (____/

• Note: One does not simply view this thing properly on a phone. – dorukayhan May 31 '16 at 14:35
• Since you are doing all this anyways, you don't need the closing pre tag – Optimizer Jun 4 '16 at 12:31
• And why do you have trailing spaces on 5th line? :P – Optimizer Jun 4 '16 at 12:32

# 05AB1E, 171 bytes

"_ |0/)(
\"•1æÆ&¢ÙDÿœƒ˜¶f


Try it online.

Explanation:

"_ |0/)(
\"            "# Push string "_ |0/)(\n\"
•1æÆ&¢ÙDÿœƒ˜¶f
# Push compressed integer 1097503083536947704653792841425892054204805659502021445044262296065039856679486956980779201344195600186307613120325421519873972685660197036332437042797892085831181080642513349371962439499848029872306826792254102689695782393365417312419084231420872539225014767457254170199022042856591776594745757160095950475758150232076499909206475280246564765470414367938
9в          # Converted to Base-8 as list: [1,0,3,1,1,0,3,3,3,3,3,3,3,3,3,1,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,7,2,1,2,3,2,1,2,3,3,3,3,3,3,3,3,1,1,6,0,0,0,0,0,0,0,5,3,3,3,1,0,3,3,3,3,1,1,2,1,2,7,2,1,2,0,0,1,2,1,2,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,0,3,0,3,1,0,0,0,0,0,3,0,0,0,0,1,1,0,0,0,2,1,2,0,1,1,0,0,0,0,1,1,0,0,0,0,2,1,2,7,2,1,1,0,0,5,2,1,2,4,1,0,1,1,2,1,1,0,1,8,2,1,1,0,1,8,2,1,2,1,2,1,2,1,1,2,1,1,0,0,0,5,1,4,1,0,1,1,2,4,0,0,0,5,1,1,0,5,4,1,0,1,1,5,4,1,0,0,0,5,0,2,7,2,1,2,3,2,1,6,1,6,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,2,1,2,1,1,2,1,2,0,0,0,0,6,1,6,1,2,1,2,0,0,0,1,2,1,2,0,6,1,6,4,1,4,2,1,2,3,1,0,7,2,0,2,3,2,0,2,8,0,2,2,0,2,1,2,2,0,4,2,1,2,2,0,4,1,8,0,0,1,1,2,1,1,2,0,0,0,0,0,0,0,5,0,2,2,0,6,0,0,0,4,1,8,0,0,0,5,0,0,0,0,5,0,2,3,2,0,2,7,3,3,3,3,1,1,2,0,2,3,2,0,2,3,6,0,0,0,0,4]
è         # Index each into the string
J        # Join all characters together to a single string
0…   :  # Replace all "0" with "   " (3 spaces)
# (and output the string implicitly as result)


See this 05AB1E tip of mine (section How to compress large integers? and How to compress integer lists?) to understand how the compressed integer and Base-8 list work.

• I'ma beat you ;). – Magic Octopus Urn Apr 25 '19 at 19:28
• Nevermind, no I'm not +1. – Magic Octopus Urn Apr 25 '19 at 19:36
• @MagicOctopusUrn :D – Kevin Cruijssen Apr 26 '19 at 6:09

# C (gcc), 280 279 bytes

f(i){for(char*A=" _|/\\()\n",*s="H@@H.@#IA-@AWP@PP-@M#IF$@H'@BzBJABBIIHIAHIAH@H@@IIA@II@IQPAHIAHIQPW@IVPCAP@AT@AT#P@BHIFCAPKIFH^H@^HINzBB@BEE(BJBBPPIIEEBJIPPihCSP@@AWQ@PQLRQPJSPJCLAP@J#INRiIYIqIINB@Jz'@JB@JB@MIY";i=*s>63?:*s++;s++)for(;i--&31;)printf("%c%c",A[*s&7],A[*s/8&7]);}  Try it online! ## Rundown We define an alphabet of 8 symbols, " _|/\\()\n", and compress the data by packing two symbols per byte according to its index in the alphabet, with the first symbol in bits 0..2, and the second in 3..5. Bit 6 is set to bring the resulting byte into printable ASCII territory. A simple RLE is then run on the compressed string. If a symbol in the string occurs more than twice in a row, it is stored as a character pair, with the first containing the run-length plus 32 (bit 5 set) and the second the symbol itself. f(i){ i is run-length; not actually passed to f() for( Loop over compressed string. char*A=" _|/\\()\n", Alphabet *s="..."; Compressed string. i=*s>63?:*s++; If char is outside symbol range, use as run-length and skip to next. Stop on EOS. s++) Advance to next char. for(;i--&31;) Repeat symbol pair per run-length. printf("%c%c",A[*s&7],A[*s/8&7]); Extract symbols from character and print. }  Try it online! • @ceilingcat Hm. Can't be recalled without funky output. Still, tweaked it a bit and got 279 too. – gastropner Apr 25 '19 at 17:49 # Javascript ES6, 314 bytes Contains unprintable bytes. Uses some black JS magic to run. If console.log() is needed for this answer to be valid, the byte count will be 327. [...Ãm°Ûm¶Ûm¶Ûm¶Û\��m¶Ûm¶Ûm¶Ûm�ç�±Çm¶Ûm¶Ûm¶Ûh���¶Ûm°Ûm¶Ûm�<â�8à�À�°�l6Ãm��m��\�Äl����Ç��§��Ça�ØfqÇ��À�����» °Ú¬� ó�Øé¦8ã�8ã� ã±Ä�&�â�Ç�4Y�vØnAÛ�X$�HG��\lv �� ���0��
�Ø�öÛm¶Ûb�Ø�¶���].map(a=>'0'.repeat(8-(z=a.charCodeAt().toString(2)).length)+z).join.replace(/.{1,3}/g,a=>_|/\\()
[parseInt(a,2)]).slice(0,-2)


This was a huge pain to get right, and I couldn't manage to get rid of the .slice(0,-2) :(
Will edit in an explanation tomorrow when I'm less tired.

Replaced every single byte with the corresponding hex value in order for the code snippet to be able to run

f=_=>
[...\xc3\x6d\xb0\xdb\x6d\xb6\xdb\x6d\xb6\xdb\x6d\xb6\xdb\x60\x00\x00\x6d\xb6\xdb\x6d\xb6\xdb\x6d\xb6\xdb\x6d\x86\xe7\x1d\xb1\xc7\x6d\xb6\xdb\x6d\xb6\xdb\x6d\xb6\xdb\x68\x00\x00\x0b\xb6\xdb\x6d\xb0\xdb\x6d\xb6\xdb\x6d\x8e\x3c\xe2\x06\x38\xe0\x00\xc0\x01\xb0\x00\x6c\x36\xc3\x6d\x80\x00\x6d\x80\x03\x60\x01\xc4\x6c\x00\x1b\x00\x01\xc7\x9d\x80\xa7\x15\x86\xc7\x61\x99\xd8\x66\x71\xc7\x1d\x8e\xc0\x0b\x96\x1b\x14\x00\xbb\x0a\xb0\xda\xac\x00\xa0\xf3\x8e\xd8\xe9\xa6\x38\xe3\x8e\x38\xe3\x8e\x20\xe3\xb1\xc4\x00\x26\x98\xe2\x00\xc7\x11\x34\x59\x1c\x76\xd8\x6e\x41\xdb\x10\x58\x24\x1c\x48\x47\x12\x16\x60\x6c\x76\x20\x00\x00\xa0\x91\x00\x0b\x30\x05\x00\x0a\x0e\xd8\x83\xf6\xdb\x6d\xb6\xdb\x62\x0e\xd8\x83\xb6\x80\x00\x80].map(a=>'0'.repeat(8-(z=a.charCodeAt().toString(2)).length)+z).join.replace(/.{1,3}/g,a=>_|/\\()
[parseInt(a,2)]).slice(0,-2)

a.innerHTML=f()
<pre id=a>

• How does this work? – Oliver Ni Jul 15 '16 at 0:44

# JavaScript, 294 292 bytes

_='_&3,,& *.,,&_ 7+&+,,-(*.)&&& _,-+7+__1 . .-.3&_& ._&.-*+_-.-.+7|3_)+2_43 b|3 \\+14-*) 2_4/*)3)2_-)2*)_|7+&| 51111 6+-+.51*1_52/+& _ 7|0\\_|6+6/+62\\__44*.)_|6(*2\\*).)07,40&(./,&&&&0_|&6|&- .*_*___1 ++| |3-_4-|- 2/ 5( (6|_7\n';for(Y in $='7652-43+1*.&0,')with(_.split($[Y]))_=join(pop());_


This... is literally just encoding of the art... with this...

If console.log() is required, then byte count is 307305 bytes.

294->292, -2B for encoding \n to 7.