tech oyaji ksmakoto_presen
DESCRIPTION
TRANSCRIPT
5分間hangmanで遊ぶ!
@ksmakoto(きしもと)
hangmanとは?
● 昔はUnix(BSD)に標準添付だったゲームのひとつ● いわゆる単語当てゲーム● 単語中に含まれないアルファベットを答えると、
吊るされている人(hangman)が描き加えられる
● /usr/share/dict/words ファイルから出題● 日本人にはつらい● Unixコマンドを使って(チートではなく)楽をしよう
hangmanの入手とビルド
● bsdgamesのような名前のportsやパッケージに
ごった煮状態で入っている(rogue, mille等)
● 私が確認したFreeBSDのportsで入る版にはバグ
(出題の単語中に大文字が含まれるが、大文字は回答できない)
● 現在ソースをメンテしてるのはDragonFly BSDプロジェクトなので、DragonFlyのリポジトリから最新版を取ってきてビルド!
アルファベットの頻度(1)
● 有名な「ETAOIN SHRDLU」 → これは使えない
アルファベットの頻度(2)
● 「ETAOIN SHRDLU」は、「通常の英文」の頻度
● hangmanのような「辞書の見出し語」の頻度ではない
● 例: 辞書には「the」や「that」や「they」が出てくるのは、1回だけ
● hangmanでは単語の長さもヒントになるが、調べてみるとそれだけでもアルファベットの頻度は変動する
アルファベットの頻度(3)
● hangman用の頻度調査
● wordsファイルを使うので「あるアルファベットが出現する行(単語)はいくつか?」をかぞえるawkスクリプト
● その他はおなじみのgrepとsortで
アルファベットの頻度(3)cont
BEGIN {
split("", count)
}
END {
for (c in count) {
print(count[c] " '" c "'")
}
print NR " lines"
}
{
split($0, arr1, "")
for (n in arr1) {
arr2[arr1[n]] = 1
}
for (c in arr2) {
count[c] += 1
}
delete arr2
}
実例
● 出題: Word: --------- (9文字)● grep -i '^.........$' /usr/shate/dict/words |
./hang_count.awk |sort -nk 1
● 19171 'a'20073 'I'22456 'e'32407 lines
実例
● Word: -er-tri-e● grep -i '^.er.tri.e$' /usr/shate/dict/words |
./hang_count.awk | sort -nk 1● 3 'z'
5 'e'5 'I'5 'r'5 't'5 lines … ここで ”z” は外れた
実例
● Word: -er-tri-e● grep -i '^.er.tri.e$' /usr/shate/dict/words |
grep -v -e z | ./hang_count.awk● pedotribe
veratribe● 本当は「.」もマッチし過ぎている(既に出ている以外の
文字、に絞りたい)が、grepで簡単に表現する方法がない( . の代わりに [^erti] のようなのを並べるしかない)
まとめ
● hangmanを簡単なスクリプトとコマンドで攻略する方法を紹介した
● まだ詰められる点はあるが、発表者による30分ほどの評価では、おおむねほぼ全てのゲームでwin可