石の上にも3日ぐらい ということで、
以前Pythonで作成してgoに移植したものをさらにTypeScriptに移植してみました。
囲碁クエストの棋譜データから終局時の盤面を作成
go言語初心者が挑む(棋譜データから終局の盤面を作成、言語のポイント解説付き)
一番はまったのは16行目
let koma=board[p];だとundefinedという謎の値が入っていたのが原因
これが原因で処理時間が増えてタイムアウトを引き起こしていました。
またバグ発見のためにconsole.logを多用してしまいました。
検証用
ソースリスト
function get(board: string,p: number){
let koma=board.slice(p,p+1);
if (koma=="." || koma=="#"){
return {g1:0,g2:0,rboard:board};
}
let sp = [p];
let dp = [p];
let dlist = [-1,1,-11,11];
for (let i=0;i<100;i++){
if (sp.length==0)break;
p=sp[0];
sp.shift();
for (let d of dlist) {
let np=p+d;
let b=board.slice(np,np+1);
if (b==koma && dp.indexOf(np)==-1){
sp.push(np);
dp.push(np);
}else if (b==".") {
return {g1:0,g2:0,rboard:board};
}
}
}
let g = dp.length;
for (let p1 of dp) {
board=board.slice(0,p1)+"."+board.slice(p1+1);
}
if (koma=="o"){
return {g1:0,g2:g,rboard:board};
}
return {g1:g,g2:0,rboard:board};
}
function replAll(txt: string):string{
let b = ["W","B","[","]",")","a","b","c","d","e","f","g","h","i"];
let t = ["","","","","","1","2","3","4","5","6","7","8","9"];
for (let i=0;i<b.length;i++){
txt=txt.split(b[i]).join(t[i]);
}
return txt;
}
function main() {
let readline=["(;GM[1]SZ[9]KM[7]RU[Chinese]RE[W+-2.0]","PB[shxxx (1318)]","PW[fixxx (1383)]",";B[ee];W[cd];B[dd];W[cg];B[dg];W[ce];B[df];W[ge];B[fe];W[gc];B[gf];W[gd];B[hf];W[he];B[fb];W[gb];B[cf];W[bf];B[bg];W[be];B[ch];W[dc];B[ec];W[db];B[eb];W[if];B[ie];W[id];B[hc];W[hb];B[ig];W[ie];B[hg];W[fa];B[ea];W[ga];B[cc];W[cb];B[bc];W[bb];B[af];W[ae];B[ag];W[ac];B[de];W[da];B[ed];W[fd];B[fg];W[fc];B[];W[])"];
let noUse = readline[0];
let t1 = readline[1].slice(3).split(" ");
let t2 = readline[2].slice(3).split(" ");
let t4 = replAll(readline[3].slice(1)).split(";");
let board="###########";
for (let i=0;i<9;i++){
board=board+"#.........#";
}
board=board+"###########";
let dlist = [-1,1,-11,11];
let pg1=0;
let pg2=0;
let i=-1;
let k=["o","x"];
for (let t of t4) {
i++;
if (t!="") {
let n=Number(t);
let p=n/10+(n%10)*11;
board=board.slice(0,p)+k[i%2]+board.slice(p+1);
for (let d of dlist){
let {g1,g2,rboard}=get(board,p+d);
board=rboard;
pg1=pg1+g1;
pg2+=g2;
}
}
}
for (let i=0;i<9;i++) {
let p=(i+1)*11+1;
console.log(board.slice(p,p+9));
}
console.log(t1[0],pg1);
console.log(t2[0],pg2);
}
main();