技術memo

関数型ゴースト

コナミコマンドができるまでひたすらランダムなキー入力を生成する

Twitter Webでコナミコマンドが使えると話題になっていたので、演習問題がてらやってみます。

仕様

  • 擬似乱数のシード値は外部から指定する
  • 生成する記号の個数の上限を、外部から指定する
  • キー入力される可能性のある記号の一覧(↑↓←→AB)は、固定とする
  • 特定の記号列(↑↑↓↓←→←→BA)に末尾が一致するまで、上記記号一覧からランダムに記号を選び、末尾に追加する。一致した時点で終了し、それまで生成した記号の個数を出力する。
  • 一致する部分文字列ができずに上限個数に達した場合は、失敗として終了する。

出力イメージ

↓←BB→↓A↑↑↓A↑↑↓↓←→←→BA
finish! count:21
success!

実装

open System

let generate_random seed min max = new Random(seed) |> Seq.unfold (fun r -> (r.Next(min, max), r) |> Some)
let take_random_elements seed (arr:'a array) = (generate_random seed 0 arr.Length) |> Seq.map (fun i -> arr.[i])
let generate_until_correct_seq seed (inputs:'a array) (goal_arr:'a array) =
    let pos = ref 0 (* current index of goal_arr *)
    let last = ref Option<'a>.None (* save the last element of takeWhile *)
    seq{
        yield! inputs
            |> (take_random_elements seed)
            |> Seq.takeWhile (fun x ->
                if x = goal_arr.[!pos] then begin
                    if !pos = goal_arr.Length - 1 (* is the last? *)
                        then last := Option.Some x; false (* completed! *)
                    else pos := !pos + 1; true (* go next *)
                end
                else pos := 0; true (* reset *)
            )
        if (!last).IsSome then yield (!last).Value
    }, lazy((!last).IsSome)
let generate_command seed line_width max_count (inputs:char array) (goal_arr:char array) =
    let count = ref 0
    let query = (generate_until_correct_seq seed  inputs goal_arr)
    query |> fst
        |> Seq.truncate max_count
        |> Seq.iter (fun x ->
             if(!count % line_width = 0) then printfn ""
             printf "%c" x
             count := (!count + 1)
        )
    let success = (snd query).Force()
    printfn "\nfinish! count:%d" !count
    if success then printfn "success!" else printfn "failure!"

let konami seed line_width max_count =
    let inputs = [|'↑';'↓';'←';'→';'A';'B'|]
    let goal_arr = [|'↑';'↑';'↓';'↓';'←';'→';'←';'→';'B';'A'|]
    generate_command seed line_width max_count inputs goal_arr
  • 関数名が長すぎるような気がします
  • generate_until_correct_seqの返り値の型がSeq<'a> * Lazy<bool>なのは、もう少し何とかならなかったのでしょうか
  • 破壊的代入をどの程度使うのか、いまひとつ掴めていません
  • System.Linq.Enumerable.Takeと互換するのはSeq.truncateです、名前が同じでもSeq.takeは別物です。"The input sequence has an insufficient number of elements."と言われたら、要素数が指定した数値に満たないってことです。
  • メモリ効率と処理速度は気にしたら負けです。それを気にするなら初めからSeqなんて使っちゃいけないって誰かが言ってました。
  • 処理速度等を測るなら、printfしないで個数カウントだけするモードを用意した方が良かったかもしれません。
  • 「こんなコード見ていられるか!俺ならこう書く!」的な記事、お待ちしてます

動かしてみる

> konami 257 100 5000;;

B↓←←↓↑↑←A↑→↑↓↓B→B←→ABB←ABABB→↑↑↑→←←BB→←BA↑↑←←↑A←↓↓↓→←B→↑A→→←↓↑BAB←←BAB→←BA↑BA↑←A↑←A←A→AAA↓↑↓↑B→A↓←←B
→BA↓→B→→AA←A↓A←B←←B←AA↑→B↓←↑↑←→↓A←↑↑A←ABB↑BBB←↑↓→A↓A→B↓BA↓←↓→→→←↓↑↑A→↓↑↑A↑→→A↑→→↑↑←←↑AAA↓↑←→B←←←→→AB
↓←→←→↑↑←←→↓A→B↑←↑↓←←↓↓←→B→↑↓A↑↑↓←A↓A→↑ABA↓←ABAB↑←B←←↑↓→↑↑↑→↑↑AA↓→↑↓BA←BB←←A↑BA→↓ABBAA→↑↑↑↑A←→→BB←↑↓A
←B←B↑←BA→→↑↓←↓←↑B↑→B↑↓B→A←←B←A→B→BAA→B→←A↓←→B←B↓↓AB←←↓A↓↑A↓→B↑←A↑↓A→→→←↑←↓↓BA←→←←↑→→A↓←↓↓→→B→↑←→B→←A
→←A→←BB↓↑B←A↑B↑B→A↑BB→←B↑←←←A→B↑BBA↑←B↓B↓↑↓↓↑BBAB→↑↑→→AB↑A→B←→←←B←A↑↑↑←→→↑→A←↑B↑→A←↓→B←↓↓BB→←↓←AAA←A
↑A→B↑→→→B↑→↑B→↓A↑↑B↑↑→B↓↑A↓↓→B↑→→↑↑A↑→↓↑↓A←↓↓BAB↑A→→B←→→B↓A↓↓←BBBB←A←←→→BBA↓↑→B↑↑←↓B←←A↓→←BAABABB←↓↓
→B←→↑↑A↑→←←←↓A↑B↑B→←↓↓↓B→AAB↑B↓A←→→↓BAB←A→→↑↑→→↑AAABBA↑↓A←B↓↓ABA↑AB→↑BB←↑↓AA→↑B↑↓→↑←↑←B→→↓←→A→↑B→B↑←
→B↑BA↓B→↑↓→→→BBAA→→AA←↑A←←A←↓A↑A↑→→←→↓AB→↓←↓AB↑B→↓↓↑←←→↑B↓←↓→←←←↓B→↑↓→↑→AA↑→BA↑→←BAB←B←AB←→↓A←↓↑A↑↑A
↓B→↑↓A↓→↓B↑↑↓ABA→→B↓→B↑BBBA←←BABA↓↓←↓AAAAA←B←←↑↑→→→↓↑A↑←BA↓↓↑B↓↓↓↑←B→←←BB↓→B←↑←←BABB←→BB↓A→→←←AB←↓A↓
↑↑→↑↑A←A↑↓↑A↓A←←B↓BA↓→AAAB←→→A←↓←↓←A↑ABA↑↑ABAB↓AB←B↓←↑↑←↓B↓↑↓A↓←AA↓B↓A↓↑←↑→↑AABBAAA↑B↓A←↓B←↓←A←←B←↓B
→↓←↑↑BB↓←↑A←B←←→↑↑←→↑BA←↓B→→A↓↓←→B←←↓→B↑←→B↓↓B↓↑←A↓AB→B→←↑B↓↓↓→↓A←A↑BB←→↓←↓←B→↓↓→←↑B↑→←↑BAB↓AAA↑↑A←A
↑↓↑→←A←←←→→BA→→A↑A↓↓BA↑↓B↑A←A↑←↓↓←↑←←→←↓↑B→←↓↑←↓↓↑B←→↑B←↑BA←B↑A↓↓←A←←↓←→↓B↓B↑A↑AA→↓→↑BA↑→A↓←B↑←B↓←↓A
←↑ABA←↑AAB↓←BB→↓A↑↑↓A→B→BBA↓←↓AA←↓←AA↓BAB↑↓A←B→↑←↓↑↑↓↑↑A↑↑↑AAB↓→↑→BA←B←→↑←↓A↓↑↑↑↓→A↓↓→←←↑→→→↓↑↑↑AA→B
BB→→A→↑BA←←↑B↑←↑↑↑↓→↑←→A↓A←B↓↓B→→↓↑←↑↓←→→→AA↓→A↑→↑↑A←↑A→↓B↓B↑↑A→←B←A↑↑↑A→→B→AA→A↑↓↓↓↓↓↑→←←↑↓↑→←←A↓←↓
↑B↑→↑↓↓B↑↓A→↓←BBA←↓↓BB↓→BAA↑↑→A→←↓A↓↓A↓↑↑↓←↓A→B→A→A←B↓←↓→→→↓←↑A→←↓↑BA→→↑↓↓↑→←BB←B↑←→A←A↓B←→A↑B→B→BB←
←BB↑↑A↑→↑AAA→↓←↓A↓AB→B↑↓↑BB←A↓↑←↑←↑B↓←→↑←↓↓↑AB↑A→↓↑←↑BA←B→B↑AAAA→↓→↑↓←B←→A→←AB→↓B↑A←↓A↓↑A→↑A←←↓A←←→←
↓B→↑↓→A←←←AB↑→↓→B↓→BB→←A←↓B↓→BB↓←↑↑B→A↓→↑BA↓A↑→B↓→A↑BA→→←AABA←B←←→←↑←↓B↓↑BA↑B↓B↓A↑↑B↑A↓A→←→AB↓B→↑↓B↓
→→←B→→↑BB→A↓B←↓→←B←→↓A→↑A↑↓B↑↑BA↓→→↓A↓↓→A↓BB→↓B→B↓↓↑A↓↑BB←↑←↓↓BA→↑B↓A↑B↓AAB↑B→←→↓ABBBBB↑→→↓↓↑A←←←↑←→
↓→AB↓↑←↑←↑↑←B←↓→←↑AA↓BA↑A→↑B←←→A↑B↓ABB→B←A→←→B←A←B↑←↓A←↓A→↓→B←A↑←←↓↑↑→→→←B↓←←↓→A↓↓←←↓↓→←←↑B←→BB↑B→↑↓
A↓→B↓→B←←BB←B←←→B↓A↑BA→↑A↑B←↑↑←B↓←↑BA→↓A←↑↑→↑←←↓→↓↓AAB←B→←↓↑A←←↓←↑↓→↓←B↓↑↑AAA↑B↓AABABA↑↓↑↓↓←←↑↑BAA↓↑
↓BB↑←B→A↑A↓→→B←B←→←→BB←↑↑→B↑↑BB↑AA↑ABB←B↓←↓←↑→B←→↑←↓↓A↑←←ABB↑→→↓A↑BAB→↑→↓→←→A↑↑→A→←B←→A↑A→←↑↑→B→AB→B
A↓←↑↑B↑→↓←A←A←↑←↓AA↑↓AB↓↓B→→AABA→↑A→↓↓B→→↓A↓B↑←→←←←↑↓←→↑↓↑A↑↓←B→→BB→A→↓BA↑→↑BA←↓→B↓←←B→↑→A↓↑→B↓↓←↓A↑
↓ABA↓←↓↑B→↑←A→←←↑←↓→←A↑B↓↑←AA↓AAB←BBB←↓B→←↓BAA←B→B↓BB↑→←→↑←↑↑→↓→A↓←←A←←→↓←BB→↑↓→A→↑B↑BBAA→↓B↑↑A↑↓→↓←
↓↑↓↑←→→→↓→B→AB←→←↓→B←A→↓↓→→↓→BA↑BA↓→←↑←←↓↓→↑→A↓↑A↓→BB↓↑→→↑BB↑↓B↓BB→↑AA↓←B↑→↑↑←→←↓←→←←A↑AA→↑↓↑→←B←←↓A
↓↓←B↑↓↑B→B→↑←←→→A→B↑BB↓↓AB↓↓AAAA↓B↓↑↑→↓↓A↓↑AB↑BABA↑A←↑B↓B↑↑↓BA↑B↓BA→↓←→↓↓A←AA→↓A↑→←↑→B↓↓↑B↓B←↑↓B↑↓←↑
↓↓→←↑B←A→↑→↓B←↑←←B←↓→→→↓↓→A↓←←→←↑↑→ABBB→→→→B←B↑↑BA→↓B↓→→A↓↓→↓↓↓↑→↑↓AB←←→↑BABBAB↓←A↓AB←→B→B↑→→←↓↓←←↓↓
A←↑→←↑↑↑→→→B←↑↑→↑→↑↓←←↑↑↓ABA→→→←←→←↑→→↓B↓→↓↑↓↑↓←↓A↑A←↑A←←↑←→↑←←BB↓→BA↑↑→↓↑↑B↑BA↑→←←B←B↑←B↑A←↓ABA↑←↓↑
→↓A↓→→→↓BB←←↓↓BA↑→→↑↑↑↑A←→↓←↓↓AA→A←↓→↓↓A↓B←B→↓↑BA↓A→A↓B→↓↑B↑↓↑BA↑→A→AA↑A←AA↓→↑↑↑←←A↑←↑B←ABB→←↑←↓BAAB
←→↑↑↑B↓B←AB↓↑A→B←B↓↑A←AAA→←↓↓→↓B↓↑→A↓→B→BBB↑↑A←→→→B↑←A↓↑B↓←→→B→B→B↑↑↑A→A↑A↑A←AA↑↑AAA→↓←←A→BB↓↓B↑←B→↑
→←←A↑↑↑AA→A↓→↓←A↓B←↓→→↓→B→→AAB←←↓A←A↓↑A→↓AA↓A→←BA↓B←→↓→↑↓BA←→↓↑A↓↓↑BBA←↓↓A↑BBBA↓↑→B←↑BBB↑↓←←↓↓BB→B↑→
→→↑↑BA↓B↑A↓↓↑←↓B←→→↓←↑A→←BBBA↓↓BA↓A←→B→←→BB←↑↑←AB↑←↑↓A↑←B←→BA←↑A←↓→AAA←→B↓A←↓↓←↓→↑BAB↑→B↑↓→↓↓A→↓B↑BB
→→↑↑AB↑↑↑A↓→B←↓→←↓B↓→→A←↓↑↓↓→→→↑↓→A↑↑A↑B↑→B←↑B↓B←↑A→↓A←↑AAB→→B→←↓↓↓←→↓→→↓B↓B→↓↓↓B←A→ABB→↓A↓←B→←↓↑←↓B
AB↓↓←↑↓↓←←←→←A→↓↑↑A↓↓A↑BB↓AA→↑B↓↑←→B↑→↑A→A↓B↓AB↑B↑↑↑A↑→BA←↓↓↓→→←←↓→B↓A↓→BB→→→↓A↓↓→A←BB←BA→↑A←B←↑↑A←↑
↑BB↓B→↑A←↑←→ABB→A↑←←B→↓→→←↓B→→→AAA↓↓A→→←B→→A↑→↑←BA↓B←↑↑→A←A←←↑↓A→AA↑AAB↓→B→↓↑←→B←ABA←→←A→→←←A↑↑A↓A↓←
B↑→↓AB←←←B→←AA↑→↓→←B←B←↑↓→←→BB↑↓↓↑B←↑AB←↑B←→↑↑→B↑→→A↓↓BB→←↑↓←A→→B↓↓→B→←←→BB←→B↑↑↑←→←←↓BB↑BB→→A↑↓←AAB
BB↑←↑↑↓←←→←→←B↑↑↓↓↑→↓↓←B→ABAB→↑A↑↑↓↓↓↑↓←↑→←→→↓↓AAB↑↓A↑AA←↓A←↑←←B←→→←ABA↓BA→→AB↓←→↓BB→B↑B←→B↑↓B↓→↑→↑↑
AABB↓A↓B→↑B←↑←AB→→←→→→B↓↑→BB←↑→↑A↓→A↓↑→A→↑←←→←↑B↓↓↑→↓←→↓AAA→B←←→→AAAABA←BA↑←↑→→A→BA↑BBB↓A←B←←↑A↓→BAB
→↓↑↓→AA→←↑↑↓↓↑↑B→←→→B←↑←↑←↑BBBA↓BA↑←B→→↓↓←B→↓A↑↓BA→↓↓↑↑↓↑→↓↓→B→→←A←→↑→↑BA↓←←←→↑↓↓AB↑↓←↑AAA↓↓←↓A↓B←↓→
←→↓←AA→BA→A→→B↑A↑←↓BAAA↓↓A→←→↓→↑←→B→→←←→B↑B↑↑AA→↓B↓←↑↓AAAB↑↑↑↑←←B→↑BB←↓→↑ABAAA↑→B↑↑AB↓B↑A↓BA←←←BA→↑←
AA→B→A←←↓↑↑↑A→↑↑B→→AAB↓A→→↑A←↑↑↓→AB↓←↓↑↓A→B→↓ABB↓↓B↑B↓AA→A←↑→→B↑↑A→↑ABA→←↓↑↑↑→→A→↓←↓↓B↓↓B↑AABB→↓AA→←
↓B↓←→↓→A↓→→B↓→→←↓AB↑→↓↑→↑↑A→→A←←B↓←AB↑AB←→B↓→A→↓←↓BBA→A↑AA↓→→↑↑←↓↑BB↓A→↓↑↑A↑←AB←→←↑←B←A←←←↑↓A↓↓←←←↑←
A→↑AAABAAAA↑AB↑↓B→→B←←→BA↓←BA←→BA←→B↓←A↑←↑→AAB←A↑↑←BA↓↑↓B↓B←←↑B←↑A←←←↑B→B→←←BA↑ABAA→BA↑←←↓B↑←↓A↓↑↓→B
→↑←↑↓AB↓AA←↓↑↓←→←←←←→BB↓↑B↑AB↑↓A↑↓↑B↓→←↓BBAAAAB↓B↑BAA↓↓A↑↓↑↓A↓↓→←A↑B↑←←BB↓←→↑↓←↓BBAB↓→BAB↓B↑←↑←→A↑↓B
A↑↑←→BA←AA→BAA↓B←←←BA↓BA→↓←BBBB↑↑←→BA←↓↓A→↑↓→↑←→A→↓←→↓↑←↑←A←→B→BA→A↓↓←↓B↑↑↓↓↓A↓→BA↑↓→→←A←↑A↓ABAA↑↑←↑
↓↑←←←↓↓→↑B↓←↓↑←AB↓←↑↑↑B↑→B↓↓↓←↓↓↓↑←A←→B↓←BA→B←↑→←↑BA→↓B↑↓↓A→↑B↓→→B↓↑AA←↓←↑A↓←←↓↓A→B↓→→→B↓↓→↑B←↑←→↑B↑
↓↑B→→→↓←→→AB↑→A←BBB↑↓↓A←↑↓←↑B←A↓←↑↑AA↓→B↓↑←→→AB↓→A←→↓AAB↓←←←↓↓←↑B←←B→↑→→←↑B↓B↓B←←↑←↓B↑↑A←↑←←B↓ABA↓A↑
↓BA→↑A↓↓B→B↑→↑B↑B↓↓B←A←←→↓A↑↓↑←A←A↓←←A↑↑ABAB↓←AB↓→B←BA→→→←BB↑↑BB↑↓→AA→A↑↑↑↑→B→↑↓←BAA↑↑AA↑→B↑B↓↑A↑BBB
B↑↑ABB←AA↑AB↓A→↑↓↓AB→BA↓AA↓B↑←→B→↓←←B↑A↑→BB↑BBA↑→B←A↑B←B←AB↓A←A↓←A←↑←↓↑↓←A←→B→←AB↑↓↑↑AA→A←↑↑↑→←↓↓A→↑
←AA←B↓←←→B↑A←↓←→↑→↓A↑B↓B↓B↑B↓↑←↑↑↓←↑←B↓B←↓BB↓↓AB↓A↑→←B↑→←A↓B↑←↑←←BA↑A↓↓↓←←↓AB←AB↓↑A←↑B→↓↑B→→A←AB↑←←↓
→→↓B→B↑↑→←→↑↑↓→BA→←→←←↑B→→←↑→↓→→↑←↓→BAB↓A→→A←→→←AA↓←↑AB↑→←↓B←↑→↓B↑B→BB↑BA↓BAA↓←↑↑↑↓A↑↑→←→↑↑→→↑A→↑←B←
finish! count:5000
failure!

試行回数を増やさないと全然ダメっぽいので、程ほどにあきらめておきます。

以降オマケ

YMCA

let ymca seed line_width max_count =
    let inputs = [|'Y';'M';'C';'A'|]
    let goal_arr = [|'Y';'M';'C';'A'|]
    generate_command seed line_width max_count inputs goal_arr
> ymca 1 20 1000;;

YYMACMMAYCYYMACCMCCC
AYYMAYAMAACCCYAAAYCC
MACMMCCMYMCYMCMYAYAM
CYYYYMCMAAAYYYMAMAAY
MMYMMMMYCAAAYYAYAMMY
YMMMCMYYMMAYYAAMACAC
ACCYYYYYMYYAMAAYACAY
MYCYYCCYYCYYCCYCCMMC
YAAYMACMAAMMCAMCACYM
MAYCAAMACMMCMMAMMCAM
AMMYYAMAYMAYYYYMAYYM
CACMMAAMAYMYCAMYCACY
MMCYCMMMYCMYCMCYCACY
YYAYYCMMCYAYCYYYYMAY
CCYMCYCMYYMCYMYMCMYA
AACYAMCMYCAYYCCMACMA
YYMMCYAYYAMCMAMAAAMM
CYYMYYMCACMYYMACCYMC
MCMMYMAYYAMAYYYYAAYM
CMYMCMCAYAYCCAAACAYA
MYMYYMAAYCCCYAAYCAAA
CAYMCA
finish! count:426
success!

twitter

let twitter seed line_width max_count =
    let inputs = [|'t';'w';'i';'e';'r'|]
    let goal_arr = [|'t';'w';'i';'t';'t';'e';'r'|]
    generate_command seed line_width max_count inputs goal_arr
> twitter 1 100 5000;;

wtieeiwrtetwwreeweeerttwetewrrieetrrrtiiwrewieeiwwitwewtrtriettwtwiwrrewttiriertiwtiwwwterrettrwriwt
twiwiwttwiettrrwrererietttttwwtrirrtrertwwetteewtiwweetiewwitrrtwrewrriwerweeitwwrterrwreiiiwwrwwerw
rwwttrirwietwttwrttiireiirrwrtiterwtiretwiewewwwwiwtiweteretttrtteiietetittttirteetwewiwtwiititwiitr
eretrweiwerttiiwriiettwietrttriewrwerriwittwwwierewttweeiwieieiwwwrwteirttwtrrwiewtiiierteweirrreetr
wwiwtwrrteeetrrtireeertwieiwtwitewtierwwieeitieireietwwwttewreertirerwweeiwrwewrtrwwertirriewrirtrwe
ereiirtititweewriwtwwirtreieriewiewwwerreewwetrieeweerwwteerwieeeertiteeitietiwrerrwtteiwrwittiwriit
trrerewiwetiietiiweetieeetewiweirwrrrwwwetteeetwtteeretetwrrrtrtriitrwiwrwtrwtrtrwwiitetwteiwiietret
trieeieietwrirrerierrireirriririwerrrirrwtitretiieeiwrweteweiwewwrirrreweeeeteeerirtewtiwwrtwtitiwrt
wweetiriteewrirtwiitetiitetewitereierwtwiiweeitewwereritetewitwiiriwrwwtiwiterriiwwrrttrwwreeerwwete
rrrttiiiwwirttetrieieitewiieiweretieiweiieereriitewrterieteerrrtiettireeetrtrwrwrteerrettttwiteeeewt
eittrettrriiwwrrwwtetttwriweitiwrreitieweetweittwriiiitiietiiiiewwiieweeirriteeiiwieetewrtriwwewtwri
riwrtereeiieretwtrtwiwiewwwwtiwerwirreertrewiwietiwtteretiieieetweretwwwwwteiwttretiwwetirritrwwwitr
wriewreriwteiieritrrtewwirwwrewtwwertwtwieitetretieteteeetwieirrrtiterewriiwwtiwritirwititwrteetrewe
errwritteiweeritwireeweeietwriwirretieiitwireewtteeirititwrtirwwtreewiierwiwerrrirtwerewrwrwritwtwer
reretteiteewiteirtiwtietiwewwtwitrretwtettttieeeriirriewrrtrwwttiwwitriirettiiiririeiwietietwwirrtet
iwirttrtweriwwwwrwiteiwetwwetwtweiwtwieiwwwiewrrrwreeewrtrerrwtreierttrwerrwwrreiwerwiettwtirretwiet
etrewererrewrtiiitiweieetiirwetetrriirieirwterieitiwriwwwterwtitrrtttrtiireetirtreiwtrriietwweiiiwwe
eweirtetreweteriitrtteeirrwrwtwewwwertwtteerwwteerrwitetewiteereiewrwwiirerirrtieewwtrwtettiitiirtie
ttwiwiiewtwettitiiiiwtwwtttewieriiiiierewirirwwiewrwirwrrtwwiewriwweireeeetrwrireittiiweweeiiiwettti
tereeteeeiiteierewwtteirwwwtiiewrrerewwweeretertewrreriiwriwriwtrwweerwirrwieeriiwwtiririweeetiwwere
itwrtireereittretterewtitierwrtrettwritrtrtiiteetrtwtrttrreerrwereerteeirerrwerretrieeretrwreittiwie
iriitewwtwrwrererrrwrtetweriiewrttiriiwtwierrrtriiweiwritwtwrrewrtwewttiirrwwrtwerttieirwtetwtwiritr
eweiwetewetwwritreetiiitwtwiiiieeweitirreriirwrwiwetetiweitwwitewwerwtrwerwerttttrttrwteeweiweiterte
ertwwwwreeweittwitrtwrwrwittiwrtriwtreeerwttrtttiteertweewrrwwwiewrrrriewtttrtrwiriwewtrtiieeeierewe
wtweerirrwreweiwetriwtewirrieitwewtwereerwrrerwtwwrreriwwrtetrtitirtetirwtirtreeirtiiwirertrerertiet
rwitetiewitwwiwteerettwrtetwieriwiewitrwrriweeiweitiirtrretrtwteeiteereeeirtirtitritiwtwwrirrrweeret
ieirewetttwriiewettwiririrertwwewrtwwewtirtwiiwittteeweiwewrerrreeeeiwrrereietwriwetwerrwitiwiierwer
retrtttretewiiwwwrereeirwiitwteiwirrwrrtetwteetrwwiteettwtieeriiiwrriitwtiweiwtiiertiieeweitwwirieei
rtiettttiietttwtrwtriwierrtrtiteeeiwttriiitrtitwrirweereeertttttwriwirreiiittiewrereirtrrreiwewwitet
territetwrettiwwwwiieiiiwiiettitritwrrtwttitwiweirttiwwewwetitrwwiteitiwwwweriwetrwttieetiriwtettwee
iiwiierwtieetrreeewrriirtttwiteieiwiereweweirwiwttwwtrrrtwwweirrrttiiirrrrtirrrriewwewweeiiwiwetieee
tteewiwwewrtiirrwitiewetriiewtrwwteiritwrttwiirrieetitrrweeetereieewrwreiriewwiiiiteirettewwrwwwwirr
eetterieiwertwtiiwtiretttertewiriirrwrtiwtertwweweetwitter
finish! count:3258
success!

あわせて読みたい

*「不老不死のサルにタイプライターを与えたらいつかはシェイクスピアハムレットもできるのか」問題(無限の猿定理 - Wikipedia)