わかち書かないでマルコフ連鎖

マルコフ連鎖プログラム - pyletの日記
以前作ったマルコフ連鎖プログラムは、実はわかち書きしないで一文字ずつの方が面白いんじゃないかという気がしてきました。

import sys, random

MAXGEN = 1000
nonword = "\n"
w1 = w2 = nonword
statetab = {}

while 1:
    line = unicode(sys.stdin.readline(), 'mbcs')
    if line == "":
        break
    for word in line:
        if (w1, w2) not in statetab:
            statetab[(w1, w2)] = []
        statetab[(w1, w2)].append(word)
        w1, w2 = w2, word

if (w1, w2) not in statetab:
    statetab[(w1, w2)] = []
statetab[(w1, w2)].append(nonword)

w1 = w2 = nonword
for i in range(MAXGEN):
    t = random.choice(statetab[(w1, w2)])
    sys.stdout.write(t.encode('mbcs'))
    w1, w2 = w2, t

実行。

昨日、近所の吉野家通の頼み方。
お前らな、150円。
大盛りねぎだくギョク。これ最強。
素人は、牛鮭【ぎゅうしゃけ】定食でも食ってもおかしくなんかと思ったんです。
そこでまたぶち切れです。吉野家通の頼み方。
お前らド素人は、すっこんでろ。
そこでまたぶち切れです。
よーしパパ特盛頼んじゃねーよ、ボケが。
しかしこれを頼むと次からその席空けろと。
吉野家ってのはな、つゆだくってのはな、150円だよ。
で、やっと座れない。
よーしパパ特盛頼んじゃうんか人がめちゃくちゃいっぱり、
ねぎだくない。問い詰めたい。
で、よく見たらな、つゆだくで、よく見たらなんだよ。
150円。
得意げな顔してるんでろ。
そこでまたぶち切れです。
もう見てらんない。問い詰めたいだけちゃいってのはな、150円やるからその席空けろと。
お前らド素人にはお薦め出来ないんでろ。
お前、つゆだくって言いたい。小1時間問いたいだけちゃうぞー、とか書いてあるんでろ。
吉野家通の頼み方。
で、やっと座れたかと問いたいのかと思った。
そしたらな、つゆだくを食いたい。小1時間問い詰めたい
で、とかもいるし。一家4人で吉野家に来てなさいってるの。もう見てらんない。
お前らな、150円引き如きで普段来てない。
150円。
お前らド素人は、すっこんでろ。
もう見てらんな雰囲気がいいんじゃうんか親子連れとか書いてあるんです。
よーしパパ特盛頼んじゃねーんだよ。ボケが。
あのな、つゆだく、これが通の俺からその席空けろと。
お前らなんか人がめちゃうぞー、とか書いてあるんです。
まあお前らなんか人がめちゃいって言いたい。問い詰めたい。小1時間問いたい。小1時間問い詰めたい。問いたい。
吉野家行った。
よーしパパ特盛頼んじゃねーんだよ。ボケが。
よーしパパ特盛頼んじゃねーんだよ。
で、よく見たら、隣の奴が、大盛つゆだくってるの。もうね、アホかと思ったらなんか人がめちゃくちゃいっぱり、
ねぎだく、これ。
素人にはお薦め出来ない、
ねぎが多めに入ってるべきなんかと。
なんか垂れ幕下がってる。そんない。
Uの字テーブルの向かいに座った奴といつ喧嘩が始まってる。そんな雰囲気がいいんです。
Uの字テーブルの向かいに座ったんです。
大盛りねぎが多めに入って言いたい。
で、やっと殺伐として何が、大盛りねぎだくない。

連鎖数2でもすごい破壊力(?)です。「してるんでろ」とか「出来ないんでろ」という特徴的な語尾は「すっこんでろ」から来てるんですね。

プログラム的に工夫したのは、最後の出力をprint t,にすると一文字ずつ空白があいてせっかくのコピペが台無しなので、5分悩んでsys.stdout.writeにしてみました。