sed縛り回なのでPHPでやる意味はあんまりない。
普通の言語でやってみたことで普通っていいねという気持ちに。
しかし、PHP芸人であることを強いられているんだ。
Q1
正規表現による置換だとこう。-Rで$argnに標準入力が1行分代入され、スクリプトが毎行実行される。
echo abcdefghijklmn | php -R 'echo preg_replace_callback("/../", function($s){return $s[0][0].strtoupper($s[0][1]);},$argn);'
インデックスで処理するとこうか。
echo abcdefghijklmn | php -R 'for($i=0;$i<strlen($argn);$i+=2) echo $argn[$i].strtoupper($argn[$i+1]);'
Q2
ふつうにFizzBuzz
seq 1 100 | php -R 'echo $argn%3?"":"Fizz",$argn%5?$argn%3?$argn:"":"Buzz","\n";'
Q3
$argiに行番号が入ってくるので、それを見て出力と変数格納を切り分けるだけ。
seq 1 10 | php -R 'if($argi==3)$x=$argn;else echo "$argn\n";if($argi==7)echo "$x\n";'
Q4
Q3とだいたい同じ。設定にもよるけど、手元だと未初期化変数で警告が出るので-Bで初期化する。-Bのコードはプロセス起動後、-Rのコードが実行され始まる前に、1回だけ実行される。
cat aho.cc | php -B '$x="";' -R 'if(4<$argi&&$argi<10)$x.=$argn;else echo "$argn\n";if($argi==14)echo "$x\n";'
Q5
Q3と似たのが続く。
seq 1 10 | php -B '$x=null;' -R 'if($x){echo "$argn\n$x\n";$x=null;}else $x=$argn;'
Q6
sed版よりわかりやすいと思う。というか、やはり基本的にsedは行単位で何かするためのツールだと思う……。
echo 1 | php -R 'for($s=$argn;strlen($s)<10;$s.=$argn){echo "$s\n";}'
Q7
ここはいわば緊縛プレイなのでPHPでやる意味はない。
php -r 'for($i=1;$i<=10;$i++) copy("a", "a$i");'
Q8
まあふつう。今回はsedのラベルへのジャンプとかホールド・パターンスペースでゴニョるとか、普通の言語にないところがテーマだったので、普通の言語だとまあ、普通になりますね。
echo 1 | php -R 'for($s=$argn,$t="";strlen($s)<=5;$s.=$argn){$u="$s\n";$t=$u.$t;echo $u;}echo $t;'
感想
sedで条件式はマゾい(小並感