gnugo

『山の近くで愉快にくらす』(信濃毎日新聞社)なんて本を読んだ。著者は、北尾トロさん。 ん、この著者の本、昔読んだ事があるぞ。

「裁判長ここは懲役4年でどうすか」とか「傍聴弁護人から異議あり」とか、笑わせてくれる 一連のものだ。今度はその人が、猟師になりたい!2、なんて副題が付いた本を出したと 言うんだから、これはもう読んでみる鹿ないだろう。

事の顛末は、どうもこういうことらしい。東京に住む著者が田舎暮らしにあおこがれ、松本近辺に 通ううち、セカンドハウスを借りた。先行で、女房小供が田舎に定住。著者は、東京と田舎を 行ったりきたり。そして段々と田舎に比重が移って行く。

折角田舎に来たんだから、田舎ならではの事をやろう。そして眼を付けたのが何と、猟師に なろうという発想。猟師になるには、試験を受けて資格を取った後、免許を取得しないと いけないらしい。

猟の免許は4種類あるとか。網を使ったもの、罠を使ったもの、空気銃を使ったもの、最後は ライフル銃等空気銃以外での猟。

4種の免許はそれぞれ違い、種類毎に資格を得る必要がある。猟銃免許だと、免許取得に15k、 猟銃所持許可に60k、狩猟者登録に20k、ハンター保険等に15k、全部で最低11万円は、公的に 必要になる。この他、講習会の費用とか、猟友会の会費とか、銃やそれを保管するロッカーも 必要になるので、30万円以上の出費を覚悟しないといけないらしい。

著者は、こういう出費をして、晴れて猟師にはなったけど、初年度は猟価ゼロに終わった。 その事は、猟師になりたい本に書いたそうだ。そうか、それだけの投資は本を書くための 材料になったのかと失礼な話もあったので、パート2で、猟価を得る所を書いたとか。

自分への挑戦らしいです。下調べで、何処に獲物が居るか調査。狩猟期間は、本州だと 11/15から翌年2/15までの期間しか無いそうな。この時期以外は、弾は撃てないので、 ひたすら調査、撃ってもし当ったら、獲物を回収しなければならない。命を頂くのだから、 粗末にしてはいけない。必ず、全部食べてあげる事が、命を奪った者の仁義。

解体方法、料理方法も体験して身につけなければならない。身近で先輩の猟師を見つけ、 その人から技を伝授してもらう。猟を通じて、地元に溶け込んで行くのが楽しいと著者は 言う。そうでしょう、そうでしょう。頑張ってください。

ちなみに、獲物は鳥とか鹿とか猪とか熊とかあるけど、彼は鳥にこっているらしい。 まあ、空気銃では熊を倒せませんから。でも、そのような大型獣の狩猟に参加は出来るそうだ。

いわゆる、巻き猟というやつ。勢子と呼ばれる人達が、獲物を居そうな所で囃したて、獲物を 追い出す。慌てた獲物はたいがい勝手て知ったる獣道から逃げて行くので、そこに立ち子と 呼ばれる、ゴルゴ13が待ち構えていてズドーン。

勢子に参加するには、体力必要。冬場なので雪のある所を、1時間も2時間も声を出しながら、 登ったり下ったりするんだぞ。オイラーも昔、山スキーで経験あるけど、それは大変な事ですよ。

ああ、経験で思い出した。取った獣は食べる事だけど、最近はジビエとか言って、それらの 肉が出回り、また食べさせてくれるレストランが出来つつあるね。オイラーも、つい1月程前に、 鹿肉のハンバーグを食べたぞ。ちょっと獣臭(動物園の臭いね)がしてワイルドな味だった。

昔、ドイツに駐留してた時、鹿、うさぎとか、普通に食べてたなあ。あちらは狩猟の本場 ですからねえ。鹿肉のステーキに野ぶどうのソースを付けて食べるなんて最高の贅沢と 思ったぞ。

