
「 連データベースを作ろうと思う」

「 勝手にしろだぜ」

「 それはデータベースなの?」

「 説明する」
[1]A1
[2]B2
[3]C3
[4]D4(B2)

「 ↑ 実践譜を用意するのが めんどくさいので適当だが、
将棋のような棋譜を 囲碁にも導入するとする」
[4] D4 (B2)
ーーー ーーー ーーー
1 2 3
1. 何手目(序数)
2. 着手点
3. コウ

「 ↑ 将棋と違って コウ も記憶しておく必要がある」

「 なんで必要なんだぜ?」

「 人間の棋譜は さかのぼって読まないから 戻し方を書いていないが、
コンピューターは さかのぼって読むから 戻し方も書いている必要がある」

「 さかのぼり方を考えるの、逆関数って言うのよ。
関数に比べて 逆関数は ふだん そんなこと考えて生きてない人には 奇異 に映るのよ」

「 勝手に映ってろだぜ」
[1]A1
[2]B2
[3]C3
[4]D4(B2) 取った石:C3
ーーーーーーーー

「 ↑ だから 棋譜には 取った石を記録しておく必要があるんだが……」
[20]J10 取った石:G9,G10,H9,H10
ーーーーーーーーーーーーーー

「 ↑ 大石を打ち上げたら すごい数になるかもしらん。
360個ぐらい石を打ち上げたらどうしよ」

「 360個 覚えておけだぜ」
リレーショナル・データベース

「 棋譜に 取った石 360個も 記録したくないぜ。
既存の技術に倣って、リレーショナル・データベースのやり方を導入しようぜ?」
[20] [G9] → G9,G10,H9,H10
ーーーーー ーーーーー ーーーーーーーーーーーーーー
1 2 3
1. 何手目(序数)
2. 連の石の中で一番小さな番地
3. 連の石の番地のリスト

「 ↑ 何手目と、連の石の中で一番小さな番地 を覚えておけば、
どの連か 一意に指定できるはずだぜ」

「 ほんとか」

「 棋譜の変化は 考慮しないものとする」
[20]J10 取った連のId:G9
ーーーー

「 ↑ 棋譜は すっきりするな」

「 石を打ち上げるたびに 何番地の石を取った、と いちいち 覚えておくの?」

「 そうだぜ」

「 打ち上げる石の数は 19路盤なら 1~360個あるな。
可変長配列に格納するか」

「 Go言語は ガベージコレクション を使う言語らしく、
その占有メモリを参照している変数が無くなれば 占有メモリは開放されると思うぜ」

「 ほんとか」

「 ほんとよ。 細かい人は ポインター変数に nil を代入してでも
占有メモリを 解放の対象にするわよ」
別々にする必要性

「 棋譜と 連データベースを 別々にする必要性はあるのかだぜ?」

「 のちのち、取った石の連だけではなく、
全局面の すべての連を 連データベースに 格納する予定だぜ」
マッピング

「 『20手目のJ2』 とか 『30手目のK10』 とか
どういう構造に並べてもち、
どういう探索で見つけ当てる?」

「 Go言語に ハッシュテーブル はあるの?」
[Go言語] 初心者必見シリーズ: マップ(Map)

「 ↑ マップという名前であるようだぜ」

「 キーはどういう構造にする?」
何手目 × 盤の面積 + 連の石の最小の番地

「 ↑ 上式なら int型 に収まるだろうし、文字列よりシンプルじゃないか?」
どうやって テストするのか

「 コードを書いたが、テストするの めんどくさいな」

「 連データベースを インポート、エクスポート できるようにしたらいいんじゃない?」

「 じゃあ JSONフォーマットを定義するかだぜ」
{
"header" :
{
"boardWidth" : 19,
"boardHeight" : 19
},
"rens" :
{
"{id}" :
{
"posNth" : 1,
"locate" : "A1 B2 C3 D4"
}
}
}

「 その `{id}` は手計算で求めんの?
このダンプを 設定ファイルとして見たとき、めんどくさくない?」

「 じゃあ "1, A1" みたいな文字列にするかだぜ?」

「 とりあえず それで」
連データベースに 連を追加してみようぜ?

「 お父ん、 連データベースは どうやって使う?」

「 初期局面は、盤面をフルスキャンしろだぜ」

「 なんか 適当な 囲碁の局面図が欲しいけど、囲碁は棋譜の権利にうるさいのよ。
適当な盤面のデータを作って 読み込んでみましょう」

「 ↑ これでいいかな?」

「 適当だな」

「 その盤面をスキャンして、連データベースを 外部ファイルにエクスポートして、
盤上の連を認識できているか 確かめましょう!」

「 ↑ 連じゃなくて なんか全部の交点を出力しようとしてないかだぜ?」

「 直せ!」
辞書順ソート

「 "A1" みたいな符号で 辞書順に出力すると、
読取方向が変わるぜ!」

「 "01A" にすりゃ いいんじゃないの?」

「 可読性が下がるだろ」

「 外部テキストファイルは 人間が読むものと思えだぜ。
可読性の低いファイルは 流行らない」

「 国際囲碁連盟に従う必要は無いんじゃないの?」

「 パワフルだな」

「 最小の番地を Id にするのではなくて、最大の番地を Id にしたらどうだぜ?」

「 発想きたな」

「 人間は 右下から 盤を見るの? 見づらいんだけど」
"1, 01A"

「 ↑ Id だけ 段→列 にひっくり返すというのは どうだぜ?」

「 納得度があり、許容範囲内の答えだぜ。 それで行こ」

「 ↑ いーんじゃねーの」
2手目以降は差分

「 2手目以降は、盤面全体をスキャンしなくても、
石を置いてみて
置く前の盤と変ったところだけ 記録すればいいと思うんだぜ」

「 その前にやることがあると思うぜ。
どの連と 隣接しているか を表せだぜ」

「 "001,01A" という黒石の連は、 "001,01B" という黒石の連と
隣接しているのよ」

「 それは 『連データベース』 ではなくて 『連単位データベース』 のような
別の構造で やりたいぜ」

「 記事が長くなったので 次の記事にしろだぜ」