TopCoder始めました

なんなんだ、このゲーム。めちゃくちゃ楽しい。
天鳳どころの騒ぎではない。

自分よりも遥かに効率的で無駄がなくてスマートなコードを書いてる人が山のようにいるからめちゃくちゃ勉強になる。
しかもただ単にソースコードを見るだけというのではなく、自分も考えた問題と同じものを解いたコードを見るわけだから吸収率が高いように思う。
これは将棋でいう24だとか、麻雀でいう天鳳だとかよりよほど高速道路なんじゃないだろうか。


きのう深夜、初めてのSRM(DIV2)。
Level1:PairingPawns Score:241.85
単に配列の後ろから2で割った数を前に足すだけの問題。
前日までにSRM DIV2のLevel1の過去問を17問解いて練習してみてたんだけど、それらと比較してもどえらい簡単でこれまでの中で最速で解けた。ラッキー。

Level2:KingSort Score:150.00
名前と何世かを表すローマ数字とでソートする問題。
なぜToCharArrayした、とかCompareTo使えよ、という無駄だらけのコードで終了3分前にsubmit。
終了1分前に「IV」を正しい値で返さないバグに気付き再提出。合ってれば最低点の150点。
こんな風に終了直前にもバグに気付くようじゃ絶対まだ何か見落としてるバグがあるなと思ってたけど、SystemTest通ってた。

Level3はUnopened。

