Codegolf — Пиксельная Графика, Эпизод 2: Отобразите Карту 1–1 Из Super Mario Bros.

  • Автор темы Thurnetiehing
  • Обновлено
  • 22, Oct 2024
  • #1

Последний вызов(Пиксель-арт, эпизод 1: отображение Супер Марио) был всего лишь тренинг... (и вы его прошли потрясающим образом, спасибо!)

На этот раз вам придется поработать еще немного. Вам нужно отобразить всю первую карту мира Super Mario Bros на NES, без врагов и без Марио.

Ваша программа или функция должны отображать все пиксели следующего изображения ИЛИ создавать аналогичный ему файл изображения (BMP, PNG или GIF).

Ваша программа не должна каким-либо образом иметь доступ к Интернету.

Вывод можно увеличить, если хотите, а пиксели могут быть элементами ASCII или HTML, если хотите, если они имеют правильный цвет.

Вот модель, которой вы должны следовать:

  • Весь образ: http://i.stack.imgur.com/2kfVc.png codegolf — Пиксельная графика, эпизод 2: Отобразите карту 1–1 из Super Mario Bros.

  • Тайлсет (если он вам нужен): http://img.ctrlv.in/img/14/10/19/5443f44c7eb78.png codegolf — Пиксельная графика, эпизод 2: Отобразите карту 1–1 из Super Mario Bros.
    Вы можете создать свой собственный набор тайлов, подмножество или надмножество этого.
    Вы можете использовать свой набор тайлов как отдельный файл изображения или включить его в свой код (например, в base64). Если он отдельный, добавьте его размер в байтах к вашей партитуре.

  • Карта с координатами: http://goo.gl/c8xJIx или http://img.ctrlv.in/img/14/10/19/544373adc9f64.png codegolf — Пиксельная графика, эпизод 2: Отобразите карту 1–1 из Super Mario Bros.

  • Цвета:

Sky blue: #5C94FC
Black: #000000
Pink: #FCBCB0 (for the blocks and the castle)
Brown: #C84C0C (for the blocks and the castle)
Orange: #FC9838 (for the "?" block)
Light green: #80D010 (for bushes, mountains, flagpole, warp)
Dark green: #00A800 (for bushes, mountains, flagpole, warp)
White: #FCFCFC (clouds)
Light blue: #3CBCFC (clouds)

Самый короткий ответ побеждает.

РЕДАКТИРОВАНИЕ: Будет две таблицы результатов: одна, где очки подсчитываются в байтах, и другая, где они подсчитываются в символах.

Удачи!

P.S. Вот несколько примечаний, которые могут помочь вам оптимизировать вашу программу:

  • Облака, кусты и горы имеют повторяющийся рисунок (каждые 48 столбцов).
  • Летающие блоки присутствуют только в строках 4 и 8.
  • Каждый тайл или спрайт карты использует не более 4 цветов (включая синий или прозрачный, в зависимости от того, как вы его видите).
  • Кусты – это просто «верхушка облаков» с другой цветовой палитрой.
  • Одиночные, двойные и тройные кусты/облака можно легко сформировать, используя один и тот же мини-набор деталей размером 16x16 пикселей. Это также справедливо для одинарных и тройных гор.

#код-гольф #колмогоров-сложность #графический-вывод

Thurnetiehing


Рег
04 Sep, 2005

Тем
89

Постов
206

Баллов
681
  • 26, Oct 2024
  • #2

Машинный код x86, 1729 1619 1468 1382 байта

Как это работает: тайлы генерируются с помощью сочетания RLE-сжатия, 2-битных изображений и процедурного кода. После того как тайлы сгенерированы в памяти, программа создает матрицу индексов тайлов. Сначала загружается повторяющийся фон. После этого процедурно рисуются трубы, плавающие блоки, пирамиды и флагшток. Трубы, холмы, кусты и пирамиды могут простираться под землей, но закрываются, когда в следующий раз пишутся каменные плитки. Наконец, значения плиток замка просто копируются в нужное место.

Для создания файла изображения заголовок и палитра BMP сохраняются в файле как данные и записываются первыми. Затем программа проходит через матрицу, записывая соответствующую строку из соответствующей плитки для каждой позиции.

Использование: Запустите сайт mario.com, он сгенерирует «m.bmp», стандартный файл изображения BMP. Файл создается как скрытый файл, так как в итоге он оказался меньше байтов.

Загрузите ZIP-файл, содержащий исходный код и двоичный файл, а также выходные данные.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 document.write(unescape(escape('?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????').replace(/uD./g,'')))
 
||answer||

Ассемблерный код для создания исполняемого файла:

Минимизированный Javascript (*): 1285 1258 1253 1205 1186 1171 символов.

(*) Минимизировано с использованием Closure, RegPack и ObfuscaTweet, как предложено xem.

Версия Unicode имеет размер 4549 байт, без ObfuscaTweet (только Closure и Regpack), размер 2251 байт.

