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. Он использует say
функцию Perl 5.10 , поэтому вам нужно запустить этот скрипт, perl -M5.010
чтобы он работал.
Цикл вывода берет разделенный пробелами список упакованных строк изображения и присваивает каждой из них $p
по очереди. (Я разработал шрифт так, чтобы упакованные данные не содержали никаких пробелов или '
символов.) Затем он зацикливается на вводимых символах @a
, используя vec
команду Perl, чтобы извлечь 4-битный фрагмент, соответствующий коду сопоставленного символа, из строки изображения, дополняет его до 8-битного байта и печатает его.
Старый ответ, 268 байт:
Это быстрая и грязная первая попытка. Я украл шрифт PleaseStand и сжал его вместе с исходным кодом. Поскольку полученный скрипт в основном непечатаемый, вот hexdump; используйте, 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 байт, кодирующих одну строку шрифта.