ついてた。配牌も良かったしオーラスでラス回避もできた。
初めて付いたRは1147。(→Topcoder
しばらくは緑を維持…というか今の自分の実力では何回かやると灰色に落ちる気がするのでまた緑に上がってこられるように頑張ります。

GOOD BE 2011

by稲毛成志(王様のレストラン
「年が変わればいいこともあるわ」と信じて…。

今月24日にデバッグを兼ねてテストIDで打たせていた天鳳打ちプログラムが三麻で特上卓に到達しました。


(IDはもじぴったんの曲Piacevole!から。)

瞬間の受け入れを重視する、フーロは役牌とクイタンのみ、リーチには対処するがフーロには全く対処しない、といった感じのごく単純なものですが、三麻上卓ではそれなりに通用するようです。
四麻特上到達を目指していましたが今年中に到達させることはできませんでした。
四麻上卓(東風戦赤速)の成績は以下の通りでした。


今年は自分の知識、力量不足を痛感しました。
来年はもっとプログラミングの基礎を勉強します。
四麻鳳凰卓到達を2012年の目標とします。

HTML5で東風荘牌譜読み込み

まったり麻雀0.9、公開されましたね。
個人的に東風戦に対応してるのが最もうれしいです。
早速打ってみて凸さんのできすぎくんで牌譜を解析してみようと思ったのですが使えなくなってる(/_;)
ということで、東風荘形式の牌譜を読み込んで順位分布と和了率・放銃率という主要なデータのみ取得するものを作ってみました。

http://dl.dropbox.com/u/11983416/Dekinasasugikun.html


こんな感じです。
デュプリケート対局で東風戦を100回打ってみましたが平順が2.5になってしまいました。放銃率高すぎ…。
和了率・放銃率は九種九牌・四風子連打流局を除いて出しています。

Firefox, Chrome, Operaで動くのを確認しました。
今のところIEはFileAPIに対応してなく、SafariはFileReaderに対応してないので使えません。
バグ等ありましたら教えて下さい。

順位ごとの和了率・放銃率・流局時テンパイ率

局ごとの開始時点での順位によって和了率・放銃率・流局時テンパイ率はどうなるかを調べてみました。
条件は以下の通りです。

  • 四麻、鳳東・鳳南
  • 東発(東1局0本場)を除く
  • 九種九牌流局、四風子連打流局を除く
  • その局での順位は局開始時点(同点の場合は席順)
  • ダブロンは和了した人はそれぞれ1回カウント、放銃した人は1回のみカウント
  • 三家和了流局は和了・放銃ともにカウントしない

対象データ:四鳳東・四鳳南1,951,956局
(全体2,243,990局から東発270,439局、東発以外の九種九牌流局20,228局・四風子連打流局1,367局を除く)
結果テキスト

放銃率


放銃数 / 局数

1着目の放銃数を1として比率を見ると、2着目:1.12、3着目:1.18、4着目:1.43


和了


和了数 / 局数


和了時リーチ和了


リーチ和了数 / 全和了


和了時ツモ率


ツモ和了数 / 全和了


リーチ和了時ツモ率


リーチツモ和了数 / リーチ和了


流局時テンパイ率


ノーマル流局時テンパイ数 / ノーマル流局数
東発以外の九種九牌と四風子連打を除いた流局数:286,669、うちノーマル流局数:286,404。
ノーマル流局率14.67%。(ノーマル流局数 / 局数)
(他は四家立直、三家和了、四槓散了)

1着目のテンパイ数を1として比率を見ると、2着目:1.24、3着目:1.35、4着目:1.77


どれも、

  • トップ目は無理する必要がない、ラス目は無理せざるを得ない
  • ラス目はリーチ手を作らざるを得ない場合が増える
  • 他家はラス目に辛く打つ

ということを考えると概ね納得がいきます。


個人的には流局時テンパイ率がこんなに違うということが意外でした。
最初の記事で少しシミュレーターについて触れましたが、それは和了率と流局時テンパイ率は全員同じ、放銃は1着目を1として2着目1.2、3着目1.5、4着目1.8の比率で放銃するというかなり適当な設定でした。
ラス目の放銃比率はやり過ぎかなとは思っていましたが、やはりやり過ぎでした。しかしながらそこそこいい結果が出ていたと思います。特に満貫については和了者・放銃者ともにぴったりといっていいほど似た数字で驚いたものです。今回取ったデータは、またシミュレーションをやり直す時に使えそうです。

ソースコード Analyze.cs, Data.cs, FileRead.cs, Misc.cs
VC#プロジェクト丸ごと TenhouLogAna.zip
コードのあらゆるバグ指摘、再利用、改良を歓迎します。

東1和了 四鳳南・三鳳南編

前回の鳳東の記事と同じ条件の四鳳南と三鳳南での結果です。

四鳳南

四鳳南・1000点


試合数:5387
和了:
1位:1518回(28.18%) 2位:1367回(25.38%) 3位:1310回(24.32%) 4位:1192回(22.13%) 平順:2.404

放銃:
1位:1229回(22.81%) 2位:1226回(22.76%) 3位:1388回(25.77%) 4位:1544回(28.66%) 平順:2.603


四鳳南・2000点


試合数:6166
和了:
1位:1865回(30.25%) 2位:1642回(26.63%) 3位:1449回(23.50%) 4位:1210回(19.62%) 平順:2.325

放銃:
1位:1286回(20.86%) 2位:1358回(22.02%) 3位:1610回(26.11%) 4位:1912回(31.01%) 平順:2.673


四鳳南・3900点


試合数:4998
和了:
1位:1693回(33.87%) 2位:1458回(29.17%) 3位:1080回(21.61%) 4位:767回(15.35%) 平順:2.184

放銃:
1位:853回(17.07%) 2位:1025回(20.51%) 3位:1317回(26.35%) 4位:1803回(36.07%) 平順:2.814


四鳳南・7700, 8000点


試合数:8495
和了:
1位:3491回(41.09%) 2位:2628回(30.94%) 3位:1580回(18.60%) 4位:796回(9.37%) 平順:1.962

放銃:
1位:1086回(12.78%) 2位:1400回(16.48%) 3位:2112回(24.86%) 4位:3897回(45.87%) 平順:3.038


四鳳南・12000点


試合数:1352
和了:
1位:715回(52.88%) 2位:415回(30.70%) 3位:152回(11.24%) 4位:70回(5.18%) 平順:1.687

放銃:
1位:116回(8.58%) 2位:161回(11.91%) 3位:292回(21.60%) 4位:783回(57.91%) 平順:3.288



個々の結果 1000, 2000, 3900, 7700, 8000, 12000
牌譜一覧 1000, 2000, 3900, 7700, 8000, 12000


三鳳南

三鳳南・1000点


試合数:733
和了:
1位:268回(36.56%) 2位:234回(31.92%) 3位:231回(31.51%) 平順:1.950

放銃:
1位:232回(31.65%) 2位:241回(32.88%) 3位:260回(35.47%) 平順:2.038


三鳳南・2000点


試合数:1271
和了:
1位:490回(38.55%) 2位:412回(32.42%) 3位:369回(29.03%) 平順:1.905

放銃:
1位:364回(28.64%) 2位:441回(34.70%) 3位:466回(36.66%) 平順:2.080


三鳳南・3900点


試合数:1616
和了:
1位:683回(42.26%) 2位:514回(31.81%) 3位:419回(25.93%) 平順:1.837

放銃:
1位:429回(26.55%) 2位:508回(31.44%) 3位:679回(42.02%) 平順:2.155


三鳳南・7700, 8000点


試合数:6832
和了:
1位:3290回(48.16%) 2位:2236回(32.73%) 3位:1306回(19.12%) 平順:1.710

放銃:
1位:1424回(20.84%) 2位:2014回(29.48%) 3位:3394回(49.68%) 平順:2.288


三鳳南・12000点


試合数:2703
和了:
1位:1547回(57.23%) 2位:809回(29.93%) 3位:347回(12.84%) 平順:1.556

放銃:
1位:408回(15.09%) 2位:701回(25.93%) 3位:1594回(58.97%) 平順:2.439


三鳳南・16000点


試合数:756
和了:
1位:464回(61.38%) 2位:233回(30.82%) 3位:59回(7.80%) 平順:1.464

放銃:
1位:84回(11.11%) 2位:164回(21.69%) 3位:508回(67.20%) 平順:2.561


個々の結果 1000, 2000, 3900, 7700, 8000, 12000, 16000
牌譜一覧 1000, 2000, 3900, 7700, 8000, 12000, 16000

鳳東・東1和了点数ごとの最終順位分布

天鳳鳳凰卓の牌譜の解析をしてみました。
データはこちらからダウンロードして使わせてもらいました。
鳳凰卓牌譜を公開している天鳳、それをまとめてくれているenecreさん、そして鳳凰卓プレイヤーの皆さんに感謝します。

対象データ:天鳳鳳凰卓牌譜363,067試合中、鳳東132,481試合
条件は以下の通りです。

  • 四麻、鳳東のみ
  • 東1局0本場のみ
  • リーチ棒供託なし(和了した人以外がリーチしていない、和了した人はリーチ和了も含む)
  • 子のロン和了のみ(ツモや親の和了は無し、東2局に移る)
  • ダブロンだった場合は除外

この条件で1000点、2000点、3900点、7700点、8000点の横移動があった時に和了した人・放銃した人についてそれぞれ最終順位を数え上げました。以下、その結果です。

●1000点


試合数:5911
和了:
1位:1657回 (28.03%)
2位:1645回 (27.83%)
3位:1403回 (23.74%)
4位:1206回 (20.40%)
平順:2.365

放銃:
1位:1346回 (22.77%)
2位:1315回 (22.25%)
3位:1516回 (25.65%)
4位:1734回 (29.33%)
平順:2.615

●2000点


試合数:6765
和了:
1位:2088回 (30.86%)
2位:2019回 (29.84%)
3位:1549回 (22.90%)
4位:1109回 (16.39%)
平順:2.248

放銃:
1位:1294回 (19.13%)
2位:1355回 (20.03%)
3位:1669回 (24.67%)
4位:2447回 (36.17%)
平順:2.779

●3900点


試合数:4892
和了:
1位:1839回 (37.59%)
2位:1599回 (32.69%)
3位:908回 (18.56%)
4位:546回 (11.16%)
平順:2.033

放銃:
1位:777回 (15.88%)
2位:774回 (15.82%)
3位:1182回 (24.16%)
4位:2159回 (44.13%)
平順:2.965

●7700or8000点


試合数:7975
和了:
1位:4259回 (53.40%)
2位:2551回 (31.99%)
3位:858回 (10.76%)
4位:307回 (3.85%)
平順:1.651

放銃:
1位:607回 (7.61%)
2位:942回 (11.81%)
3位:1656回 (20.76%)
4位:4770回 (59.81%)
平順:3.328

別々のデータはこちら 7700, 8000

「本当にこのデータ合ってるの?」

ごもっともです。C#で書いたソースコードを貼っておくのでプログラミング的ミス、あるいは数え上げ的ミスがあったら教えてください。(他力本願デバッグの術)
Program.cs FileRead.cs Analyze.cs Data.cs
以前適当なシミュレーターを作って試した時とかなり似た結果になっているので多分大丈夫だと思うのですが…。ちなみにその時は以下の通りでした。(各1万回試行)

和了、1000〜8000の順
2753, 2923, 2412, 1912 平順:2.3483
3108, 3092, 2162, 1638 平順:2.233
3626, 3406, 1871, 1097 平順:2.0439
5315, 3200, 1107, 378 平順:1.6548

放銃、1000〜8000
2161, 2195, 2475, 3169 平順:2.6652
1810, 2030, 2529, 3631 平順:2.7981
1402, 1694, 2422, 4482 平順:2.9984
713, 1162, 2119, 6006 平順:3.3418


条件にマッチした牌譜の一覧も貼っておきます。
1行ごとに「牌譜URL 和了した人 放銃した人, 和了した人の最終順位 放銃した人の最終順位」の順で書いてあります。
例えば、「http://tenhou.net/0/?log=2009022012gm-00e1-0000-214b9ad7&tw=0 1 3, 1 4」は、
1=下家=Bさんが和了した人、3=上家=Dさんが放銃した人で、最終的に和了した人が1位、放銃した人が4位です。

1000, 2000, 3900, 7700, 8000

2011/10/02 追記

バグありました。
ダブロンのケースを除外したいのに「ダブロンで、目的の点数を和了した人が先に表示されている場合」が含まれてしまっていました。
データを修正しておきました。どれも全体の1%程度で結果に殆ど変わりはありませんでしたが…。
修正前のソースコード Analyze.cs, Data.cs

他にも何か間違いがあったら教えていただけると幸いです。