История: eval'+s/\d+(<?)(.+?)\1/$2x$&/ge'x2?$x|=$_: map{/A/&&y'{}['Y';push@l,split"";y/D-IMNOY[|_@-_/EF@EE}JKLY~__@/; s'@Y'YY'g;s'y@'yy'g;s'@E'DE'g;s'E@'EG'g}($x)x$_ for@z=qw(256@ 1 4<19@MNO14@MNNO8@<6@I 1 5<8@MNO16@M3NO16@< 2 22@X57@8T3@3TX14@X11@3T4@TXXT56@YY 3 203@3U 1 16@X3@TXTXT21@[|9@[|18@TXT14@T5@T5@X2@X2@X5@T10@2T6@Y2@y10@YY2@y12@TTXT31@QPS 1 5<2@H45@< 38@[|162@U3VU 1 5<17@H30@< 28@[|133@[|14@[|21@PPWPP 1 4<11@A3BC7@ABC15@ABBC3@<10@PPRPPC48@2<69Z2@15Z3@64Z2@101Z< 1); $p=GD::Image;use GD;$f=new$p(3392,224);$k=newFromPng$p('-'); copy$f($k,map$_*16,$i%256,$i++>>8,31&ord,0,1,1)for@l;print$f->png for 48 (thx @hsl), merged some of the perl mario.pl <tiles.png >world.png 1285 -> 1258: переменная from PIL import Image blockSize = 16 combined = Image.open("combined.png") tileImage = combined.crop((0,224,256,224+32)) w,h = tileImage.size tiles = [] for y in range(0,h,16): for x in range(0,w,16): tiles+=[list(tileImage.crop((x,y,x+blockSize,y+blockSize)).getdata())] referenceImage = combined.crop((0,0,3392,224)) w,h = referenceImage.size mapImage = Image.new("RGB", (w/blockSize, h/blockSize)) colorScale = 256/len(tiles) for y in range(0,h,16): for x in range(0,w,16): i = tiles.index(list(referenceImage.crop((x,y,x+blockSize,y+blockSize)).getdata())) mapImage.putpixel((x/16,y/16),(i*colorScale,i*colorScale,i*colorScale)) mapImage.save("map.png") and import PIL.Image as I O=I.open t=O("t") m=O("m").load() o=I.new("RGB",(3392,224)) s=16 for i in range(2968):y=i/212;x=i%212;v=s*m[x,y];o.paste(t.crop((v,0,v+s,s)),(x*s,y*s)) o.show() петли, объединены , используя индексы фрагментов вместо строк фрагментов, оптимизированный png с

PNGOUT var D, C, c, S, s, // Document, canvas and shadow canvas. R, F, Z, X, Ø, Å, // Due to the compression we have a couple of non-ascii K, // variable names. L = 'length', Y = 'fillStyle', u = 'split', U = 'join', f = [ '#000', '#c84c0c', '#fc9838', '#00a800', '#80d010', '#fcbcb0', '#3cbcfc', '#fcfcfc' ] ; /* ----------------------- data unpackeer and loader ------------------------ */ X='Å=!15d>KIRiE%>?D^?C^FVNBTJ@M^>>]ANtN?ZCW]@QM4Gb1>EVWEZAEZN@VfMI?MPckVAwNEZWNV'+ '>Q]@YT2n6d@%vN4Gb@MABMALT>JTABM>Qz@FCTI`ZEE@L?E@CDD{EE@L_A5G>%>IVEB_DHTCC{PC{H'+ 'Dzlz]A4o5d>KIR5G}LZ?YZIAZI`ZH]LE]BBVL>VBHXLEXBLMLAM3n7y$",2EEKIR&O30y$",2E}?Q6'+ '&o9y$",2EbD?Q6&n2pI`ZJNM`BRG~J`M`CRO9dBKIRibPC@NMBNB]6n0dBKIRib>C@CVBCE]6n1dBK'+ 'IR6n3y*",~1F0G%Ii%1R6Ob")",?-1n4y*",BK0G%1Ri%I6Ob")",In8dEKIRib"*",b1F0G%Ii%1R'+ '6O>%CCD8Gb")",An9p@ciuB?LFD?`RC?Ji~F?JRBc6OUdBKIAib1Bciu1>?JFDtDM>DV>DZ>DX>QtQ'+ 'M>QV>a>>PT>PwPr>Pa>s>WT[][M[V[Z[XAI]AIMAICAo1eKIREJ`NGuv`3G~>{AB@MC@JJ@SJES2o2'+ 'eKIREI`NGBKJ`2GCKAEABBfPT>PwPr>Pa>s>WT[V[Z[XAI]AIM^T^_^r^aA^vATA@VA@ZA@XAJ]AJS'+ 'O0dHKQFXRC{NzB@D@ZNG}r>>Z>@TBB@Mw>F?C[>>^MJ@VABTACVAE_3GF%Cr>EFMP_[FAO3dHKIFFB'+ 'FB[FNG}w>FMBHTFZ>HwDFS?HCACFJGFK@T>>>>{ZCCMF@VX>>PtPBE[CBACSO5dH%WBHL[ELBPLGbW'+ 'wQT@W@S[v@aABDLO4dH%1>?@JB?B4Gb1?]^>v@MJBCLGF]AVvESodHK?EF_@3G}w>FMBEMECMEt'+ 'Z>>HSndH%I?EF`zCBP|}XSt@a>BX>CaB`M>R>>>YMBREAo3duH?J6o4d~EPFiu`]@FP|bFDVREVN]N'+ '[>CEa[aAIV>`CAo6dEK?Cl?E7G}YF9GE%BHWG>K>BRMCF?DHBDDHBN@HBI{LJ@C3o7eKIRi>K?B@?@'+ 'MB?S>?CATSCMAEV@?V2o8eKIR6O6y(",E%H4&O7y(",bHCF3&O8y(",>%H4&&&#;Ø=Kxt3r@6X>8_'+ 'J1ZA3TJ6VA8>>@PM2D{5HM7F@L0ES2C@L5BS7zBU>JG>x>>>3a>6a>8rA1rA3_A6_A8T[M3>M5DM7P'+ 'S0FS2HS5CS7EMU@JG@x>M3PM6PM8HS1HS3ES6ES8BS?T3>T5DT7PBA0FBA2HBA5CBA7ETU@LGBx?M3'+ 'Hz6DM8E@J1FS3B@J6CS8>zPT2DBB5HT7FBL0EBA2CBL5BBA7{BU>LGu1PM3FM6HM8CS1ES3@S6BS8?'+ 'MDT2HT5FT7EBA0CBA2BBA5{A7>TU?LGE>3Z>6r>8VA1_A3MA6TA8tDM2HM5FM7ES0CS2BS5@S7>'+ 'MU?JGF%1^>2L>>4^@5s7^>8jA0lA1jA3lA5lA6l>U`|HB2N>>4f@6kB7f>9kJ0gL2kA3gJ5gA6g'+ '>UR|D%1`>>2`>>4N>>6L>>7L>>9fA1^A2^A4kA5jA6sUY|P%^Al>4s6`>>9lA1Lv4`v6^hL>>UsJ]5'+ 'I]9Qc4Rc9NIG1bL>>5^>9jA4lh`|1>%f>5k>9gA4R>hN|1@%1Y]6`c1Lc6[>UW]@a5?a9DPA4FPhCW'+ 'G1~kAR>>4g>6N>>9Rv1fA4Nv6khf>Ug>[>4W]9Yc4`c9LIG1uNvg>5f>6Rv0kA1Nv6fhR>>21k>L]5'+ '[>9Wc4Yc9`IG1E%IB6P7ALE8WB6N5`B5HI@6P7AJE8W@6N5`@57G1FX2>X2BX7Dm0Fm0Pm1@m7?'+ 'X2@V9CCA0PCA2PC2G1Hx?X2@X2CX7HX7PX9Cm0?m1Dm2PDJ6DDJ7>X8?CD9>CL2>CL2DCA3>NG1D%1'+ '3N>N4kN4g`5`>N8^W9gA3`?L4I?L4W?N5`?L8J?Q3FPJ4?PJ5?PL5EPJ8BPY3Hm4?m5>DJ5Em8CDR8'+ 'EH`8FFN8HEL8DC2G1Pxg>3g>4R>>5lA6Lv7s3Q]4R]5Y]4Fa5HWqb2s3s4l>5gA6Nv8k>3W]4Y]5Q]'+ '4Ha5DWq>xQc6Lc7W]3Da4FX5HQq@xWc6Nc8I]3Pa4HX5DQq~19Qc9DPhDDhDHhDFhDEhDChDBhDJqu'+ '19mqE%Uf@U`>@UJ?@U`?@Uf@U`>@UCXUBP3qF%U@PEUBH3qH%UNIqD%UNAqP%UBQG3bUEQ&&'; K = 126; // Key pos (char) counting down. ('B%?KAG@B@@p"%2_>>AC%]>j>H>G2e%O2O1DAY>I>W>6GA9Q>J>:K:%?A?%P>E1E>A>?>A?F>H1D>P'+ '1C>20B>@AF1D19,&GC1@>B1%?@1?17,&,6,5,8,4,3,>12,0,1,').match(/.{2}/g).forEach( function (v) { X = X[u](String.fromCharCode(K--))[U](v); if (K === 92) K = 91; } ); /* * Initially JSON, but got lost in compression work + a somewhat bad design * on the obj. to begin with. Is eval, at least for now. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ try { eval(X [u]('*')[U]('f') [u](')')[U]('d') [u]('(')[U]('b') [u]('&')[U](']') [u]('%')[U]('[') [u]('#')[U]('}') [u]('!')[U]('{') ); } catch (e) { console.warn(e); } // Scaling function function z(a) { return a.slice().map( function (v) { return v * Z; } ); } // Tile painter "normal tiles" function e(k, d, i) { for (s[Y] = k, i = 0; i < d[L];) s.rect.apply(s, z(d.slice(i, i += 4))); } // function _(d, i, q) { S.width = R; for (i = 0; i < d[L]; ++i) { s.beginPath(); F[q=d[++i][0]] ? F[q](d[i]) : e(f[d[i-1]],d[i]); s.fill(); } } F = { $ : function (d) { // Expand a tile (e.g. add border on top // of "normal" bricks as with the "in-air". _(Å[d[1]].concat(d.slice(2))); }, b : function (d) { // Replace colors. (Used for bushes.) _(Å[d[1]].slice().map( function(i,x){ return(x = d[2].indexOf(i)) > -1 ? d[2][++x] : i; } )); }, f : function (d, i) { // Free-paint (fill). E.g. "hill-sides" s[Y] = f[d[1]]; s.moveTo.apply(s, z(d[2])); for (i = 3; i < d[L]; ++i) s.lineTo.apply(s, z(d[i])); }, d : function (d, x, y, g) { // Diagonal lines. s[Y] = f[d[1]]; g = d[2] * Z; y = g > 0 ? 0 : 15 * Z; for (x = 0; x < 16 * Z; x += Z, y += g) s.rect(x, y, Z, Z); } }; // Main function. function xMx(h, k, i, j, t) { Z = h || 1; R = 16 * Z; D = document; C = D.getElementById('m'); // Doc canvas c = C.getContext('2d'); S = D.createElement('CANVAS'); // Memory canvas s = S.getContext('2d'); C.width = 3392 * Z; C.height = 224 * Z; c[Y] = '#5c94fc'; c.rect.apply(c, z([0, 0, 3392, 224])); // Blue sky (rest is tiles) c.fill(); for (k = 0; k < Ø[L]; ++k) { // Loop coordinate array. This has fixed _(Å[Ø[k]]); // order. t = Ø[++k]; for (i = 0; i < t[L]; i += 3) { for (j = 0; j < t[i+2] * R; j += R) c.drawImage(S, t[i] * R + j, t[i+1] * R); // Apply tile. } } } xMx(); // Load main. loops; renamed var tiles = { brick: [ ... ], qmark: [ ... ], }; 1258 -> 1253: объединено еще немного Total  : 3410   ; removed unnecessary braces; variable Decompressed data : 5608 (44,864 bits)  к Whole she bang : 2540   ); showing 1 unused row (replaces 14 with Code : 236   за 16; определение 16 неиспользуемых CSS-спрайтов (32 заменяются на Key : 128 ( 1,024 bits)  ; shortened Main data : 2176 (17,480 bits)  , Compression: , Main code  : 870 ); удаленная функция xMx() для сопоставления CSS удалено; CSS-имена K=126,f=['#000','#c84c0c','#fc9838','#00a800','#80d010','#fcbcb0','#3cbcfc','#fcfcfc'],X='Å=!15d>KIRiE%>?D^?C^FVNBTJ@M^>>]ANtN?ZCW]@QM4Gb1>EVWEZAEZN@VfMI?MPckVAwNEZWNV>Q]@YT2n6d@%vN4Gb@MABMALT>JTABM>Qz@FCTI`ZEE@L?E@CDD{EE@L_A5G>%>IVEB_DHTCC{PC{HDzlz]A4o5d>KIR5G}LZ?YZIAZI`ZH]LE]BBVL>VBHXLEXBLMLAM3n7y$",2EEKIR&O30y$",2E}?Q6&o9y$",2EbD?Q6&n2pI`ZJNM`BRG~J`M`CRO9dBKIRibPC@NMBNB]6n0dBKIRib>C@CVBCE]6n1dBKIR6n3y*",~1F0G%Ii%1R6Ob")",?-1n4y*",BK0G%1Ri%I6Ob")",In8dEKIRib"*",b1F0G%Ii%1R6O>%CCD8Gb")",An9p@ciuB?LFD?`RC?Ji~F?JRBc6OUdBKIAib1Bciu1>?JFDtDM>DV>DZ>DX>QtQM>QV>a>>PT>PwPr>Pa>s>WT[][M[V[Z[XAI]AIMAICAo1eKIREJ`NGuv`3G~>{AB@MC@JJ@SJES2o2eKIREI`NGBKJ`2GCKAEABBfPT>PwPr>Pa>s>WT[V[Z[XAI]AIM^T^_^r^aA^vATA@VA@ZA@XAJ]AJSO0dHKQFXRC{NzB@D@ZNG}r>>Z>@TBB@Mw>F?C[>>^MJ@VABTACVAE_3GF%Cr>EFMP_[FAO3dHKIFFBFB[FNG}w>FMBHTFZ>HwDFS?HCACFJGFK@T>>>>{ZCCMF@VX>>PtPBE[CBACSO5dH%WBHL[ELBPLGbWwQT@W@S[v@aABDLO4dH%1>?@JB?B4Gb1?]^>v@MJBCLGF]AVvESodHK?EF_@3G}w>FMBEMECMEtZ>>HSndH%I?EF`zCBP|}XSt@a>BX>CaB`M>R>>>YMBREAo3duH?J6o4d~EPFiu`]@FP|bFDVREVN]N[>CEa[aAIV>`CAo6dEK?Cl?E7G}YF9GE%BHWG>K>BRMCF?DHBDDHBN@HBI{LJ@C3o7eKIRi>K?B@?@MB?S>?CATSCMAEV@?V2o8eKIR6O6y(",E%H4&O7y(",bHCF3&O8y(",>%H4&&&#;Ø=Kxt3r@6X>8_J1ZA3TJ6VA8>>@PM2D{5HM7F@L0ES2C@L5BS7zBU>JG>x>>>3a>6a>8rA1rA3_A6_A8T[M3>M5DM7PS0FS2HS5CS7EMU@JG@x>M3PM6PM8HS1HS3ES6ES8BS?T3>T5DT7PBA0FBA2HBA5CBA7ETU@LGBx?M3Hz6DM8E@J1FS3B@J6CS8>zPT2DBB5HT7FBL0EBA2CBL5BBA7{BU>LGu1PM3FM6HM8CS1ES3@S6BS8?MDT2HT5FT7EBA0CBA2BBA5{A7>TU?LGE>3Z>6r>8VA1_A3MA6TA8tDM2HM5FM7ES0CS2BS5@S7>MU?JGF%1^>2L>>4^@5s7^>8jA0lA1jA3lA5lA6l>U`|HB2N>>4f@6kB7f>9kJ0gL2kA3gJ5gA6g>UR|D%1`>>2`>>4N>>6L>>7L>>9fA1^A2^A4kA5jA6sUY|P%^Al>4s6`>>9lA1Lv4`v6^hL>>UsJ]5I]9Qc4Rc9NIG1bL>>5^>9jA4lh`|1>%f>5k>9gA4R>hN|1@%1Y]6`c1Lc6[>UW]@a5?a9DPA4FPhCWG1~kAR>>4g>6N>>9Rv1fA4Nv6khf>Ug>[>4W]9Yc4`c9LIG1uNvg>5f>6Rv0kA1Nv6fhR>>21k>L]5[>9Wc4Yc9`IG1E%IB6P7ALE8WB6N5`B5HI@6P7AJE8W@6N5`@57G1FX2>X2BX7Dm0Fm0Pm1@m7?X2@V9CCA0PCA2PC2G1Hx?X2@X2CX7HX7PX9Cm0?m1Dm2PDJ6DDJ7>X8?CD9>CL2>CL2DCA3>NG1DN>N4kN4g`5`>N8^W9gA3`?L4I?L4W?N5`?L8J?Q3FPJ4?PJ5?PL5EPJ8BPY3Hm4?m5>DJ5Em8CDR8EH`8FFN8HEL8DC2G1Pxg>3g>4R>>5lA6Lv7s3Q]4R]5Y]4Fa5HWqb2s3s4l>5gA6Nv8k>3W]4Y]5Q]4Ha5DWq>xQc6Lc7W]3Da4FX5HQq@xWc6Nc8I]3Pa4HX5DQq~19Qc9DPhDDhDHhDFhDEhDChDBhDJqu19mqE%Uf@U`>@UJ?@U`?@Uf@U`>@UCXUBP3qF%U@PEUBH3qH%UNIqD%UNAqP%UBQG3bUEQ&&';'B%?KAG@B@@p"%2_>>AC%]>j>H>G2e%O2O1DAY>I>W>6GA9Q>J>:K:%?A?%P>E1E>A>?>A?F>H1D>P1C>20B>@AF1D19,&GC1@>B1%?@1?17,&,6,5,8,4,3,>12,0,1,'.match(/../g).forEach(function(v){X=X[u='split'](String.fromCharCode(K--))[U='join'](v);if(K==92)K=91});eval(X[u]('*')[U]('f')[u](')')[U]('d')[u]('(')[U]('b')[u]('&')[U](']')[u]('%')[U]('[')[u]('#')[U]('}')[u]('!')[U]('{'));function e(k,d,i){for(s[Y]=k,i=0;i<d[L];)s.rect[G](s,d.slice(i,i+=4))}function _(d,i,q){for(S.width=R,i=0;i<d[L];++i,s.fill(),s.beginPath())F[q=d[++i][0]]?F[q](d[i]):e(f[d[i-1]],d[i])}F={$:function(d){_(Å[d[1]].concat(d.slice(2)))},b:function(d){_(Å[d[1]].slice().map(function(i,x){return(x=d[2].indexOf(i))>-1?d[2][++x]:i}))},f:function(d,i){for(s[Y]=f[d[1]],s.moveTo[G](s,d[2]),i=3;i<d[L];++i)s.lineTo[G](s,d[i])},d:function(d,x,y,g){for(s[Y]=f[d[1]],g=d[2],y=g>0?0:15,x=0;x<R;++x,y+=g)s.rect(x,y,1,1)}};R=16;c.width=3392;c.height=224;;S=c.cloneNode();c=c[G='getContext']('2d');s=S[G]('2d');c[Y='fillStyle']='#5c94fc';c.rect[G='apply'](c,[0,0,3392,224]);c.fill();for(k=0;k<Ø[L='length'];++k)for(_(Å[Ø[k]]),t=Ø[++k],i=0;i<t[L];i+=3)for(j=0;j<t[i+2]*R;j+=R)c.drawImage(S,t[i]*R+j,t[i+1]*R) ; с использованием

где это возможно M() ; replaced some M 1253 -> 1205: стиль тела перемещен в часть CSS вместо xMx calls; optimized functions createElement('CANVAS') , cloneNode() ; getElementById() петли с var too; function eval кажется ненужным, 16, # there are 16 put commands 3, # place 3 tiles 8,2, # dest x, y 4,5,6, # these three tiles 3, # place 3 tiles 8,3, # dest x, y 20,21,22, # these three tiles 5, # place 4 tiles 27,2, # dest x, y 4,5,5,5,6, # these five ..., 8, # bits set if copy reversed (high 8 bits of a uint16 mask) 14, # there are 14 copy commands 8,2, # src x, y 3,2, # w, h to copy 19,1, # dest x, y 1,9, # src x, y 3,2, # w, h to copy 16,10, # dest x, y ..., 13, # there are 13 put commands ... 7, # bits set if copy reversed (high 8 bits of a uint16 mask) 15, # there are 15 copy commands ... .. /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4CGtA2JdAACA3BlsBrac0zEPcSPZ/qSCuw0fuG0WYiRk w+pNfoBEsFJBEXgxJ73nEPREKmuJUHyg+jhBTQcbUI0gChatJ7D6ZqYmLz4P34OFSxUMWF+aGhm2 +8mNqw264w0JIjW9ogeNpJX6pgH/xJ/D2qlfqfCuz0cOR1sPAAcMrue1y9joUaDauFLj8QhbExen lQkUMfMePbMnn4nJ0aVXBeHdKIwSeFQdFz/Aj695kKi0x8+MXR84cpNh3U8y7deiyjbNyIgu7vLn WBxzXhEtrV9svBETfQpxj2qYI11ALgWlhoxdoABE3ocVgE1Qo35dnoJe+1DJFvqIzFOoxSJEckUk T89RIjARdA/Ax6UTiitivZp4EhM+xczasrm+2XFy68mA96xmEMKp9ZpoApNIU0ShMMW1Im0QFeuS aCl43qJuintArMAeDiOlmkbDNzMzHZIgDFeklUnnKG9xHXPQXNQVyJ9I7z+rLHh1VtuXDyAErKTL VY/Xai2pIUlSt5H1KGEExdHu3O17XKbar11Jad6nFjDKOZFwamJQTFIG6dru2UXVJq29pGCnKLlB lOmls4agigMI7QJ5K/Rzf15ZuIQ7U9MKJ3E4llbwqs6vDk+Ln/ceRVfl5Fm/Ne056ZLDp6VIf5zs EMWra8UnjndkigqAyp8D62AcrPFIp9EdJmgiGzfhNCQ1JptRN/z01mNomtwVJfqeLTqgvRgXXG3P 8p+6s1rjEfblMBNyMxdYvJZXLE0wgu4xhH3fiNTT+RyTIJ1MZZ1zhksfe2SnNTbL2JYGven1WPfI YP+M4NI/vpQ4bGsuJ8w//x01GpkTLfMZtZgBhx0dx1Wu9i0JY9hhtoI2/tGR4sNHfpSs7xD/Zz+7 6Z18z3AQn4dC7Trp0WndI/zS8eRZlRgKxA/lb09MZ87ugbXnm2+oBQFSLEtg/rqg398pDWx9W4Zk 6GeRTqvp9CJ9meMagUnGHKnAj+05PE0XgEXO6r9B8ltgoHf0+wXFevBHVupfiH9MApUxd0TPzv16 Y5Rfjxao0wLcIbxKMd3vtI1rCvOdq0OysWNrtcH9EBKjx9+CnGFBFZI9w9kCMJ8ZT0m9nsNYPelL 29KbQMt+K213+7o0MS3DxeGTHSW9CiEOTzNeqvsXN6IcIxjJIkgH8MuAAAAA5PpImPBeeH8AAf4G rkMAALsE5byxxGf7AgAAAAAEWVo= instead of \t .. # 759808 is 212*14 tiles at 16*16 each - the size of the map import lzma;B,E,R,X=bytearray,759808,range,16 D=B(lzma.decompress(open("i","rb").read())+B(E)) # put canvas on end of data array i,P=8218,lambda x,y:8622+y*54272+x*X # 8622 is length of decompressed data def Q(s,n,d): # copies a 16x16 tile from s to d # n is the stride for the source s, which is different for put and copy for m in R(0,256,X):e=d+m*212;D[e:e+X]=D[s+m*n:s+m*n+X] for j in R(4): # there are 4 command sections j&=1;i+=1+j;r=D[i-1]<<8 # j is now truthy if this is a copy buffer for k in R(D[i]): # this many commands a,b,w,h,c,d=D[i+1:i+7];q=h>32 # unpack it; put doesn't use all these # do the put/copy for z in R(((a,h-32)[q],w*h)[j]):Q((D[(i+4+z,i+5)[q]]<<8,P(a+z%w,b+z//w))[j],1+211*j, (P(b+z,w),P(c+(z%w,w-z%w-4)[r&1],d+z//w))[j]) i+=((3+a,5)[q],6)[j&1];r>>=1 # move i to next command for y in R(2,11):Q(28<<8,1,P(198,y)) # special case flagpole o=open("o","wb");o.write(b"P6 3392 224 255 ") # header for PPM for c in D[8622:]:o.write(D[8192+c*3:][:3]) # decompress palette to RGB , 7 .. 7

вместо repeat() renamed to 1 1205 -> 1186: функция 7 that operates on an array with delta coding

; новая функция 0 ~ v for both clouds and bushes; removed some unnecessary semicolons

1186 -> 1171: холмы и перекосы в любой момент можно сделать «большими», нижние части перерисовываются каменными блоками; использовать function repeat(s, t) { var S=s; while(t-- > 1) S += s; return S; } function block(n) { return "<div style='background: url(data:;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgBAMAAAAPh7vXAAAAG1BMVEVclPwAAAAAqADITAyA0BD8/Pz8vLD8mDg8vPyQWLLUAAACwklEQVR4XrWWS4rjMBCGXcxjrfKje23hA4wRJNtJ8AEmi4JsTUD7phd9gkCOPSWN5OiRttsx8xGJ2CKpj99SJcVOW8bdv+miHd+U5VfxRaQDE/y61jz91FqpHrFSPb/rFRctXEW8KF668E31b+w/LG+BAOIXBOoh4uDX1c4ImCLIVFxcmaEKbSMYc4FXWz8QACKxLFBKyQLS02YCaAkEbAQ4CaBj//GuVJgANESnryRgBLqjZLquyxJAh9rx9GIEtGKcwKh6n8H+Q2G1DwQaYgFYJSCP+SPo0VKZ+HkkAj1WgcDre58IUCO2JLAsoPU4J3DmDLYmgI5MIN8Db68qEAA6X+lKp2cTwBfN4IS/DgSyY/je412g4er0RAL++PrvRYe/nheYTgEgOQSsTQCOUiwLWKUXFTcinAQa8ohGrEygNt1gWUAjCwSGJoG9FwCaOJFYlYAXwE8o9IhMjxfbjII+ED6CHxQgxLoESivgs0WHvy40GioursdIgFsxulYMDQWcko0IiGImgSWBES09FzdjWgh/jBqKiAXQFMCZX0OQUswIuOuq5zHywIQlAXR1paPIP25n/IRpd0aZiiRkighXQVpaOd20z+A4BI3w+2/XBzDB3HskUPPnYpozGc55AKULoGwfCHTdUwLImyiL4GoUrlkCIL2AFE8mgI57sYERIo3gdqXbjR3iCMq7QDufAH7CtDtjgcMhESAufzuzAvMn2wElsomYTSA8AeFJeCzQpQ8BkA34ZQMQaQBt2Zp5JoEVAjbCoxHIMjgR0wT1QXoBaRDPJJDtAWB7JhOAhgQSIQQLZSzQrt8DeR/Aevo/nSgApn/MQSaI7X0ABs8B2H6eUia02/tAPUzUSwIgM8TmPjAEHGBdAEy7tQ/gEFKLdQEwYlsfgCFGrAuAaZME/qMAyIeIbX2gjgQOawNg2rV74C9KQ+xyNDQoswAAAABJRU5ErkJ)-" + (n) * 16 + "px -" + (n/16|0) * 16 + "px; width: 16px; height: 16px; float: left; }'></div>"; } function blocks(s) { var S=""; for(var i in s) S += block(parseInt(s[i], 32)); return S; } var output = "<body style=width:3392px>"; output += repeat(block(7), 212); output += repeat(blocks("777777777777777777745677777777777777455677777777"), 4); output += blocks("777777c7777777777777"); output += repeat(blocks("7777777745677777777klm77777455567777kllm77777777"), 4); output += blocks("777777s7456777777777"); output += repeat(blocks("77777777klm7777777777777777klllm7777777777777777"), 4); output += blocks("777777s7klm777777777"); output += blocks("777777777777777777777737777777777777777777777777777777777777777777777777777777772222222277722237777777777777737777777777722277772332777777777777777777777777777777777777777777777777777777770077777777s7777777777777"); output += blocks("777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777700077777777s7777777777777"); output += blocks("777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777000077777777s7777777777777"); output += blocks("777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777770000077777777s7777ddd777777"); output += blocks("7777777777777777377723232777777777777777777777ab777777777ab7777777777777777772327777777777777727777727777737737737777727777777777227777770770777777777700770777777777777223277777777777700000077777777s7777tgv777777"); output += blocks("77877777777777777777777777777777777777ab777777qr778777777qr7777777777777777777777777777777777777778777777777777777777777777777777777777700770077778777000770077777777777777777777777777000000077778777s777dfffd77777"); output += blocks("7nop777777777777787777777777ab77777777qr777777qr7nop77777qr77777787777777777777777777777777777777nop777777777777787777777777777777777770007700077nop700007700077787ab77777777777777ab700000000777nop77s777ggegg77877"); output += blocks("no9op777777hiiijnop7777hij77qr77777777qr7hiij7qrno9op7777qrhiiijnop7777hij777777777777777hiij777no9op777777hiiijnop7777hij7777777777770000ii0000no9o00000770000jnopqr77hij777777777qr00000000077no9op70777gguggjnop7"); output += repeat( repeat(block(1), 69) + blocks("77") + repeat(block(1), 15) + blocks("777") + repeat(block(1), 64) + blocks("77") + repeat(block(1), 57), 2); document.write(output); is filled with tile indices. See the commented unminified version for more details.

Это процедурная попытка. Повсюду узоры, одно из магических чисел — 48 (просвет плитки между облаками, кустами и горами). Набор плиток кодируется как строка URL-адреса данных Base64 и используется в качестве таблицы стилей CSS. В Javascript массив 212x14 Работает в Chrome 38 (Ctrl+T для новой вкладки, Ctrl+Shift+J для консоли javascript, вставьте туда код) и Firefox 33 (если обернут тегами HTML javascript). ЕстьВерсия JS-бина

, слишком.

Еще есть место для оптимизации, я буду публиковать обновления, и было бы неплохо, если бы кто-нибудь из людей, занимающихся JS/CSS/HTML, мог предложить оптимизации/исправления.

function R(s,t){return new Array(t+1).join(s)} function b(n){return"<div style='background: url(data:;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgBAMAAAAPh7vXAAAAG1BMVEVclPwAAAAAqADITAyA0BD8/Pz8vLD8mDg8vPyQWLLUAAACwklEQVR4XrWWS4rjMBCGXcxjrfKje23hA4wRJNtJ8AEmi4JsTUD7phd9gkCOPSWN5OiRttsx8xGJ2CKpj99SJcVOW8bdv+miHd+U5VfxRaQDE/y61jz91FqpHrFSPb/rFRctXEW8KF668E31b+w/LG+BAOIXBOoh4uDX1c4ImCLIVFxcmaEKbSMYc4FXWz8QACKxLFBKyQLS02YCaAkEbAQ4CaBj//GuVJgANESnryRgBLqjZLquyxJAh9rx9GIEtGKcwKh6n8H+Q2G1DwQaYgFYJSCP+SPo0VKZ+HkkAj1WgcDre58IUCO2JLAsoPU4J3DmDLYmgI5MIN8Db68qEAA6X+lKp2cTwBfN4IS/DgSyY/je412g4er0RAL++PrvRYe/nheYTgEgOQSsTQCOUiwLWKUXFTcinAQa8ohGrEygNt1gWUAjCwSGJoG9FwCaOJFYlYAXwE8o9IhMjxfbjII+ED6CHxQgxLoESivgs0WHvy40GioursdIgFsxulYMDQWcko0IiGImgSWBES09FzdjWgh/jBqKiAXQFMCZX0OQUswIuOuq5zHywIQlAXR1paPIP25n/IRpd0aZiiRkighXQVpaOd20z+A4BI3w+2/XBzDB3HskUPPnYpozGc55AKULoGwfCHTdUwLImyiL4GoUrlkCIL2AFE8mgI57sYERIo3gdqXbjR3iCMq7QDufAH7CtDtjgcMhESAufzuzAvMn2wElsomYTSA8AeFJeCzQpQ8BkA34ZQMQaQBt2Zp5JoEVAjbCoxHIMjgR0wT1QXoBaRDPJJDtAWB7JhOAhgQSIQQLZSzQrt8DeR/Aevo/nSgApn/MQSaI7X0ABs8B2H6eUia02/tAPUzUSwIgM8TmPjAEHGBdAEy7tQ/gEFKLdQEwYlsfgCFGrAuAaZME/qMAyIeIbX2gjgQOawNg2rV74C9KQ+xyNDQoswAAAABJRU5ErkJ)-"+(n)*16+"px -"+(n/16|0)*16+"px;width:16px;height:16px;float:left}'></div>"} function M(s){m="";for(_ in s)m+=b(parseInt(s[_],32));return m} function C(s,a){c="";for($ in a)c+=$%2?M(a[$]):R(s,a[$]);return c} O="<body style='width:3392px'>"; O+=R(s=b(7),212); O+=R(C(s,[19,"456",14,"4556",8]),4); O+=C(s,[6,"c",13]); O+=R(C(s,[8,"456",8,"klm77777455567777kllm",8]),4); O+=C(s,[6,"s7456",9]); O+=R(C(s,[8,"klm",16,"klllm",16]),4); O+=C(s,[6,"s7klm",31,"3",57,"222222227772223",14,"3",11,"22277772332",56,"00",8,"s",200,"000",8,"s",199,"0000",8,"s",198,"00000",8,"s7777ddd",22,"377723232",21,"ab",9,"ab",18,"232",14,"2777772777773773773777772",10,"22",6,"0770",10,"00770",12,"2232",12,"000000",8,"s7777tgv",8,"8",35,"ab",6,"qr778",6,"qr",39,"8",37,"007700777787770007700",26,"000000077778777s777dfffd",6,"nop",13,"8",10,"ab",8,"qr",6,"qr7nop",5,"qr",6,"8",31,"nop",13,"8",21,"0007700077nop700007700077787ab",14,"ab700000000777nop77s777ggegg77877no9op",6,"hiiijnop7777hij77qr",8,"qr7hiij7qrno9op7777qrhiiijnop7777hij",15,"hiij777no9op",6,"hiiijnop",4,"hij",12,"0000ii0000no9o00000770000jnopqr77hij",9,"qr00000000077no9op70777gguggjnop7"]); O+=R(C(b(1),[69,"77",15,"777",64,"77",57]),2); document.write(O);

Минимизировано:

eval(unescape(escape('???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????').replace(/uD./g,''))) ||answer||

Не минифицировано и прокомментировано:

Javascript, 1069 1072 1024 символов (1957 байт) RegPacked и

// map width W=212; // helper constants A=48;B=16; // array containing the map, generated at runtime m=[]; function w(s){document.write(s)} // set a map tile function N(i,s){m[i]="b"+s.toString()} function n(i,s){z=0;for($ in i){z+=i[$];N(z,s)}} // set a row of map tiles (index a..a+b) function f(a,b,s){for(k=a;k<=a+b;)N(k++,s);} // set a block of map tiles (index a and b define upper left and lower right corner) function g(i,j,s){for(x=i%W;x<=j%W;x++)for(y=i/W|0;y<j/W|0;)N(y++*W+x,s)} // helper for clouds and bushes - j=1..3 sets map tiles to XYZ, XYYZ or XYYYZ function c(i,j,a){N(i,a);f(i+1,j-1,a+1);N(i+j+1,a+2)} // clouds/bushes function d(i,j,a){c(i,j,a);c(i+W,j,a+16)} // hill function p(i){N(i+2,8);n([i+213,211],23);n([i+214,211,2],24);n([i+215,213],25);N(i+426,9)} // warps function q(i){N(i,10);N(i+1,11);l(i+W,3,26);l(i+213,3,27)} // stairs - d=1 for upwards, d=0 for downwards function r(i,d){for(j=0;j<4;j++)f(i+d*(3-j)+j*W,j,0);} // set a column of map tiles (index i, height j) function l(i,j,s){for(k=0;k<j;k++)N(i+k*W,s);} // fill map with sky tiles f(0,2967,7); // clouds and bushes - some of the bushes will be overdrawn by blocks and the castle, so draw them first for(i=0;i<4;i++){d(231+i*A,1,4);d(248+i*A,2,4);d(451+i*A,3,4);d(432+i*A,1,4);d(2343+i*A,3,17);d(2355+i*A,1,17);d(2373+i*A,2,17)}d(624,1,4);N(2539,19) // '?' blocks n([870,72,15,20,1,734,5,2,55,28,3,3,58],3) // brick blocks and castle f(928,7,2);f(939,2,2);f(969,2,2);n([976,3,737,2,2,53,2,15,6,18,11,1,38,1,2],2);N(1900,B);g(2322,2535,B);g(2325,2538,B);f(1687,2,13);N(1899,29);N(1901,31);f(2110,4,13);f(2111,2,15);N(2324,14);N(2536,30) // big and small hills - one of the big hills will be overdrawn by the stairs, the small hills are big hills overdrawn by stone blocks for(i=0;i<5;i++){p(1908+i*A);p(2135+i*A)} // warps (often overdrawn by stone blocks), stairs and block below pole q(1742);q(1753);q(1946);q(2148);q(2283);q(2299);r(1830,1);r(1844,1);r(1877,1);r(1033,1);r(1836,0);r(1851,0);g(1881,2520,0);l(1037,4,0);l(1848,4,0);l(1885,4,0) // pole N(410,12);l(622,9,28);N(2530,0) // lower row of stone blocks f(2544,423,1); // gaps in stone blocks g(2613,2826,7);g(2630,2844,7);g(2697,2910,7) // HTML start and CSS spritesheet base (tileset PNG encoded as base64) w("<style>body{width:3400px}div{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgBAMAAAAPh7vXAAAAG1BMVEVclPwAAAAAqADITAyA0BD8/Pz8vLD8mDg8vPyQWLLUAAACwklEQVR4XrWWS4rjMBCGXcxjrfKje23hA4wRJNtJ8AEmi4JsTUD7phd9gkCOPSWN5OiRttsx8xGJ2CKpj99SJcVOW8bdv+miHd+U5VfxRaQDE/y61jz91FqpHrFSPb/rFRctXEW8KF668E31b+w/LG+BAOIXBOoh4uDX1c4ImCLIVFxcmaEKbSMYc4FXWz8QACKxLFBKyQLS02YCaAkEbAQ4CaBj//GuVJgANESnryRgBLqjZLquyxJAh9rx9GIEtGKcwKh6n8H+Q2G1DwQaYgFYJSCP+SPo0VKZ+HkkAj1WgcDre58IUCO2JLAsoPU4J3DmDLYmgI5MIN8Db68qEAA6X+lKp2cTwBfN4IS/DgSyY/je412g4er0RAL++PrvRYe/nheYTgEgOQSsTQCOUiwLWKUXFTcinAQa8ohGrEygNt1gWUAjCwSGJoG9FwCaOJFYlYAXwE8o9IhMjxfbjII+ED6CHxQgxLoESivgs0WHvy40GioursdIgFsxulYMDQWcko0IiGImgSWBES09FzdjWgh/jBqKiAXQFMCZX0OQUswIuOuq5zHywIQlAXR1paPIP25n/IRpd0aZiiRkighXQVpaOd20z+A4BI3w+2/XBzDB3HskUPPnYpozGc55AKULoGwfCHTdUwLImyiL4GoUrlkCIL2AFE8mgI57sYERIo3gdqXbjR3iCMq7QDufAH7CtDtjgcMhESAufzuzAvMn2wElsomYTSA8AeFJeCzQpQ8BkA34ZQMQaQBt2Zp5JoEVAjbCoxHIMjgR0wT1QXoBaRDPJJDtAWB7JhOAhgQSIQQLZSzQrt8DeR/Aevo/nSgApn/MQSaI7X0ABs8B2H6eUia02/tAPUzUSwIgM8TmPjAEHGBdAEy7tQ/gEFKLdQEwYlsfgCFGrAuAaZME/qMAyIeIbX2gjgQOawNg2rV74C9KQ+xyNDQoswAAAABJRU5ErkJggg==)}") // generate CSS classes 'b0'..'b31' for the 32 used tiles // this actually generates 16 additional unused classes to reuse the constant A and save 1 byte for(i=0;i<A;i++){j=(i%B)*-B;k=i>15?-B:0;w(".b"+i.toString()+"{background-position:"+j+"px "+k+"px;width:16px;height:16px;float:left;}")} // some more HTML w("</style>") // body of HTML contains all tiles as <div> elements arranged in <span> columns for(x=0;x<W;x++){w("<span class=b0>");for(y=0;y<B;){w("<div class="+m[y++*W+x]+"></div>")}w("</span>")}

Obfuscat написал в Твиттере

Необфусцированный код

eval(unescape(escape('???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????').replace(/uD./g,'')))

Я скрыл этот код, потому что ниже есть неиспользуемый код.

m

Негольфированный код d (which is 0 ~ 31 in base 31) represents each tile.

Сначала я превратил тайлы в спрайты с помощью URI минимизированных данных @schnaader.

И я вручную конвертировал карту в тайлы. Эти данные имеют 212 символов в строке. n (sky) and N Затем я заменил повторяющийся символ (например, n .

(земля)) с ff s and some blocks, and another aa я нашел

узор повторяется. Поэтому я сделал еще одну функцию, чтобы сделать ее компактной. Вы можете увидеть это в незашифрованном исходном коде.

Наконец я RegPacked и Obfuscat твитнул мой код размером 2341 байт.

Это был очень забавный вызов. Спасибо! И спасибо @xem за дополнительные трюки.

 

Law794skestSoky


Рег
30 Mar, 2020

Тем
75

Постов
222

Баллов
627
  • 26, Oct 2024
  • #3

Python3 1638 1576 1616 1513 байт

581 код + 932 данные

z

↑ Эта вершина — оригинальный уровень. В середине находится PPM, созданный этим скриптом. Внизу диф, и это показывает, что палитра и карта не совсем совпадают! Я объяснил это сбоем данных, а не моим скриптом;) a )

(байты считаются без комментариев, строка разворачивается, отступ второго уровня

b31

Данные (в кодировке Base64 для вставки; декодируйте и сохраните как файл с именем «i»):

Файл данных представляет собой специальный формат, который я создал для этой задачи, и хранится как LZMA.

Сначала сериализуются все 32 тайла. В палитре 9 цветов, и это занимает 8219 байт в несжатом виде. (Я обнаружил, что попытка сжать тайлы с разрешением 4 бита на пиксель вообще не помогает сжатию. Я не пытался грубо подобрать наилучший порядок тайлов, и, вероятно, я теряю здесь несколько очков.)

Карта состоит из 212x14=2968 блоков.

Тогда инструкции по воссозданию карты теперь закодированы.

Сначала идет раздел команд «put», которые помещают некоторую последовательность плиток из палитры плиток на карту в определенные точки x,y. Поскольку плиток 32, я указываю серию одной и той же плитки, используя число больше 32, а не индекс плитки.

Затем идет раздел команд «копирования», которые копируют некоторый прямоугольник текущей карты в другое место. Существует специальная битовая маска, которая отмечает, должна ли копия быть зеркальной.

b0

Краткий пример командного буфера: (Я сказалкороткий

, но на самом деле это почти половина общего командного буфера, необходимого для создания всей карты; подавляющее большинство байтов данных — это сами 32 исходных тайла)

Затем следует второй раздел команд «поместить» и, наконец, еще один раздел команд «копирования».

Я, несомненно, могу срезать еще несколько байт, например, повернув ставит на маленький копии и, выполнив t(i) trick on a gzipped source-code, or playing with PNG (which is DEFLATE with image-specific filters) too. But I like things verbose as they are.

 

AHMAD NUR SHOFA


Рег
02 Aug, 2011

Тем
80

Постов
199

Баллов
629
  • 26, Oct 2024
  • #4

JavaScript: 3620 (ой) 3429 3411


Обновления

  • Обновление №1: Удаленный <html><head> definitions and put the variable declarations inside brackets of first use. Removed </head><body> поскольку он также доступен при загрузке как переменная по идентификатору. С использованием q instead of r . Переименован основной от f to for . Удалена функция масштабирования :(, (все еще доступно в примере.)

    Добавлены некоторые комментарии к расширенному коду. (Этот код не обновляется при удалении. Строка ниже: («Мини-код»), является.)

  • Обновление №2: Удалена основная функция <body style=...> as a whole and let the code run at корень. Для этого потребуется разместить код внутри оболочки загрузки или в конце документа.

  • Обновление №3: Добавлена ​​статистика.


Мини-код:

for(i=0;i<n;i++)f(i)

Бла-бла:

— Демо в конце поста.

С использованием холст в качестве основы для попытки решить эту проблему. В итоге у меня получилось около 6000 символов, но после некоторой возни (и специального сжатия, а также с доработками и настройками) я теперь достиг заявленного числа. Все еще высоко, но опять же качество хорошее ;-).

Он также включает опцию масштабирования, первый аргумент for(i=0;i<n;)f(i++) , aka "основной" функция. 1 = нормальный размер (как в 16-битных тайлах). Здесь не так много возможностей для настройки, поэтому, если использовать дроби, некоторые плитки не будут лучше всего сочетаться друг с другом. В целых числах все должно быть в порядке. [1]

Но: предупреждение, поднимаясь вверх, быстро съедает ресурсы и делает огромное полотно. (Все рисуется за один раз.) Когда исходная ширина составляет 3392 пикселя, он быстро становится огромным. [1]

[1] Начиная с обновления №1 это было удалено. Он присутствует в демо-версии.


Статистика:

  • c()
  • g()
    • t()
    • e()
    • B
    • A
    • B
  • r() [1]

[1]: +1 байт, «;», между основным кодом/кодом данных.

Сжатые данные представляют собой один массив Å и один "объект", Ø. Где Å содержит размещение плитки, а Ø содержит данные для покраски плиток. Ø тоже должен был быть массивом, но поскольку мой код начинался примерно так:

mt()

Закончилось всё как есть. Возможно, я посмотрю, смогу ли я это исправить. В идеале я бы сделал его доступным для анализа с помощью JSON вместо eval(), но в таком конкурсе это не имело бы смысла. В настоящее время его невозможно проанализировать в формате JSON из-за отсутствия кавычек вокруг частей идентификатора.


Демо

Вот скрипт, где можно увидеть код в действии. Код в скрипке я несколько расширил (и добавил некоторые стили HTML/CSS). вокруг мир – но образ самого себя самодостаточен.):

