Created
June 12, 2014 17:03
-
-
Save permil/52c82884624598829f59 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
/* | |
PlayerName="permil" | |
【感想・作戦・工夫した点など】 | |
勝率が下がる一方なので諦めて戻しました・・・(~_~;) | |
調整の可能性があるためコピペが多いままですがご容赦ください。 | |
基本ロジックは過去の戦歴から統計を取り、直近数手と同じ進行が過去にあった場合には、 | |
「相手がその次に出していた手に勝てそうな手」を出す、です。 | |
評価順は、 | |
1. 自分と相手の過去3手 | |
2. 相手の過去3手 | |
3. 自分と相手の過去2手 | |
4. 相手の過去2手 | |
5. 当てはまらなければG | |
1〜4により、「相手の直近数手から次の手を予測」するようなアルゴリズムや、 | |
「相手を見ずに一定のパターンを繰り返す」ような相手に勝つことを期待しています。 | |
また5により、「各手の割合が1:1:1に近くなる」ような相手からも細かく得点を奪い、 | |
合計得点で上回ることを期待しています。 | |
*/ | |
function play(h) | |
{ | |
var len = h[0].length; | |
if(len<3) { return "PGP"[len] } | |
var hist2 = {}; | |
var hist3 = {}; | |
var hist2_en = {}; | |
var hist3_en = {}; | |
for(var i=0;i<len;i++) { | |
if(i<len-2) { | |
var me = h[0][i] + h[0][i+1]; | |
var en = h[1][i] + h[1][i+1]; | |
var both = me + en; | |
if(!hist2_en[en]) { hist2_en[en]={'G':0,'C':0,'P':0}; } | |
if(!hist2[both]) { hist2[both]={'G':0,'C':0,'P':0}; } | |
hist2_en[en][h[1][i+2]]++; | |
hist2[both][h[1][i+2]]++; | |
} | |
if(i<len-3) { | |
me = me + h[0][i+2]; | |
en = en + h[1][i+2]; | |
var both = me + en; | |
if(!hist3_en[en]) { hist3_en[en]={'G':0,'C':0,'P':0}; } | |
if(!hist3[both]) { hist3[both]={'G':0,'C':0,'P':0}; } | |
hist3_en[en][h[1][i+3]]++; | |
hist3[both][h[1][i+3]]++; | |
} | |
} | |
return select(hist3[h[0][len-3] + h[0][len-2] + h[0][len-1] + h[1][len-3] + h[1][len-2] + h[1][len-1]]) || | |
select(hist3_en[h[1][len-3] + h[1][len-2] + h[1][len-1]]) || | |
select(hist2[h[0][len-2] + h[0][len-1] + h[1][len-2] + h[1][len-1]]) || | |
select(hist2_en[h[1][len-2] + h[1][len-1]]) || | |
'G'; | |
} | |
function select(hist) { | |
if(!hist) { return null; } | |
if(hist['G']==0) { | |
return (hist['P']==0) ? 'G' : 'C'; | |
} | |
if(hist['P']==0) { | |
return (hist['C']==0) ? 'P' : 'G'; | |
} | |
if(hist['C']==0) { | |
return 'P'; | |
} | |
return 'G'; | |
} | |
// イベントを受け取り、グーチョキパーのどれを出すかを返信するための仕組みです。 | |
self.addEventListener('message', function(e) { | |
self.postMessage( play(e.data.split(",")) ); | |
}, false); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment