「 しかし、わたしの研究フォルダには、石に向きがある という発想のものは無かったぜ☆」
「 ゲーム屋から見たリクツとしては……☆
と、絵を示すにも Windows Paint しか持ってないんだが☆」
「 何その プログラマーが作ったみたいな インターフェースは……☆」
「 ↑ こういう風に モチ がくっつくのは どうやって作るかと言うと……☆」
「 ↑ 体色レイヤーで上から塗ってしまえば うまくいく☆
境界線が微妙……、なとことか 意識するような 作りにしてはいけない☆ 突き抜けて 上から塗りつぶせだぜ☆」
「 ↑ 接合部を がんばっていてはいけない☆ ちょっと細めるぐらいでいい☆」
「 ↑ これで 境界線レイヤー を重ねて、その上に 体色レイヤーを重ねれば うまくいく☆」
「 ↑ 絵描きには絵描きの理屈のやり方が、ゲーム屋にはゲーム屋の理屈のやり方がある☆
わたしたちは 美術展に入賞したいわけじゃないんだぜ☆」
「 やるなら STEAM だな☆ で、グラデだが……☆
くそ、この餅 真っ白にしてしまった☆ これ以上 ハイライトできないぜ☆」
「 わたしは見た☆ お父んが アルファ・チャンネルをいじって 諦めたのを☆」
「 ↑ 例えば、ふつうに ハイライト を接合しようとすると、細かな調整がいるわけだぜ☆
これは、体色に比べ、突き出して 目立つから ダメなわけだぜ☆」
「 ↑ じゃあ、ハイライトは端まで伸ばさず、 真ん中のちょびっとにしようぜ☆」
「 ↑ 重ね合わせると うまいこと いくな☆
このように タイル全てを 境界線レイヤー、体色レイヤー、ハイライト・レイヤーに分けるんだぜ☆」
「 ↑ 接合部を気にしつつ、こういうのは ざくっと合わせて あとで調整だぜ☆」
「 ↑ 前に CAD のソフトをインストールしたあとに 5分もかからず 投げたからな☆」
「 ゲーム・グラフィック、 シナリオ、 レベル・デザイン は 接合部をぼやかすのが コツ だぜ☆」
「 グリッド引けないのかだぜ、 GIMP で ピーっと☆?」
「 ↑ こういうのは 大きく描いて、あとで 縮小するのが いいんだぜ☆」
「 8方向について ON/OFF があるから、2の8乗じゃないか☆?」
「 ↑ if文も置いておこう☆ 最大8回判定するのがいやな奴は
PEXTビットボード という超速のテクニックを使えだぜ☆」
「 あれっ、というか if文使わなくても 16進の足し算でいけないか これ…… 眠……☆(^q^)Zzzz」
「 真ん中の石から見て、8方向に16進数 が降ってあるとしろだぜ☆
そこに石があれば その数を足せだぜ☆」
「 そんな説明聞いても分からん人が とろろ碁 で遊びたいのに……☆」
「 足せば 画像番号が出てくる☆ デターミニスティックだぜ☆」
「 ↑ しかし それでは ありえない組み合わせが可能になるぜ☆ イリーガル☆」
「 ぐぬぬぬぬ! イリーガル番号には うそ画像でもパディングしておけば 対処はできるが 情報技術の最先端マンが そんなことはやりたくないぜ☆!」
「 ↑ なんだこの 0除算 みたいな 計算不可能な二項演算の項の組みは☆ どういう群なんだぜ☆?」
「 ダメよ ダメよ ダメよ ダメよ 囲碁に戻ってくるのよ!」
「 統計は 数学ではないのですか? と質問してくる人のために 真実の数を見せる良い機会だぜ☆!」
「 何も見えてこなくていいのよ! とろろ碁 を作りましょうよ!」
「 2倍、2倍、になっている宇宙が視えるだろ☆
02 のパターンだけ 0,8 だけでなく 2週目の宇宙に入って 仮想の 16, 24 まで視えてしまうのはお得だぜ☆
だから 緑色の長方形は 本当は 長方形ではなく……☆」
「 じゃあ Java Script で仮実装してみるかだぜ☆」
https://github.com/muzudho/tororo-go-js
「 ↑ Java Script でリポジトリ立てるの初めてなんだが☆」
「 左にふつうの 13路盤、 右に とろろ盤 を置いてくれだぜ☆」
「 HTMLという文書構造で 横に26路 というのは 慣習の範囲外だぜ☆」
「 盤面を GNUGo みたいに表記して、これを Pythonスクリプトを使って HTML に変換しようぜ☆」
board = """\
.x...o......./
ooxxxxoo...../
.oox..x..o.../
o.oox..x...../
oooox....o.../
xxxx..x.o..../
............./
.......x.o.o./
.x........ox./
ox.x...x.oxx./
.ox....xooxxo/
oox....xxxoo./
.o.........../
"""
# print(board)
for stone in board:
if stone == '.':
print('<img src="img/s.png">', end='')
elif stone == "x":
print('<img src="img/b.png">', end='')
elif stone == "o":
print('<img src="img/w.png">', end='')
elif stone == "/":
print('<br>')
elif stone == "\n":
pass
else:
print(f"[{stone}]?", end='')
「 ↑ 基本的な考え方はこれで、細かいところは拡張していけばいいだろ☆」
「 ↑ 13路盤を横に並べると こんなに でかくなるんだが……☆」
「 とろろ盤 は 4分の1サイズのコーナーを 被せることになるが、できるのかだぜ☆?」
「 position 属性を使って水平移動させて、 z-order 属性で前景にするだけだぜ☆」
「 並んでいるメニューを左から右へ、上から下へ、全部開けて 置いてあるボタンは全部押しなさい」
「 コーナー・パーツは 小さく まとめられるんじゃないかだぜ☆?」
「 仮組に本気を出してどうすんだぜ☆ きつきつに合わせてはいけないんだぜ☆
これで問題なければ このまま本番で使っちゃう、ぐらい気楽にやるのがいいんだぜ☆」
「 ゲームなら クロップして コピーすりゃいいんだが、HTMLだと どうすんだぜ……☆?」
「 フレームに ばらして 画像出力する機能がないか調べましょう!」
「 ↑ まず、ふつうに画像を置くと 全部表示されてしまうわけだぜ☆
これを トリミングできるだって☆?」
<img src="img/white-stone.png"
style="object-fit: none; object-position:-40px 0px; width:40px; height:40px;">
「 ↑ へぇ……☆ これで いけるなら使うが、
画像メモリを食い尽くしたりしないだろうか☆?」
「 ↑ ここで 行き詰った……、コーナーにカバーを置きたいんだが、
カバーがあるところだけ 置く というのは 座標指定の鬼 にならないといけないようだぜ☆」
「 ひとまず 5重のとろろ盤 の一番の下の段の 変換器を書くかだぜ☆」
「 はーん☆ お父ん、 board配列の要素に /
や、改行が入っているぜ☆」
「 餅が くっつくときって、 コーナーにカバーをかけるのではなく、1枚の正方形を被せればよくない?」
「 GIMP で選択範囲の中だけを180°回転させるのって どうやるんだぜ☆?」
「 アイコン押しまくったら出てきたが、ウィンドウ ・メニューにまとめてほしい☆
なんで こんな予想しないところに 予想しない欄が出てくるんだぜ☆!?」
「 4つのコーナーを集めた方が 絵も描きやすいだろう……☆」
「 もし、正方形しかないのだったら、角は4つ調べなくても、右下の角1つを調べるだけでいいんだぜ☆」
「 トの字型のつながりもあるだろ☆ お父んのやり方だと うまくいかないぜ☆」
「 右下と、その右隣のやつの左下の2つを見たらいいんじゃないか☆?
餅の穴が正方形になるのなら、2点チェックすれば☆」
「 じゃあ 今日の関心ごとだぜ☆
13×13 のテーブルが、 12x12 のテーブルに圧縮されるリクツだぜ☆」
「 コンボリューション・ニューラル・ネットワーク (CNN; convolutional neural network) のようだ……☆」
「 口から 答えを漏らすなだぜ☆
数学では バスに何人乗ってきて、バスから何人出て行ったら、バスに残っているのは何人、みたいな 状況を 畳み込み(Convolution)と呼ばれる☆
例をお見せしよう☆」
「 ↑ コーナーの分布をプロットすると 上図右のようになることは ご理解いただけるだろうか☆?」
「 例を見せるのはいいけど、このブログを読んでいる人は とろろ碁 ができたかどうか にしか関心が無いのよ?」
「 ↑ このように バスに乗ったり 降りたりして バスの乗車人数を数えろだぜ☆」
「 なんで みんな 1区間で降りるんだぜ☆? 稲刈り機みたいなバスだな……☆」
「 ↑ 全部計算すると こうなるが、この数が どのような意味を持つか 考えてみろだぜ☆」
「 Windows Paint なんか触ってるから 2時間ぐらいで作れそうなアルゴリズムに 24時間も かかるんじゃない?」
「 ↑ 例えば、コンボリュート1回するだけで、散歩ルートを考えた、ぐらいの意味と取ることもできるな☆
数の常として、どのような意味にも取れる☆
イメージというのは、腹が減っているときに パンが食べたいか、ラーメンが食べたいかぐらいの違いだぜ☆」
「 さすが ディープ・ラーニングの隠れ層を目視しようとしたお父んだぜ☆ 要らない注釈が付いてくる☆」
「 この記事の続きを読みたいボタンをクリックした300人は 本当は続きが読みたい300人なのではなくて、 できたら起こしてほしい300人なんだぜ☆」
「 ↑ コーナー数 はどうやって求めるんだぜ☆? もちろん数学的な解決を与えてくれるんだろ、if文連打で 16秒で終わらせるのではなく☆」
「 ↑ ゴットフリート・ライプニッツ(1646/7/1 ~ 1716/11/14)なら このように考えるだろう☆」
「 視えたっ☆! こんなところにも コンボリューションがあるとは……☆」
「 コーディングするの めんどくさいんで、 if文 16回連打 しようぜ☆?」
「 まあ、50回を超えると if文連打したくなくなるが、16回ぐらいならいいだろ……☆」
def corner_number_table():
def corners_number(num):
s = f'{num:04b}'
print(f'bit {num} : {s}')
sum = 0
for i in range(len(s)-1):
if s[i] == '1' and s[i+1] == '1':
sum += 1
if s[len(s)-1] == '1' and s[0] == '1':
sum += 1
return sum
table = []
for num in range(16):
table.append(corners_number(num))
return table
print(corner_number_table())
output:
bit 0 : 0000
bit 1 : 0001
bit 2 : 0010
bit 3 : 0011
bit 4 : 0100
bit 5 : 0101
bit 6 : 0110
bit 7 : 0111
bit 8 : 1000
bit 9 : 1001
bit 10 : 1010
bit 11 : 1011
bit 12 : 1100
bit 13 : 1101
bit 14 : 1110
bit 15 : 1111
[0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 0, 2, 1, 2, 2, 4]
「 会社でこんなん書くと、引継ぎマニュアルを書くのがむずかしいやつだぜ☆
if文連打の方がありがたがられるだろ☆」
「 あれっ、タイルの総コーナー数を求めたって嬉しくないぜ☆
左下にコーナーがあるか、とかを調べたいんだぜ☆」
「 えっ☆? なんて☆? 何か言ったか☆? もっと大きな声で言えよ☆」
「 まず 石テーブルを、 黒石チャンネル と 白石チャンネル に分けるかだぜ☆」
「 黒石チャンネル から 餅成分 を取り出すと……☆ なんか 飛び餅 が消えてるぜ☆ なんでだぜ☆?」
「 餅が None であることと、餅の周りに仲間が None であることを見分けられないかだぜ☆?」
「 ↑ 周囲8近傍に仲間がいるのに 消えてるやつがいるぜ☆」
「 ↑ 石の位置情報と、餅成分は 2つ一緒に使わないといけないな☆」
0x8
「 ↑ 0x08
としたかったところを、 0x8
と書いていたぜ☆」
「 ↑ 向かい合った石の数にしても、数が合わん……☆
特に baroque diagonal のとき1つ足らん☆」
「 右下チャンネルがあれば、左上チャンネルは要らなくないか☆?」
「 ↑ Pythonの演算結合か……☆ 直して記憶から忘却しろだぜ☆」
「 ↑ 切れにくいと言っているヒモは マンハッタン距離2 だぜ☆
切れやすいと言っているヒモは マンハッタン距離3、チェビシェフ距離2 だぜ☆」
「 わたしは思う☆ このルールを実直にすべてやると 網だらけになる☆」
「 サンプル画像見ると、このヒモが付くべきところに、付いていない箇所があるぜ☆
このヒューリスティックな省略がツイッターで ウケ てるんだろ☆」
「 黒石だけ見ても、上図の赤線のケイマは 省かれているぜ☆
この線が なぜ省かれたか 全て説明できれば アルゴリズムの確立に前進するぜ☆」
「 まず1つ目、ループバックはしない☆ つまり 自分とはつながらない☆
だが何より重要なのは こいつらは テリトリーの境界線の役割をしているということだぜ☆」
「 この形の ボーダーを引くアルゴリズムは 簡単だな……☆」
「 ↑ インターセクションを見て、Z字のテトリスブロックみたいに 2つ飛んでるパターンのところがケイマだぜ☆
どちらにしろ 2マス重なったところは壁と見ていい☆ その内側がテリトリーだぜ☆
そこらへんの接続部は あやふやに 薄めるのがテクニックだぜ☆」
「 むずかしいのは どこを引くか ではなくて、どこを省くか なんだぜ☆」
「 どうすることもできないのよ! しろうとが集まって 雰囲気で さわいでいるだけなんだから!
パソコンの中に おっちゃんを入れて 省かせましょう!」
「 その おっちゃんが、ユーザーの感情にあった ヒューリスティック・プランニング をしてくれるだろうか☆?」
「 ディープ・ラーニングの使いどころだが、おっちゃんが選んだケイマの紐 厳選10万局面 みたいな教師データがないと
むずかしいよな☆」
「 ルネ・デカルト(1596/3/31 - 1650/2/11) 問題は それを解くのに適切かつ必要なところまで分割しなさい☆」
「 寺田寅彦(1878/11/28 - 1935/12/31) 全体が実物っぽく見えるためには、部分を実物とちょっと違うように描かなければならない☆」
「 プラトン(BC 428? - BC 348?) イデア(内面) エイドス(外観) モルフォ(形) パラデグマ(パターン) ジェノス(属性) ロゴス(本質) エイキン(想像力)☆」
「 1736年頃 レオンハルト・オイラーに一人の者が尋ねた☆ ケーニヒスベルクのブレゲル河にかかっている
7つの橋を1つずつ通る散歩のルートはあるか☆?」
「 そのあと戦争で爆破されたり 付け替えられたりして 今はその橋、2本しか残ってないらしいぜ☆」
「 テリトリーを先に求めて、その上にあるケイマの紐は 省いた方が早くない?」
「 囲碁の死活を計算した地ではなくて、単に囲まれたスペースを求めるだけなら
コンパスと定規だけでできる中学生ぐらいの問題だぜ☆」
「 わたしは 囲碁ウォーズ36級なんで、適当に石を置くぜ☆」
「 多分、テリトリーは 自分で算出せずに GNUGo に算出させた方がいいと思うんだぜ☆」
「 簡易計算したいなら、レイ (Ray) を飛ばす という方法があるぜ☆
空きマスから見て 上下左右の石の色が揃っていれば、その色のテリトリーだぜ☆
黒白どちらも見えれば ダメ と判定すればいい☆」
「 すると だいぶ 人が思っている感覚から外れてしまうが、それが近似というものだぜ☆
近似であるならば、精度を上げていけだぜ☆ 例えば ナナメにもレイを飛ばせだぜ☆」
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!