МИР МАРИОСА


Расширенный код:

Расширен и (немного) переработан код:

for ||answer||

Питон 1331 1326 1314 1272 1268 1217 байт

(код: 219 214 202 186 182, данные: 362+750=1112 363+723=1086 346+689=1035)

Идея здесь в том, что я сначала генерирую карту размером в 16 раз в каждом измерении, где каждый пиксель раскрашивается в соответствии с индексом в тайловой карте. Чтобы гарантировать, что использовалась одна и та же палитра, я сначала объединил данную тайловую карту и карту в одно изображение. Из этого и тайловой карты (обе мини-изображения в формате PNG) мы теперь можем восстановить исходную карту. (Код этого процесса можно увидеть под кодом отправки). Следует отметить, что я сохранил тайловую карту как файл «t», а сгенерированную карту — как изображение «m».

РЕДАКТИРОВАНИЕ: я начал изучать, как порядок плиток влияет на сжатие, и ради исследования я сгенерировал 10 000 случайных перестановок и сжал их с таким результатом: Это все было с плитками в одну строку, так как это немного сократило код. Я пробовал подобные вещи с разными конфигурациями (2*16, 4*8), но ни один из них не дал лучшего среднего результата.

Предположив, что PNG будет лучше сжиматься с более непрерывными похожими областями, я создал инструмент, который позволял мне перемещать плитки, и, используя то, что я считал более непрерывным изображением, я уменьшил изображение плитки с 750b до 723.

