数日前にPython3で作成したものの移植
一番悩んだのは文字列のn番目を取るためにs[n]とするとその場合バイトコードに変更されてしまうところ
(s[n:n+1]とスライスで取るとその一文字が取れます)
ループからのbreakはgotoを使いました。
あとはイテレータをループでまわすときにindexもついてくるとか
独特な方言がありますが、慣れれば使い勝手は良さそう。
最初はブラウザー上で作成
せっかく作ったのでローカル実行環境でも動かせるように修正
go言語初心者のポイント解説 ()カッコ内は参照行
1) 無駄は許してくれない 使っていないimportとか変数はエラーになる funcの戻り地で使わなければ _ で受ける(68)
2) 配列は個数も決められるけど決めない方が便利 (定義10,長さ15,先頭削除17,追加22)
3) クラス内メソッドがないため、全てfuncを呼び出す(62,68)
4) 文字列を[2]とかで取得できるがバイトで返すので要注意!文字で取りたい時はスライスを利用[2:3]で取る(70)
5) 変数は:=で型も自動で入る。funcなどでは型も必要その場合の型指定は後ろに記述(59,60,45)
6) for rangeでイテレータでループできる。インデックスはもれなくついてくる。使わない場合は _ で受け取る(12,18)
7) func複数返すのもお手のもの(7)
8) and は && , orは || (21,9)
9) while系のループはない forを利用 breakはラベル定義が事前に必要(14,18, breakの代わりにgoto使用15)
10) fmt.Printlnは複数定義もいろんな型も一度に表示できて便利(81,83,84)
11) 変数:=は初回のみ2度使うとエラー
12) 割り算をしても事前の型が優先される(69結果は整数)
13) 文字列定義で*はダメでした(59,60,61)
14) if forに()が必須ではない 地味だけどうれしい(9,14)
15) 文字列の比較 == でOK(9)
16) 文末に;がいらない 地味だけどうれしい
さて実行しようとすると、go言語がパソコンに入っていなかった
sudo apt install golang-goでカンタンにインストールできますがこの方法だとバージョンはちょっと古い。(go1.10.4)
この時点の最新は1.13.1
最新を入れたい場合はgolang installで検索すると本家のインストール手順がすぐ見つかります
実行結果
実際の対局後
この対局は中押し負け。
ソースリスト
package main
import "fmt"
import "strings"
import "strconv"
func get(board string,p int) (int,int,string){
koma:=board[p:p+1]
if koma=="." || koma=="#"{return 0,0,board}
sp := []int{p}
dp := []int{p}
dlist :=[]int{-1,1,-11,11}
for i:=0;i<100;i++{
if len(sp)==0{goto LABEL}
p=sp[0]
sp=sp[1:]
for _, d := range dlist {
np:=p+d
b:=board[np:np+1]
if b==koma && in(np,dp)==false{
sp = append(sp, np)
dp = append(dp, np)
}else if b=="." {return 0,0,board}
}
}
LABEL:
g:=len(dp)
for _, p1 := range dp {board=board[:p1]+"."+board[p1+1:]}
if koma=="o"{return 0,g,board}
return g,0,board
}
func in(a int, list []int) bool {
for _, b := range list {
if b == a {return true}
}
return false
}
func repl(txt string, b string, t string) string {
return strings.Replace(txt, b,t, -1)
}
func replAll(txt string) string{
b := []string{"W","B","[","]",")","a","b","c","d","e","f","g","h","i"}
t := []string{"","","","","","1","2","3","4","5","6","7","8","9"}
for index, b1 := range b {txt=repl(txt,b1,t[index])}
return txt
}
func main() {
_="(;GM[1]SZ[9]KM[7]RU[Chinese]RE[B+R]"
t1 := strings.Split("PB[Li*** (1336)]"[3:], " ")
t2 := strings.Split("PW[fi*** (1421)]"[3:], " ")
t3 := ";B[fd];W[cf];B[ef];W[dc];B[cc];W[cd];B[dd];W[de];B[ed];W[cb];B[bc];W[bd];B[db];W[ac];B[bb];W[ee];B[fe];W[gf];B[ff];W[gg];B[he];W[ge];B[hd];W[gd];B[gc];W[hf];B[fh];W[fg];B[eg];W[gh];B[dh];W[ch];B[gi];W[hi];B[ih];W[fi];B[eh];W[hh];B[ig];W[ie];B[hc])"
t3 = replAll(t3[1:])
board:="###########"
for i := 0; i < 9; i++ {board=board+"#.........#"}
board=board+"###########"
t4 := strings.Split(t3, ";")
dlist :=[]int{-1,1,-11,11}
pg1,pg2:=0,0
for i, t := range t4 {
if t!="" {
n,_:=strconv.Atoi(t)
p:=n/10+(n%10)*11
board=board[:p]+"ox"[i%2:i%2+1]+board[p+1:]
for _, d := range dlist {
g1,g2:=0,0
g1,g2,board=get(board,p+d)
pg1+=g1
pg2+=g2
}
}
}
for i := 0; i < 9; i++ {
p:=(i+1)*11+1
fmt.Println(board[p:p+9])
}
fmt.Println(t1[0],pg1)
fmt.Println(t2[0],pg2)
}