PHPでターミナルに黒魔道士を出す

via vallog: ターミナルに黒魔道士

PHPでもやってみた。こういうスクリプトを書く。

<?php
// draw.php
foreach (str_split(stream_get_contents(STDIN), 1) as $c) {
    echo ctype_digit($c) ? "\x1b[" . ($c + 40) . "m  \x1b[0m" : ($c === ' ' ? '  ' : $c);
}

kuro.datという以下のような内容のファイルを用意。

               00
             00330
            033320
          0033320
        003333220
 000000033332220
0333333332222220
 02222333322220
  0002222333200
    00002222220
    030000022220
   00300300002220
  04000030000400
 040000000000040
 044400044444440
 00444444400040
0330444440044440
03304444033044440
 004404403304440
 040440040044440
 040444440044440
 044044440044440
 044404444044440
 0444400444044040
044444444444004440
 0000000000000000

コマンドを叩くと黒魔道士が現れる。

$ cat kuro.dat | php draw.php

追記

ワンライナー版も書いた。

<?= preg_replace(['/[0-9]/', '/ /'], ["\x1b[4\$0m \x1b[0m", '  '], stream_get_contents(STDIN));

preg_replaceに配列渡すの初めて使った気がする。

追記2

factor版も書いてみた。

IN: .
USING: io kernel sequences prettyprint strings ;

: colorize ( str -- escaped )
   "\e[4" "m \e[0m" swapd 3append ;

: a ( ch -- str )
    [ 1string ] keep
    "0123456789" member?
    [ colorize ] when ;

: b ( ch -- str )
    1string dup " " = [ drop "  " ] when ;

contents [
    a [ b write ] each
] each