РЕДАКТИРОВАТЬ 2: После значительного (гораздо) дополнительного анализа того, как на самом деле работает png, и большого количества экспериментов (все еще продолжающихся), изображения теперь были сжаты еще больше. Ссылка ниже обновлена. Подробнее об этом анализе я напишу позже, когда он будет завершен.

Новые использованные изображения находятся здесь: http://imgur.com/a/RgkXx

Вот другие изображения, созданные в процессе: http://imgur.com/a/HXTGA, хотя некоторые из них немного устарели из-за приведенных выше изменений.

mu()

Сценарий, который я написал для уменьшения карты, довольно сырой, но вот он (также может быть устаревшим из-за изменений выше):

mt() ||answer||

Перл 5 + PNG: 689 + 593 = 1282

Неудачная попытка заменить сжатую карту тайлов в формате PNG из решения Кристиана кодом Perl. В итоге он стал на 65 байт длиннее. Берет те же PNG-плитки на входе и генерирует PNG на выходе.

Использование: for

A ||answer||

JS: 4012 3921 символ

JS используется для распаковки многих символов Юникода и записи тега img, src которого представляет собой изображение, указанное в OP, сохраненное как PNG, сжатое, закодированное в base64 и обрезанное.

org 100h code_start: ;xor cx,cx mov cx,12+14+256*3 mov dx,filename mov ah,0x3c int 21h mov bx,ax push ax ;mov dx,BITMAPFILEHEADER inc dx inc dx mov ah,0x40 int 21h mov di,tiles xor ax,ax mov ch,48 rep stosw cwd ; load the cloud sprite mov si,cloud call DrawSprite call DrawHill mov dx,14*256+12*16 PipeTileLoop: ;Pipe mov si,pipe0 call DrawSprite sub dh,2 jns PipeTileLoop mov dx,32+12*16 call DrawSprite mov dh,13 ;mov si,pipe2 call DrawSprite cwd xor ax,ax ; move to the tile array mov cl,6 MoveTileLoop: call MoveTile loop MoveTileLoop mov word [BITMAPFILEHEADER+5+2],0x607 ; bushes sub dl,3*16 mov cl,13 jnc MoveTileLoop mov dx,0x1004 mov si,ball call DrawSprite mov dl,0 call MoveTile xor bx,bx ; pole pole: mov word[bx+tiles+22*256+7],0x707 add bl,16; jnc pole mov word [BITMAPFILEHEADER+5+2],0x805 ; qbrick mov si,qbrick call DrawSprite call MoveTile mov byte[BITMAPFILEHEADER+5+3],4 mov al,1 ; bricks & castle call Clear mov al,23 call MoveTile ; black door mov dx,0x800+64 BrickLoop: xor dh,8 mov si,bricks call DrawSprite sub dl,dh jg BrickLoop cwd call MoveTile ; left window call MoveTile ; castle brick mov al,3 mov di,image+15*256+16 mov cl,16 rep stosb mov al,26 mov dl,16 call MoveTile ; reg brick ;mov dl,32 ;mov si,door call DrawSprite ;mov dl,32 call MoveTile ; door top mov dx,48 +8*256 ;mov si,cren call DrawSprite push si mov dh,0 call MoveTile ; crenulation 1 mov si,image+48+256 +4 mov di,image+48+256*9+4 mov bl,7 CrenLoop: mov cl,7 rep movsb mov dl,256-7 add si,dx add di,dx dec bx jnz CrenLoop mov dl,3*16 call MoveTile ; crenulation 2 pop si mov cl,3 jmp skip LastLoop: ;call MoveTile ; right window ; block ; rocks call DrawSprite skip: call MoveTile loop LastLoop xor ax,ax ; Begin drawing world using the tiles call Clear mov bl,48*4 BackgroundLoop: lea di,[bx+image+2*256] SmallHill: mov al,10 mov cl,5 HillRow0: stosb inc ax loop HillRow0 mov dword [di+256-4],10+11*256+256*256*14 mov byte [di+512-3],15 sub di,256-10 cmp di,image +256 ja SmallHill mov si,fluff ; draw clouds, bushes FluffDrawLoop: lodsw add ax,bx add ax,image xchg ax,di lodsb aam mov cl,ah ;call DrawFluff; mov ah,1 FluffLayer2: stosb inc ax push cx rep stosb inc ax stosb pop cx add di,256-2 sub di,cx inc ax dec ah jns FluffLayer2 cmp si,pa jl FluffDrawLoop sub bl,48 jnc BackgroundLoop ;mov si,pa mov cl,6 PipePlace: lodsw xchg bx,ax mov di,image mov word [bx+di],18+19*256 PipeLoop: dec bh mov word[bx+di],16+17*256 jnz PipeLoop loop PipePlace ;mov si,dba ; draw the various floating blocks mov cl,4 DrawBlockLoop: lodsw xchg ax,bx mov ah,bl cwd lodsb BlockLoop: mov bl,al mov byte [bx+di],ah lodsb cmp al,dh mov dh,al ja BlockLoop dec si loop DrawBlockLoop mov bx,198+256*12 FlagPole: ; Draw flag pole mov byte [bx+di],22 dec bh jg FlagPole inc si ;mov si,pyr ; pyramid blocks mov cl,8 PyrMainLoop: lodsw shr ah,1 cwd inc dx jnc NoNeg neg dx NoNeg: mov bx,ax PyrDrawLoop: mov byte [bx+di],32 dec bh jnz PyrDrawLoop add ax,dx dec ah jnz NoNeg loop PyrMainLoop ;mov si,ground ; ground blocks ;mov di,image mov bl,4 push di GroundLoop: lodsb xchg ax,cx mov al,33 rep stosb lodsb add di,ax dec bx jnz GroundLoop push si inc ch mov si,di sub si,cx rep movsb pop si pop di ;push di ;mov si,copy ; Draw Castle, flag ball mov dl,6 CopyLoop: lodsw mov cx,ax shr cx,12 and ah,15 xchg bx,ax CopyRun: lodsb mov [bx+di],al inc bx loop CopyRun dec dx jnz CopyLoop; xor ax,ax xor bx,bx ; image y ; write the image to file pop dx WriteTileStep: WriteRowStep: mov bl,0 ; image x WriteStep: pusha mov ah,[bx+di] mov bx,dx add ax,tiles xchg ax,dx mov cl,16 mov ah,0x40 int 21h popa inc bx cmp bl,212 jb WriteStep add al,16 jnz WriteRowStep inc bh cmp bh,14 jl WriteTileStep ;pop bx ;mov ah,0x3e ;int 21h ;ret DrawSprite: ; dx=x,y, si=data pusha mov bp,dx ;cwd mov di,temp push di lodsw ; w, h*2+flag mov dl,al shr ah,1 pushf mul ah xchg bx,ax popf jc BitMapped RunLoop: lodsb mov cl,al shr cx,2 sub bx,cx rep stosb jnz RunLoop jmp MoveData BitMapped: BitMappedLoop: lodsb mov cl,4 BitMappedQuad: stosb shr ax,2 loop BitMappedQuad sub bx,4 jg BitMappedLoop MoveData: mov bx,sp mov [bx+4],si pop si mov bx,di lea di,[bp+image] mov dh,-1 MoveLoop: mov cl,dl rep movsb sub di,dx cmp si,bx jl MoveLoop popa ret MoveTile: ; dx =x,y, bx=y,ax=t-1 inc ax pusha mov si,dx xchg al,ah xchg di,ax mov ax,16 TileLoop: mov cl,16 TileTrans: mov bx,[si+image] inc si and bx,3 mov bl,[bx+BITMAPFILEHEADER+5] mov [di+tiles],bl inc di loop TileTrans add si,256-16 dec ax jnz TileLoop popa add dl,16 ret Clear: ; al = value mov di,image mov ch,48 rep stosb ret; DrawHill: pusha xor bx,bx mov al,3 HillLoop: lea di,[bx+image+6*16] inc byte [di] inc di mov cl,16*5-2 sub cl,bl sub cl,bl rep stosb inc byte [di] inc bx inc bh cmp bl,16 jl HillLoop mov si,spot push si mov dx,32-7+256*8 + 6*16 call DrawSprite mov dl,32+17 + 6*16 pop si call DrawSprite mov dx,5*16 + 6*16 call DrawSprite popa ret filename: db 'm','.' BITMAPFILEHEADER: db 66,77,'P',0,12,0,1,2,3,0,26,3,0,0 BITMAPCOREHEADER: db 12,0,0,0,64,13,224,0,1,0,8,0 colors: db 252,148,92,0,0,0,252,252,252,252,188,60,176,188,252,12,76,200,0,168,0,16,208,128,56,152,252 ;pal: db 0,1,2,3 cloud: db 88,32,224,5,114,5,228,5,122,5,224,5,122,5,228,9,106,5,6,5,240,102,5,4,5,240,5,86,5,10,5,252,5,78,5,4,5,6,5,252,4,13,66,5,8,5,92,13,16,17,136,5,14,7,42,5,100,9,14,5,4,9,18,9,4,9,120,5,14,11,14,7,18,5,96,5,26,5,34,5,10,9,116,5,26,7,22,5,84,13,18,11,18,15,34,9,108,5,38,5,6,5,84,5,22,27,6,23,38,108,5,34,5,4,5,88,5,10,19,14,19,18,7,34,5,108,9,26,5,92,5,10,7,10,7,26,7,54,5,120,5,18,5,92,5,10,7,46,7,46,5,128,17,56 spot: db 6,17,245,95,255,245,93,87,127,245,87,127,245,223 hilltop: db 16,3*2,0x9, 0x33, 0x9, 0x8, 0xD, 0x1B, 0xD, 0x1C, 0x19, 0x14 ball: db 8,17,80,5,244,31,253,127,253,127,249,127,249,127,228,31,80,5 pipe0: db 64,5,0x90,0xFA,0xAA,0xAE,0xFF,0xFF,0xBB,0x06,0xA9,0xAF,0xAA,0xEB,0xFF,0xFF,0xBB,0x6B,0x90,0xFA,0xAA,0xAE,0xFF,0xFF,0xAE,0x06,0xA9,0xAF,0xAA,0xEB,0xFF,0xFF,0xEF,0x6A pipe1:db 32,4,8,113,8,129 pipe2:db 32,12,5,23,26,79,9,122,133 qbrick: db 16,33,85,85,85,85,254,255,255,127,222,255,245,119,254,191,246,127,254,191,254,127,254,255,245,127,254,191,246,127,254,191,86,127,254,215,106,127,254,218,107,127,254,218,107,127,254,90,233,127,254,171,250,127,222,255,255,119,254,255,255,127,168,170,170,42 bricks: db 8,16,33,14,5,30,5,30,5,18,33,30,5,30,5,30,5 door: db 16,32,0xFD, 0xFD, 0x89, 0x6, 0x39, 0xA, 0x39, 0x6, 0x41, 0xA, 0x31, 0x6, 0x5, 0xE, 0x29, 0xA, 0x5, 0x16, 0x19, 0x12, 0x5 cren: db 16,17,213,255,255,85,234,0,192,170,234,0,192,170,234,0,192,170,234,0,192,170,234,0,192,170,234,0,192,170,255,0,192,255 block: db 16,32,61,6,7,53,6,5,11,45,6,9,15,37,6,13,19,34,17,19,34,17,19,34,17,19,34,17,19,34,17,19,34,17,19,34,17,19,34,17,15,6,35,17,11,6,43,13,7,6,51,9,6,59,5 rocks: db 16,33,86,149,87,149,171,106,171,90,171,127,171,106,251,85,171,106,95,170,173,106,165,170,173,106,171,170,182,106,171,170,182,106,171,170,182,106,171,170,246,127,171,170,102,149,171,170,118,106,171,170,182,106,171,170,182,106,171,170,182,106,254,255,231,191 fluff: db 8,10,11, 19,11,11, 27,10,31, 36,11,21, 11,1,34, 23,1,14, 41,1,24 pa: db 28,3,38,4,46,5,57,5,163,3,179,3 dba:db 21,5 qb: db 16,21,23,78,106,109,112,170, 21,9 qb2: db 22,94,109,129,130, 27,5 ba: db 20,22,24,77,79,94,100,101,118,129,130,168,169,171 , 27,9 ba2: db 80,81,82,83,84,85,86,87,91,92,93,121,122,123,128,131,0 pyr: db 137,5*2+1,140,5*2,151,5*2+1,152,5*2+1,155,5*2,188,9*2+1,189,9*2+1,198,4 ground: db 69,2,86-69-2,3,153-86-3,2,256-153-2,0 copy: db 202,2+5*16,26,26,24,26,26, 202,3+5*16,26,26,28,26,26, 202,4+5*16,29,30,30,30,29, 203,5+3*16,31,26,25, 203,6+3*16,29,29,29, 198,12+16,20 temp: rb 256*48 tiles: rb 34*16*16 image:

Демо: http://jsbin.com/fojidejoco/1/

PS: Я знаю, что это немного жульничает (даже если правила это допускают), но, по крайней мере, это дает нам цель: сделать это менее чем в 4012 символов.

Используемые инструменты:

 

ASputleutepE10


Рег
19 Feb, 2014

Тем
76

Постов
182

Баллов
582
Тем
403,760
Комментарии
400,028
Опыт
2,418,908