- 2007-03-20 (Tue) 02:35
- プログラミング ( sed/wake/awk )
なんとなく収束してそうだしネタばれ的に書いてみる.この問題の鍵は勝敗判定部分を如何に簡単にするかだと思って組み始めた.とくに,じゃんけんはグー・チョキ・パーを巡回させても勝敗が変わらないので,適当な正規化をしてやるというのが短いコードへの近道かなぁと.
ということで,最初に考えたのが次の 73B のプログラム.
s/P\w*/5/g s/[SC]\w*/2/g s/[GR]\w*/0/g : y/025/250/ /^0/!b /2/c> /5/c< c=
こいつは,まず各種グー・チョキ・パーを 0・2・5 に変換し,次に一人目の手がグーであるように両者の手を回転させ,最後に二人目の手を見て勝敗を判定する.判定は,一人目がグーであるので,二人目がチョキなら '>',パーなら '<',残りは '=' となる.
基本アルゴリズムはこのままで,以降最初と二番目のステップが縮まっていく.
一段階縮まったプログラムは次の 64B のプログラム.
s/P/5/g s/[SC]/2/g s/[GR]/0/g : y/025/250/ /^0/!b /2/c> /5/c< c=
最初の一文字だけ見ればいいので無駄な置換をしないことにした.これで最初のステップの部分がだいぶ小さくなった.
が,一文字しか置換しないなら・・・ y コマンドでいいじゃん,と.この書き換えを始めて次の 49B を得た.
y/PSCGR/52200/ : y/025/250/ /^0/!b /2/c> /5/c< c=
で,yが二つに分かれてるのは無駄だなぁということで,先頭の y をひとつにくっつけてしまって最終的に次の 44B になった.
: y/PSCGR025/05522250/ /^0/!b /2/c> /5/c< c=
すっきり爽快無駄のないコード.Perl の現時点のコードより短い.やっぱり sed はいいなぁ.
- Newer: AWK - はじめ