パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

go言語初心者が挑む(棋譜データから終局の盤面を作成、言語のポイント解説付き)

2019-09-30 | プログラムをマスター計画2020

数日前に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)
}

 


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。