Perl, 164 байти, відсутність стиснення zlib / gzip
Після сну над проблемою мені вдалося знайти набагато коротше рішення, ніж моє перше. Хитрість полягає в тому, щоб скористатися незначною лазівкою в правилах: символи повинні вміщуватися в 8 на 8 пікселів кожен, але нічого не говорить про те, що вони повинні заповнити весь цей простір. Тому я намалював власний шрифт 4 на 5 пікселів, що дозволило мені упакувати два символи в 5 байт.
Вихід виглядає приблизно так:
(масштабування х 4)
(оригінальний розмір)
Перш ніж надати фактичний код із вбудованими даними про шрифт, дозвольте мені показати версію де-гольфу:
y/A-Z!./\0-\033/ for @a = <> =~ /./g;
say "P4 " . 8*@a . " 8";
for $p (qw'PACKED FONT DATA') {
print chr vec $p, ord, 4 for @a;
}
У фактичному коді значення PACKED FONT DATA
замінюється двійковим рядком, що складається з восьми рядків, розмежованих пробілами (чотири 14-байтових рядків та один 13-байтовий, плюс три одиничні нульові байти для порожніх рядків). Я навмисно розробив свій шрифт, щоб упаковані дані не містили пробілів, одиничних лапок чи зворотних косих рис, щоб вони могли бути закодовані qw'...'
.
Оскільки упакований рядок шрифту містить недруковані символи, я надав фактичний сценарій як шістнадцятковий дамп. Використовуйте xxd -r
для повернення його у виконуваний код Perl:
0000000: 792f 412d 5a21 2e2f 002d 1b2f 666f 7240 y/A-Z!./.-./for@
0000010: 613d 3c3e 3d7e 2f2e 2f67 3b73 6179 2250 a=<>=~/./g;say"P
0000020: 3420 222e 382a 4061 2e22 2038 223b 666f 4 ".8*@a." 8";fo
0000030: 7224 7028 7177 2700 20e6 e6ff 9612 8999 r$p(qw'. .......
0000040: e6e6 7759 99f5 0420 9999 8898 128a df99 ..wY... ........
0000050: 9928 5999 1504 20ef 98ee fb12 8cb9 e9e9 .(Y... .........
0000060: 2659 6965 0420 9999 8899 928a 9989 ab21 &Yie. .........!
0000070: 599f 8220 e9e6 8f96 62f9 9986 972e 2699 Y.. ....b.....&.
0000080: f284 2000 2000 2729 7b70 7269 6e74 2063 .. . .'){print c
0000090: 6872 2076 6563 2470 2c6f 7264 2c34 666f hr vec$p,ord,4fo
00000a0: 7240 617d r@a}
Ось як це працює:
Перший рядок (у версії де-golfed) зчитує один рядок введення, розбиває її на масив символів (зручно , минаючи будь - яких символ перекладу рядка) і відображає літери , A
щоб Z
і символи , !
і .
для символьних кодів від 0 до 28, який зазвичай відповідають недрукованим символам управління в ASCII / Unicode. (Незначним побічним ефектом цього є те, що будь-які вкладки на вході надрукуються як J
s.) Символ пробілу залишається незмененим, оскільки вихідний цикл перетворює будь-які коди вище 28 в пробіли.
Другий рядок просто друкує заголовок PBM. Він використовує функцію Perl 5.10 say
, тому для запуску цього сценарію потрібно запустити perl -M5.010
його.
Вихідна петля приймає список, розміщений пробілом, упакованих рядків зображень і призначає $p
по черзі кожен з них . (Я сконструював шрифт так, щоб упаковані дані не містили пробілів чи '
символів.) Потім він перетинає символи введення @a
, використовуючи vec
команду Perl, щоб витягнути 4-розрядний nibble, відповідний зібраному коду символів із рядка зображення, додає його до 8-бітового байта і друкує його.
Стара відповідь, 268 байт:
Це швидка і брудна перша спроба. Я вкрав шрифт PleaseStand і стиснув його разом зі своїм вихідним кодом. Оскільки отриманий скрипт здебільшого не друкується, ось шестнадцятковий; використовувати, xxd -r
щоб перетворити його у виконуваний код Perl:
0000000: 7573 6520 436f 6d70 7265 7373 275a 6c69 use Compress'Zli
0000010: 623b 6576 616c 2075 6e63 6f6d 7072 6573 b;eval uncompres
0000020: 7320 2778 da85 d03d 4b03 4118 85d1 452c s 'x...=K.A...E,
0000030: b69c 72cb 7519 4894 552c 2c02 3319 ee5c ..r.u.H.U,,.3..\
0000040: d7b8 5a89 6093 4634 7e82 c490 6c91 8597 ..Z.`.F4~...l...
0000050: 80fe 7267 d660 23ae e52d 0e0f dcd6 f8c3 ..rg.`#..-......
0000060: e9d1 5e6e ccec a15c ddb5 c5d5 495e 94a3 ..^n...\....I^..
0000070: 83b7 c7f9 73f3 5216 f9a8 787a 5fea 666c ....s.R...xz_.fl
0000080: 9dd1 b763 dd98 76f8 2df6 0799 5811 7144 ...c..v.-...X.qD
0000090: 4acc ee9d b8b0 c90f 7e4a 8264 6016 cbd7 J.......~J.d`...
00000a0: 79f3 1b91 047c 4055 409e 9e54 1dda ed41 y....|@U@..T...A
00000b0: 9a20 8080 6adc 5c47 8488 7495 f621 01d7 . ..j.\G..t..!..
00000c0: 6b6c 902e b6c8 2a6a 6643 f56f e99c 115d kl....*jfC.o...]
00000d0: 5c7a f1b2 13d0 3453 790f da74 c813 751d \z....4Sy..t..u.
00000e0: 11ce d821 ad90 247f 2292 5b54 c14f 3c4e ...!..$.".[T.O<N
00000f0: 49c5 4c53 a1a7 c478 391c 714c f113 0747 I.LS...x9.qL...G
0000100: ab6c 4482 9fd2 177a 5677 6327 .lD....zVwc'
Декомпресований код Perl складається з наступної преамбули:
y;A-Z.! ;;cd,say"P4 ",8*length," 8"for$t=<>
з подальшим восьми повторень наступного коду:
;$_=$t;y(A-Z.! )'BITMAP DATA HERE';print
із BITMAP DATA HERE
заміненим на 29 байт, що кодує один рядок шрифту.