fork download
  1. original = (<<'THE_END_OF_PICTURE'.split("\n").reverse.join("\n")+"\n").scan(/./m)
  2. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM>MMMMMMMM'MMMMMMMMMMMM
  3. MMMMMMx*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM?MMMMMMMMMMMMMMMMM\MMMMMMMM'MMMMMMMMMMMM
  4. MMMMMMMMx*MMMMMMMMMMMMMMMMMMMMMMMMMMMM#xMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  5. MMMMMMMMMM(MMMMMMMMMMMMMMMMMMMMMMMMM*xMMMMMMMMMMMMMMMMMMMMMMMMMMMM:MMMMMMMMMMMMM
  6. MMMMMMMMMMMM"MMMMMMMMMMMMMMMMMMMMMM"MMMMMMMMMMMMMMMMMMMMMMMMMMMMM\MMMMMMMMMMMMMM
  7. MMX*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM)MMMMMMMMMMMMMMM
  8. *MMMHMMMMMMMMMMMMMMM*******"""""""""""""""*""""***MMMMMMMMMMMMM:MMMMMMMMMMMMMMMM
  9. Mn?MMMM"` ....:::===:::::........ .x!MSXMMMX `MM"*MMMMMMMMMMMMMMMMM
  10. *MMMMM ` .HXMMSX!XSX!MMMMx /M! `""*MMMMMMMM
  11. MMMMMM dX!XSX!XSX!XSMMMSXh.MM `""MM
  12. **MMMM MSX!XSX!XSX!XMMMMSXHMSX! `"~+..
  13. MM"MMf X!XSX!XSX!XSMMMMMHMSX!XSX ^"=..
  14. )HMMM 'X!XSX!XSXHMMMMMMMMMSX!XSM ^~:.
  15. MMMMM MSX!XMMMMSXMMMM!XSX!XSX!~==:...
  16. MMMMM ...... .MMMMSX!MSXHMMX!XSX!XSP*+x. `""~=::..
  17. MMMMM .=" ```^"""!!*-*M*tXSX!XMMMXSX!XSXf `"*+x.
  18. MMMMX .+~` ..::::+=======~~~~~n%!:.X.. `*X!MMM!XSX!X" `"*%x..
  19. MMMMM~" .xnMHX ." " ` ``"MMM"MX. `""-=:.. "
  20. MMMMMf" 'MM~M~ ...x. " 'MMX `"~=:.. `"+.
  21. MMMMMX MxMM '""```` `"MMMHx. XMM )MH:.`~+.
  22. MMMMMX MM.! `"*MMMh. XMM .xHMM*" `". `~+.
  23. MMMMMM / HM '!!XXXXXXXX!:: '. MMM :MMM*" .....::. `~:.
  24. XMMMMM ".?MM MM***MMMHXX^"XX!x MMX x::!XXHHHHHHHHHh MM
  25. XMMMMM>' 'MM 'Mk !!MM!!"?x `"! !MX f` .nMMMMMM""MMM M
  26. MMMMMMM XMM `Mh !!!~ ..\ X MM " -M^'!!??!! XMM 4
  27. MMMMMMM 'MM `""""" M*k f ~.....(!!(..nMM* '
  28. MMMMMMMM MM > M?: X
  29. MMMMMMMMMX?M ! M:" M
  30. MMMM#XMMMX ML M. M
  31. MM*xMM)MMXX?M #: 'M
  32. M!MMMMMMX/M-M `: XM
  33. MHMMM>MMX`M !M + MM
  34. MMMMMXMMX`MM`' MX
  35. MMMMfMMMX/MM:! X M
  36. MMMMMMMMX/MMM ! :!MM
  37. MMMMMMMMX`?M4> . .!:MM
  38. XM*""` X`'M X . .. :: fMM
  39. X/'M : - ^~!! .x+! ~/ / MM
  40. X/'M ': '!:.:!~ ~ / MM
  41. X`'M `. ``` .` : MM
  42. X`'X . .~ MM!
  43. X/'X .xnh x.. .~ MM>
  44. X/'!X ! xHMMMMMMMMMMMHx ~ 'MM>
  45. X`'!' !: +MMMM?????MMMMMMMMMMx. .~ 'MMX
  46. X`'! X!! `X!!!!!!!!!!!!!!X" : :MMX
  47. X/'! X!!. `!!!!!!~`` !X" / XMMX
  48. X/'! 'X!!x ^"~%!!*~` ! XMMX
  49. X`'! !!!! ." MMMX
  50. X`'! !!!!x X MMM?
  51. X/'! !!!!!x .!!!x MMM'
  52. X/'! '!!!!!!x. .!!!!!!?. MMM'
  53. X`'! `!!!!!!!!: .:!!!!!!!!!!!. MMX'
  54. . X`'! ~!!!!!!X!!%... ..:!!!M!!!!!!!!!~``% MMX
  55. ". X/'! ~!!!!!!!!!!!!!!!!???!!!!!!!!!M!!!!~` XMMHMMX
  56. % X/'! !!!!!!!!!!!!!!!!!!!!!!!!!X!!!!` dMMMMMMMM
  57. `+ X`'! !!!!!!!!!!!!!!!!!!!!!!!!!~ :MMMMMMMMM
  58. `+X`'! `!!!!!!!!!!!!!!!!!!!!!!` MMMMMMMMMM
  59. X/X! `!!!!!!!!!!!!!!!!!!~ MMMMMMMMMM
  60. X/`?x `!!!!!!!!!!!!!!! XMMMMMMMMMM
  61. X`/! `+. ~!!!!!!!!!!! MMMMMMMMMMM
  62. X`/! ". `~!!!!!!~ :MMMMMMMMMMM
  63. X/`! ^%. ~ MMMMMMMMMMMM
  64. X/`! `~: ~ MMMMMMMMMMMM
  65. X`/! ^=x. MMMMMMMMMMMMM
  66. X'/! `~+.. /MMMMMMMMMMMMM
  67. X'`! `"~~=::.. :MMMMMMMMMMMMMM
  68. X'`! ``""~~=+::..... xMMMMMMMMMMMMMMM
  69. X'/! XMMMMMMMMMMMMMMMM
  70. X'/! MMMMMMMMMMMMMMMMMM
  71. X'`! .MMMMMMMMMMMMMMMMMMM
  72. X'`! nMMMMMMMMMMMMMMMMMMMM
  73. ""'` MMMMMMMMMMMMMMMMMMMMM!
  74. .MMMMMMMMMMMMMMMMMMMMM!.
  75. XMMMMMMMMMMMMMMMMMMMM!/.>
  76. MMMMMMMMMMMMMMMMMMMMM"/.>/
  77. .MMMMMMMMMMMMMMMMMMMMM~/.>//
  78. THE_END_OF_PICTURE
  79.  
  80. def rle(a)
  81. result = []
  82. until a.empty?
  83. i = 0
  84. c = 0
  85. while i < a.size
  86. if a[i] == a[0]
  87. c += 1
  88. else
  89. break
  90. end
  91. i += 1
  92. end
  93. result << [a[0], c]
  94. a = a[c..-1]
  95. end
  96. result
  97. end
  98.  
  99. data = rle(original)
  100. stat = data.group_by{|x|x[0]}.map{|k,v|[k,v.map{|a,b|b}.inject(&:+)]}.sort_by{|k,v|-v}
  101.  
  102. STDERR << "NSYM: " << stat.size << $/
  103. STDERR << "ORIGINAL: " << original.size << $/
  104. STDERR << stat.inspect << $/
  105.  
  106. $bad = 0
  107. def strpush(str, c)
  108. case c
  109. when "\\".ord; $bad+=1; str << "\\\\"
  110. when "\"".ord; $bad+=1; str << "\\\""
  111. when "\n".ord; $bad+=1; str << "\\n"
  112. when "\r".ord; $bad+=1; str << "\\r"
  113. else; str << c.chr
  114. end
  115. end
  116.  
  117. ############################################################
  118. spec = Hash.new
  119. spec[" "] = ["100", 5]
  120. spec["M"] = ["101", 5]
  121. spec["!"] = ["110", 5]
  122. spec["X"] = ["1110", nil, ""]
  123. spec["."] = ["1111", nil, ""]
  124. DEFAULT_BITS = 5
  125.  
  126. STDERR << "HOGEHOGEHOGE!" << $/ if (1<<DEFAULT_BITS) < (stat.size - spec.size)
  127.  
  128. DEFAULT_TABLE = ""
  129. id = 0
  130. data.each do |c,n|
  131. unless spec[c]
  132. spec[c] = ["0", nil, "%0#{DEFAULT_BITS}b"%id]
  133. id += 1
  134. DEFAULT_TABLE << c;
  135. end
  136. end
  137. DEFAULT_TABLE << "!"
  138.  
  139. bits = ""
  140. data.each{|c,n|
  141. prefix, rle_bits, id_bits = spec[c]
  142. if rle_bits
  143. if c=="!" && n==1
  144. bits += "011111"
  145. else
  146. while n>0
  147. len = [(1<<rle_bits)-1, n].min
  148. n -= len
  149.  
  150. bits += prefix
  151. bits += "%0#{rle_bits}b" % len
  152. end
  153. end
  154. else
  155. while n>0
  156. n -= 1
  157.  
  158. bits += prefix
  159. bits += id_bits
  160. end
  161. end
  162. }
  163. STDERR << "EST: " << bits.size/8 << $/
  164. bits << "0"*(8-bits.size%8)%8
  165.  
  166. ENCODED_LIT = (str = ""
  167. for i in 0 ... bits.size/8
  168. strpush(str, bits[i*8 ... i*8+8].to_i(2))
  169. end
  170. str
  171. )
  172.  
  173. STDERR.puts "LIT :: #{ENCODED_LIT.size} bytes"
  174.  
  175. #####################################################
  176.  
  177. code = <<THE_END_OF_C
  178.  
  179. char*p="ENCODED_LIT";
  180.  
  181. b,l,t=#{original.size},c,n;
  182. r(n){
  183. l<n?b=b<<8|*p++&255,l+=8:0;
  184. l-=n;
  185. return(1<<n)-1&b>>l;
  186. }
  187.  
  188. main(){
  189. for(;t;)
  190. for(c=r(n=1)
  191. ? (c="@M!"[r(2)]) ? n=r(5),c
  192. : "X."[r(1)]
  193. : DEFAULT_TABLE[r(5)];
  194. n--;
  195. t--)putchar(c);
  196. }
  197.  
  198. THE_END_OF_C
  199.  
  200. code = code.gsub(/(?<!\w\w)\s*/,"").gsub("@"," ")
  201. code["ENCODED_LIT"] = ENCODED_LIT
  202. code["DEFAULT_TABLE"] = DEFAULT_TABLE.dump
  203.  
  204. STDERR.puts "#{code.size} bytes"
  205. STDOUT.binmode
  206. print code
Success #stdin #stdout #stderr 0.03s 22668KB
stdin
Standard input is empty
stdout
char*p="���P�9�{Q�~c��~g�_��Q���_#������F~~G�È�A~~N�8���:�8�g��FA�J+���K�#����\n+�P���8P_��#���/���C��F~$`\n�R�8�g�7��#��A>\\`1��*�8��F'�˒�#����ϑ��8~Xm $*���W��:�8A���~OdҪC�6����,���D�^W��8�hq'�������1����+�$�6����~4l��|�����C��E~0\\b�k�1C��E~3���.*�P�8a_��.~�(�#���I�*����E~ ^�.D�7	�~'��8�W�;���a�_�#���.#��~��Hҡʢ��8a_򣉤8�:����!E���8_�W��B�䀄� �8zw�(\"��|J ����_��� �#��o�a��h�胈�E����_+�|	` A��#���$�\n�%�0��>�DA�ᅡ��/���(�(��ᎡT(���ʢ����~~t�胤R���)��������j!�������P�\n����~�~$�z �_��hS�������薢�:�~r�E��~��'�~n�:�:�}�Z����\n�|(J������AH�Y�R��k	��葇:x.���(,0 �ۃ�J(Q ��0\\#�‚�(uC�P���0Z`����8��~��Ph/�A(��C�X<�(�$QF���|�Z.�,���AAA(j 頁�B�,\\.�����*_���*� ����`\n��z�ߒDh�~���ТDH1��!�'å�:�EA�h��@���)�P+���A E����/�Ď���\n��B|:P��ǡC�|H F�a(ġ�A ����?$���(�� � �����~��s��#�K��#�0a�0A�E4hQw�����Ra$��3���;���\\�(��s��D��a����~����G���� ���5�����9�s��s��(c���J%'��s��9�r�\n9�s����F�~�������(\\��Fæ��?��9�s��(�侊<a�\rXa���s��9�B�~aF�:Τh���(�(��+�����~�Σ�A��F�4hЯEQEDAAADDAEҬ��o�V��Ka/[����K�*�:�Ѽ\\����F�������*�k";b,l,t=6086,c,n;r(n){l<n?b=b<<8|*p++&255,l+=8:0;l-=n;return(1<<n)-1&b>>l;}main(){for(;t;)for(c=r(n=1)?(c=" M!"[r(2)])?n=r(5),c:"X."[r(1)]:"~/>\n\"'`n=+:x^%?dH*h-f4)#Lk(\\StP!"[r(5)];n--;t--)putchar(c);}
stderr
NSYM: 36
ORIGINAL: 6086
[[" ", 3449], ["M", 1271], ["!", 352], ["X", 172], [".", 135], ["`", 90], ["\"", 85], ["\n", 76], [":", 58], ["'", 55], ["~", 48], ["*", 39], ["/", 36], ["S", 33], ["x", 32], ["H", 26], ["?", 21], ["=", 20], ["+", 16], [">", 10], ["^", 9], ["n", 7], ["%", 7], ["f", 7], ["h", 5], ["-", 5], [")", 4], ["#", 3], ["(", 3], ["\\", 3], ["d", 2], ["4", 2], ["k", 2], ["L", 1], ["t", 1], ["P", 1]]
EST: 1277
LIT :: 1295 bytes
1506 bytes