ああ、贅沢と言えば、鷹を使って鴨等の鳥類を取る、鷹狩りが贅沢です。徳川の殿様とかは、その 為だけに、鷹匠を召抱えていたんですから。現代でも、細々と続けている方がおられるそうな。 件の著者も、猟師仲間の紹介で、その方の話を聞いた事があるとか、いいな。楽しそう。

lisp debug

gnugoを作って、付属のgnugo.elを使おうとすると、旨く動かない。で、infoして、新しい やつが出てるって知り、それを使って事なきを得たんだけど、世の中そうそう旨く行くとは 限らないはず。そういう時はどうするか? emacsは勝手に昔の互換性を棄ててくれるって言う 困った性質があるから、そういう時の為に、少し調べておこう。

具体的にどんなエラーになったか? gnugoを起動した時に、minibufferに、ちょろっと

Args out of range: "", 0

こんなメッセージが出てきた。メイン画面には何の表示も無しって症状。レンジを外れてるって 何処で出してる? それが分かれば、追跡出来るだろうに。C-x C-bして、関係ありそうな Messages bufferが出来上がっている事を知る。

Loading /home/sakae/src/gnugo-3.8/interface/gnugo.el (source)...
gnugo.el: `flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'. [7 times]
Loading /home/sakae/src/gnugo-3.8/interface/gnugo.el (source)...done
let*: Args out of range: "", 0

ほらね。って、この方法は、たった今、思い付いた調査法。emacsの人達って、こういう事を 平気でやってくれるから、困り者。指示通りに変更してみたけど、やはりレンジ外が出てくる。

えと、こういう時の調べ方ってあったよな。相手はlispマシーンだからな。デバッガの 項でも調べればいいのかな。 17.1 Lispデバッガ ふむ、ある変数を有効にすると、エラーに至る道筋が見えるとな。

(setq debug-on-error t)
C-x C-e
M-x gnugo

スクラッチバッファーで、上記の操作。

Debugger entered--Lisp error: (args-out-of-range "" 0)
  aref("" 0)
  (let* ((col (aref value 0)) (one (+ 97 (- (if (< 72 col) (1- col) col) 65))) $
  (if (string= "PASS" value) "tt" (let* ((col (aref value 0)) (one (+ 97 (- (if$
  gnugo-gtp-to-sgf("")
  (format "[%s]" (gnugo-gtp-to-sgf x))
  (lambda (x) (format "[%s]" (gnugo-gtp-to-sgf x)))("")
  mapcar((lambda (x) (format "[%s]" (gnugo-gtp-to-sgf x))) (""))
  (apply (quote concat) (mapcar (function (lambda (x) (format "[%s]" (gnugo-gtp$
  (gnugo-note :AB (apply (quote concat) (mapcar (function (lambda (x) (format "$
  (if black-stones (gnugo-note :AB (apply (quote concat) (mapcar (function (lam$
  (let ((g-blackp (string= "black" (gnugo-get :gnugo-color))) (black-stones (sp$
  gnugo-initialize-sgf-tree()
  gnugo-board-mode()
  (if (and (not new-game) (< 0 n) (y-or-n-p (format "GNU Go game%s in progress,$
  (let* ((all (let (acc) (let ((--dolist-tail-- (buffer-list)) buf) (while --do$
  gnugo(nil)
  call-interactively(gnugo record nil)
  command-execute(gnugo record)
  execute-extended-command(nil "gnugo")
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

バックとレースが出てきた。emacsは、リスプマシーンって事を実感しましたよ。ここから 先は、lisperになって地道な追跡が待っているとな。大変だーー、だけどとっかかりは こういう方法で得られる。

ifdefを隠す

lisp繋がりで、もう一つ調べておきたい事が有る。それは、C語のソースを読んでいる時に、 #ifdef WINDOWS なんてのが、頻出して鬱陶しいのだ。どれぐらいそういうのが有るか 調べてみたぞ。

まずは、newlispのソースから

nb7$ grep ifdef *c | cut -d' ' -f2 | sort| uniq -c| sort -nr | head -5
 100 SUPPORT_UTF8
  68 WINDOWS
  39 BIGINT
  34 DEBUG
  25 SUPPORT_UCP
nb7$ grep ifndef *c | cut -d' ' -f2 | sort| uniq -c| sort -nr | head -5
  62 NEWLISP64
  37 WINDOWS
  26 SUPPORT_UTF8
  23 EMSCRIPTEN
   8 LIBRARY

31本のソースに、これだけ切り分けが有るって、作者の方、よくやるわ。そんじゃ、他の ものはどうだ? emacs-24.5/srcの中を調べてみる。

nb7$ grep ifdef *c | cut -d' ' -f2 | sort| uniq -c| sort -nr | head -5
 203 HAVE_WINDOW_SYSTEM
 139 WINDOWSNT
  80 USE_GTK
  73 HAVE_X_WINDOWS
  68 ifdef
nb7$ grep ifndef *c | cut -d' ' -f2 | sort| uniq -c| sort -nr | head -5
  31 DOS_NT
  24 MSDOS
  21 WINDOWSNT
  20 HAVE_X_WINDOWS
  14 HAVE_NS

こちらも、いろいろ切り分けていますなあ。

で、検索してみると、ルビキチさんの本がヒットした。 emacs ifdef 隠す みんな、悩みは共通って事で、emacsに標準でマイナーモードが用意されてた。この使い方だと、 その場で設定するようだ。恒久的に設定するにはどうするの?

一つのヒントを提示してくれている方が居た。 Emacs + hide-ifdef-mode の自分なりの使い方メモ この方の例に倣って、

;; hide-ifdef-mode
(add-hook 'c-mode-hook
    '(lambda ()
       (hide-ifdef-mode t)
       (hide-ifdefs) ))
(add-hook 'hide-ifdef-mode-hook
      (lambda ()
       (unless hide-ifdef-define-alist
         (setq hide-ifdef-define-alist
              '((p1 DEBUG BIGINT)
                (p2 WINDOWS WINDOWSNT) )))
       (hide-ifdef-use-define-alist 'p2)))

もっと詳しくは、 /usr/share/emacs/24.5/lisp/progmodes/{hideif.el,hideshow.el} あたりを見れ。

その他、emacsユーザーの生態観察って事で、 Emacs ユーザーの方に質問です。これは便利! と思える elisp プログラムを教えてください。 参考にすると良いかも。回りに相談相手がいないと、どうしてもこうなっちゃうね。

gnugo

gnugoで遊んで(遊んでもらって)いるんだけど、全く勝てない。空間認識が出来ないの だろう。こういうのには慣れるしかないのかな。

何とかして相手を出し抜いてやろう。そうだ、相手の思考ルールを知れば何とかなるんじゃ ないかい。ソース嫁。いきなりだと辛いので、試合が始まった時、どのあたりに居るか 、スパイもとえ、昔風に言うと、忍びとか間者を放ってみれ。

こちらは、emacs経由で、盤と石をリアルに表示した時の図

(gdb) bt
  :
#7  0xb754805d in fgets () from /lib/libc.so.6
#8  0x08059b8d in gtp_main_loop (commands=0x8509160 <commands>,
    gtp_input=0xb76ae5a0 <_IO_2_1_stdin_>, gtp_output=0xb76aed60 <_IO_2_1_stdout_>,
    gtp_dump_commands=0x0) at gtp.c:95
#9  0x0804f04a in play_gtp (gtp_input=0xb76ae5a0 <_IO_2_1_stdin_>,
    gtp_output=0xb76aed60 <_IO_2_1_stdout_>, gtp_dump_commands=0x0,
    gtp_initial_orientation=0) at play_gtp.c:353
#10 0x0804b2d6 in main (argc=4, argv=0xbfb7bd24) at main.c:1431

こちらは、チープにASCII表示の図。ASCIIモードはdebug専用に使うらしい。

(gdb) bt
  :
#7  0xb75a105d in fgets () from /lib/libc.so.6
#8  0x0804d1a5 in do_play_ascii (gameinfo=0xbfacda78) at play_ascii.c:667
#9  0x0804d087 in play_ascii (tree=0xbfacda70, gameinfo=0xbfacda78, filename=0x0,
    until=0x0) at play_ascii.c:613
#10 0x0804b375 in main (argc=1, argv=0xbfacdbf4) at main.c:1463

ソースを追っていってもいいんだけど、パターンマッチしながらやってると思うんで、 その思考の元を探してみる。ぴったりな名前のdirが有ったぞ。

[sakae@fedora patterns]$ ls *.db
aa_attackpats.db  fuseki.db       mc_mogo_classic.db      owl_vital_apats.db
attack.db         gogo.db         mc_montegnu_classic.db  patterns.db
barriers.db       handicap.db     mc_uniform.db           patterns2.db
conn.db           hoshi_keima.db  mokuhazushi.db          sansan.db
defense.db        hoshi_other.db  oracle.db               takamoku.db
endgame.db        influence.db    owl_attackpats.db
eyes.db           komoku.db       owl_defendpats.db

攻撃とか防御壁とかご宣託とか布石とか、それらしいのが有りますなあ。一つ開いてみるか。 初盤が大事らしいので、fuseki.dbを見てみる。

#  ?     : don't care
#  .     : empty
#  X     : your piece,
#  O     : my piece,
#  x     : your piece or empty
#  o     : my piece or empty
#  *     : my next move
#  -, |  : edge of board
#  +     : corner of board

パターンは文字列で表す。そしてその凡例が載ってて、実際の布石は

Pattern F1

|..???...ooo   approach star
|...X.....O.
|.....*.....
|...........
|...........
+-----------

:8,FEad

星を作りたい時は、こんな風に打てとな。そして、コロンから始まっているのは、付帯 情報。多分、効果点とかなんだろうな。こういうのが幾つあるか調べたら、172個登録 されてた。データベースに登録されてる、総計は5300個を超えてた。 凄いもんだなあ。資料を斜め読みした感じでは、自分でパターンを追加したり強化する 事が出来るみたい。その為のツールも提供されてた。

SGF

ゲームの記録を残すためのフォーマットだそうです。 SGF File Format FFによれば、SGF is the abbreviation of 'Smart Game Format'. との事。碁だけじゃなく、オセロとかチェスとかヘックスとかバックギャモンとかの ゲームにも対応してるとか。チェスだと、ゲームの譜の事をノーテーションとか言うらしい。

gnugoでも、記録を残せるようになっている。どんな風に記録されるかやってみた。

nb7$ cat mygame.sgf
(;FF[4]GM[1]SZ[19]DT[2015-11-21]RU[Japanese]
AP[gnugo.el:2.2.12]
KM[0.0]
PB[]
PW[GNU Go 3.8]
;B[aa];W[po];B[ss];W[cp])

最初のFFはバージョン番号、GMはゲーム名、SZは碁盤のサイズ、日付、日本ルールかな。 APは通信プログラムか。KMは碁用語でコミと呼ばれる一種のハンディキャップ。 囲碁用語一覧を参照。 また、ウェキペディアの囲碁のページとか 囲碁のルール なんてのも面白い。こちらは簡潔にして的を得た囲碁」のルールについて です。ルールを覚えると、45級だかが得られるそうですよ。

回りを囲んで石を取ると、その石はアゲハマって名前が付けられて、碁筒の蓋に移される。 捕虜収容所送りだな。戦いが続き、陣地が形成され、その中に取り残された相手の石は、死石 とか言うそうな。人質だな。

戦いが終了した時、捕虜と人質の交換を行う。相手の陣地の目を 捕虜と人質で潰し(陣地との交換だな)、残った陣地の大小で勝ち負けが決まる。 やっと正確なルールが把握出来ましたよ。これって、国連が認める国際ルールだよね。 それとも、世界文化遺産候補?殺し合いが無いから、平和なゲームだ。

PBとPWは、黒と白石の対戦者名。そして、最後は、打った手、Bが黒の手で、Wが白石の手。 括弧内は、交点位置。左上が、AAで、右上がSA、左下がASで右下がSSって具合。嗚呼、角の場所は 隅って言う囲碁用語が有ったわい。

gmp and gtp

囲碁のプログラムを作ると言う事は、碁脳を作るのと同じ事、誇大妄想的に言うと、人口頭脳を 作ってる事になる。今流行りの深層学習とかを付け加えたら、素晴らしい成果が出るんで しょうな。誰かやれ。

で、ポツンと脳だけあると、SFに出て来るホルマリン漬けの脳を想像しちゃうけど、その脳には 確か電極やらが差し込まれていたはず。外界とのやり取りをする為の信号線だ。こういう信号線は 規格化しておいたら、いろいろな脳に差し込んで使えるので便利。

囲碁プログラムも同様に、外部とやり取りする為の信号線と言うか、通信の取り決めがなされて いる。信号線の先に、入出力回路を付け加えるわけだ。

昔の規格は、Go Modem Protocol略してGMPですよ。 昔の規格らしくモデムなんて単語が使われている。そうさ、モデムを繋げば、地球の裏側に あるコンピュータとも会話出来たんだぞ。

gnugoの人は考えた。gnugoを強くするにはどうしたらいいか。知識をデータとして蓄えて、 それがきちんと動くか、徹底的にテストしよう。それを繰り返せば強くなるはず。 そのためには、簡単に試験出来るようにしなければ....

GMPって規格は、それにはちと不便だな。人間が見ても、どんな信号が流れているか簡単に 判別出来た方がよい。そうunix的なテキスト文化。 かくしてして、Go Text Protocolが生まれた。 略してgtpね。

こういう分かり易い規格を公開しておけば、GUI大好き人間が、かっこいい碁盤とか、 ゲームの進行状態表示機を作ってくれるだろう。この作戦は大成功。

オイラーも、Windows7にgnugo脳味噌だけを取ってきて、適当な所に放り込み。表示機は 、昔から持ってるemacs君にお願い。これで、GUI版のgnugo対局システムが簡単に出来上がったよ。 楽でいいわーー。

regression

そして脳味噌試験用の試験器ですよ。どかかの自動車メーカーみたいに嘘はありません。 公開テストが待っています。その公開場所は、regressionって言うdir。脳味噌と 一緒に付いてくる。

ああ、regressionって回帰。要するに パターンとかを変更したならミスっていないかテストしましょって事。試験官もシェル族、 perl族、awk族、python族、pike族と盛り沢山。

資料を読むと、試験官で一番厳しいのはpike族らしい。初めて聞く名前だな。emacsで、 regress.pikeを開いてみたら、ちゃんとpikeモードで色付けしてくれた。デフォで このモードがサポートされてるって事は、世界的には有名なのか。ふと、C-h m で、 どんな編集が出来るか調べたら、なんとPikeモードって、cc-mode.elで代用してた。 pikeってCフラフラに近いんだな。

乗り掛けた船なんで、乗ってみよう。

Pike

本山は Pikeですな。URLにseが混じっているって、スゥーデンが 原産国だな。ウィキにPikeの簡単な 説明が有った。

ネットを検索すると、goの父、Rob Pike先生が優勢なんだなあ。隠れるようにして、 Pikeって意外とやるじゃん、って思ったPikeとProcessing とか、 還暦おじさんがPikeの勉強を始めたいと思います と宣言されて、その後の便りが無いなあ。まあ、日本では非常にマイナーって事が 分かりましたよ。 今までどのくらいプログラミング言語を触ってきたか(3秒で挫折したものものも含む) Ver.7 な方も、遭遇してないっぽい。

御託を並べてるより、実際に動かしてみれ。NetBSDに入れてみます。GMPを入れておくと 無限精度演算が出来るそうですから、先に入れましょう。gnugoのgmpと被ってるな。文脈依存だから、 そこは分かるよね。

nb7$ pike
Pike v7.8 release 866 running Hilfe v3.5 (Incremental Pike Frontend)
> 111111111111111111111111 * 111111111111111111111111111111 ;
(1) Result: 12345679012345679012345666666654320987654320987654321

インストール方法は、ちょっと独自。READMEから

The top-level makefile (in this directory, not the src directory) has
all the magic you need to build Pike. Just type 'make'.
To install type "make install" or "make install_interactive".

いきなりmakeですよ。そして、インストールには、nstall_interactive なんて方法も あるとな。もの珍しいので試してみた。

質問は2つ出てきた。pikeを入れる(PATHの通った)dirは何処ですか? もう一つの 質問は、pike本体は何処に置きますか? こういう方法も有りか。 結果は、最初の質問の場所に、リンクが張られていましたよ。こういうのなら、後で飽きても 即座に、綺麗に削除出来るね。

NetBSDのpkgsrcにはpikeが無かったので野良で入れたけど、FreeBSDではportsになってた。 売りは、

Pike is an interpreted, object-oriented programming language.
It looks a bit like C and C++, but it is much easier to learn and use.
It can be used for small scripts as well as for large programs.

Pike is :
- High-level and powerful, which means that even very complex
  things are easy to do.
- Object-oriented, which means that you can use modern programming
  techniques to divide a large program into small pieces, which are much
  easier to write than it would be to write the entire program at once.
- Interpreted, which means that you don't have to wait for a program to
  compile and link when you want to run it.
- One of the fastest "scripting" languages available.
- Garbage-collected, which makes programming much simpler, and removes
  the risk for memory leaks and other memory-related bugs.
- Easy to extend, which means that you can create plug-ins, written in
  Pike as well as in C or C++, and integrate them with the rest of Pike.

らしい。C語に似てて、ちょびっとCよりも学びやすいとな。GCは勝手にやってくれるから お悩み不用。

で、御題を走らせてみます。永遠に続きそうなので、途中で打ち切りましたけど。こういう 時は、早いマシンが欲しいなー、と。

nb7$ ./regress.pike
reading                                  1.34    101206       0        0
owl                                     63.60  15038154   19782    92325
ld_owl                                  25.45   4772708   21720     5613
optics                                   1.91    259838       0     2689
filllib                                  9.07   1246414    1719    10176
atari_atari                             13.92   3317011    2560    19015
connection                              15.61   3630828       0    41483
break_in                                 1.82    502321     674     4549
blunder                                 25.55   3957775    4165    18111
unconditional                            2.29     38618       0        0
trevora                                 53.68  15184621   56396    81458
nngs1                                  165.51  50311277   70291   388145
strategy                               132.88  35620398   73359   272673
endgame                                 32.17   6786690    2797    66664
heikki                                   2.53    878008    1347     5888
 :

最初の数値は、実行時間って分かるけど、後の数値は何? どうも、ここで表示してるようだ。

  static void finish()
  {
    // Write nothing if no test from the file was run at all.
    if (sizeof(pass) + sizeof(fail) + sizeof(PASS) + sizeof(FAIL) > 0)
      write("%-37s %7.2f %9d %7d %8d\n", name, cputime, reading_nodes,
            owl_nodes, connection_nodes);
  }

オプション指定が出来るようだ。

nb7$ ./regress.pike -v owl:51-59
owl:51          pass 1 E19 [1 (E19|B19)]
owl:52          pass 1 S1 [1 S1]
owl:53          pass 1 S1 [1 S1]
owl:54          pass 1 H2 [1 (H2|J2)]
owl:55          pass 1 H2 [1 (H2|G2)]
owl:56          pass 1 Q19 [1 (Q19|T13)]
owl:57          fail 0 [1 (T13|N19)]
owl:58          pass 1 N19 [1 (T13|N19)]
owl:59          pass 1 Q19 [1 (Q19|T13)]
owl                                      6.88     74128      37      210
Total nodes: 74128 37 210
Total time: 6.88 (6.90)
Total uncertainty: 0.00

これに対するテスト文、owl.tstの該当箇所は

loadsgf games/owl04.sgf
52 owl_attack Q7
#? [1 S1]
53 owl_defend Q7
#? [1 S1]

碁譜 104番のQ7に対して、52番目では攻撃テスト、S1と返してきたら成功。53番テストは 防御だな。攻撃も防御も同じ石が期待値って事は、大事な眼って事か。

nb7$ ./regress.pike -v owl:52
owl:52          pass 1 S1 [1 S1]
owl                                      5.71     11525       4       87
Total nodes: 11525 4 87
Total time: 5.71 (5.56)
Total uncertainty: 0.00
nb7$ ./regress.pike -v owl:53
owl:53          pass 1 S1 [1 S1]
owl                                      5.57     12144       6       87
Total nodes: 12144 6 87
Total time: 5.57 (5.60)
Total uncertainty: 0.00
nb7$ ./regress.pike -v owl:52,53
owl:52          pass 1 S1 [1 S1]
owl:53          pass 1 S1 [1 S1]
owl                                      5.08     12848      10       87
Total nodes: 12848 10 87
Total time: 5.08 (4.60)
Total uncertainty: 0.00

それぞれのテストを単独でやった場合と、続けてやった場合の比較。読んだ手は余り変わらず。 owlってのは和になってる。接続の方は変化無し。owlってのの意味が決定的に重要っぽい。 調べたら戦術的な手て事らしい。最後の行に出てるのは、総不確実性、これが0.0って事は、 自信を持ってお勧め出来ますって事か。 こういうデータを取っておいて、差分を見てくんでしょうな。

pikeのソースコードを見ると、パラレルで実行出来るようになってたぞ。糞石7ぐらいは 欲しくなってくるな。

nb7$ ./eval.sh break_in.tst
10 passed
20 passed
30 passed
40 passed
50 passed
60 passed
70 passed
80 passed
90 passed
100 failed: Correct '0', got '1 D9'
110 passed
Summary: 10/11 passes. 0 unexpected passes, 0 unexpected failures

shell版との対比。やっぱりpikeが詳しい。

nb7$ ./regress.pike -v break_in
break_in:10     pass 1 F2 [1 (F2|D2)]
break_in:20     pass 0 [0]
break_in:30     pass 1 G5 [G7|G5]
break_in:40     pass G7 [G7|G5]
break_in:50     pass 1 E3 [1 (C3|E3)]
break_in:60     pass 0 [0]
break_in:70     pass 0 [0]
break_in:80     pass 0 [0]
break_in:90     pass 0 [0]
break_in:100    fail 1 D9 [0]
break_in:110    pass 0 [0]
break_in                                 6.04    502321     674     4549
Total nodes: 502321 674 4549
Total time: 6.04 (5.97)
Total uncertainty: 0.00

pikeなかなか面白そう。何か作ってみたいな。十分に周回遅れだけど、 8つの言語でテキストフィルタを書き比べた をやってみるか。shiroさんも参戦してるしな。 それとも、懲りずに、血圧測定表示にするか。

調子こいて、fedoraにも入れようとしたら、gmp.hないぞ攻撃に遭遇。全く腹立つなあと、 ぶつぶつ言いながら、dnf install gmp-develしたよ。コンパイルには少し時間がかかるので、 ソースエリア探検。toolsの中にpike.elを発見したけど、これを使うと何か特別な碁利益が 有るのでしょうか? まあ、碁縁って事で入れてみるか。

リアル世界の碁繋がりは、いろいろと御利益がありそうだな。林檎が一杯あるから取りに おいでとかね。ちょっと前だけど、渋柿あげる攻撃に実家が晒され、泣きながら90個の柿の 皮向き。そして柿暖簾を編んで、正月に備えたとか。干し柿食べ放題だな。 田舎は付き合いが濃密ですよ。

How to make go program

囲碁ソフトの作り方

囲碁プログラムの作り方

コンピュータ囲碁講座 (c) YKD