目指せ、第27回世界コンピュータ将棋選手権☆ ポナンザ・チェイナーを倒そうぜ☆(^~^)<その3>

2017-04-20 21:56

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「これ、現状な☆」

/// 指し手。
    /// イコールで一致を調べたいから、一意にする必要があるぜ☆(スコアなどを覚えさせてはいけない)
    /// 
    /// ビット演算ができるのは 32bit int型。
    /// 
    /// 4         3         2         1Byte
    /// 0000 0000 0000 0000 0000 0000 0000 0000
    ///                                      -A
    ///                                    -B
    ///                                 -C
    ///                               -D
    ///                            -E 
    ///                           F
    /// G
    /// 
    /// A: 自筋(2 bit) A~C筋を、0~2 に変換して格納しておくぜ☆(^▽^)
    /// B: 自段(2 bit) 1~4筋を、0~3 に変換して格納しておくぜ☆(^▽^)
    /// C: 至筋(2 bit)
    /// D: 至段(2 bit)
    /// E: 打った駒の種類(3種+1)(3 bit)
    ///     0000 なし
    ///     0001 ぞう
    ///     0010 きりん
    ///     0011 ひよこ
    /// F: 成らない/成る(0~1)   (1 bit)
    /// G: +-符号(0~1)(1 bit)
    /// 
    /// 0 なら投了だぜ☆(^▽^)
    /// 
    /// 例:sasite 89 の場合
    /// 2進数で 1011001。分けると F(0) E(0) D(1) C(01) B(10) A(01) なので、B3B2
    /// 例:sasite 912 の場合
    /// 2進数で 1110010000。分けると F(0) E(11) D(10) C(01) B(00) A(00) なので、H*B3
    ///

KIFUWARABE_80x100x8_01_Futu

「9升の将棋盤に拡張しようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「今2bit なのに、5bit も使うのかだぜ☆?

自筋自段至筋至段 で 8bit から 20 bit に増えるぜ☆?」

OKAZAKI_Yumemi_80x80x8_01_Damaru

「自升至升ならどうなの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「81マスなら 8bit なんで 16bit に収まるな☆」

KIFUWARABE_80x100x8_01_Futu

「筋、段と分けて覚えておくメリットは何だぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「ビットシフトとマスクだけで取り出せる☆」

KIFUWARABE_80x100x8_01_Futu

「だから データ構造が 筋と段を分けているのは何でだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「2変数あれば 平面のあらゆる座標を指定できるじゃないかだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu

「たかだか 81升 なのよね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「……………………☆」

KIFUWARABE_80x100x8_01_Futu

「決まりだな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_04_Aozame

「大改造だぜ☆!」

OKAZAKI_Yumemi_80x80x8_01_Damaru

「4bit 縮まるわよ?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「じゃあ 改造な☆ お前ら覚えてろよ☆」


2017-04-21 01:11

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「まず、Sasite ビットフィールドへのセット/ゲットを

Conv_Sasite アブストラクトクラスのメソッドで ラッピングしたぜ☆」

KIFUWARABE_80x100x8_01_Futu

「日本語でOk☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「住んでいる家を工事されると 住めなくなるんで、

これから工事するところに 透明のケースを被せたぜ☆

しばらく 透明のケースを触ってくれだぜ☆」

    /// 指し手。
    /// イコールで一致を調べたいから、一意にする必要があるぜ☆(スコアなどを覚えさせてはいけない)
    /// 
    /// ビット演算ができるのは 32bit int型。
    /// 
    /// 4         3         2         1Byte
    /// 0000 0000 0000 0000 0000 0000 0000 0000
    ///                               ---- ---A
    ///                     ---- ---B
    ///                  -C
    ///                 D
    /// E
    /// 
    /// A: 自升(8 bit) 0~127。本将棋にも対応できるだろう☆(^▽^)
    /// B: 至升(8 bit) 0~127。本将棋にも対応できるだろう☆(^▽^)
    /// C: 打った駒の種類(3種+1)(3 bit)
    ///     0000 なし
    ///     0001 ぞう
    ///     0010 きりん
    ///     0011 ひよこ
    /// D: 成らない/成る(0~1)   (1 bit)
    /// E: +-符号(0~1)(1 bit)
    /// 
    /// 0 なら投了だぜ☆(^▽^)自升と至升と打った駒の種類が0に揃うことはないんで、被らないぜ☆(^~^)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「これ、差し替え案☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu

「まだまだ ビット 余りまくってるじゃないのよ。

やっちゃいましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「ビットマスクなんか Enum型にしている意味がないよな☆

Enum 型じゃなくて、Const にしよ☆」


02:06

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「定跡ファイルが、同じキーを含んでいる、とエラーを出すようになったぜ☆」

OKAZAKI_Yumemi_80x80x8_01_Damaru

「調べましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「あれっ☆? きりんが ヨコに進めないんだけど☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu

「調べましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「表示がおかしかった だけのようなので、表示系統を全部 書き換えたぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「筋と 段を どこで使っているかというと

端っこか、そうじゃないか、の判定で使っているんだが、

これも ビットボードに置き換えないと 筋と 段から おさらば できないぜ☆」

OKAZAKI_Yumemi_80x80x8_01_Damaru

「ビットボードに置き換えましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「あっ、左ビットシフトと、右ビットシフトを逆にしているところがあったので

直しておいたぜ☆」

OKAZAKI_Yumemi_80x80x8_03_Zzz

「Zzz」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「成れる升が1段目なんだが、本将棋って3段目だよな☆

まあいいか……☆」


04:53

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「ビットフィールド対応☆

これで 8×8 の将棋盤に対応できるのかどうか……☆」

\ むくり /

KIFUWARABE_80x100x8_01_Futu

「中途半端なサイズの盤だな☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「あっ、横幅を伸ばしたら リミットチェックのアサートに 引っかかったぜ☆」

kifuwarabe_80x100x8_09_umm

「まだまだだな☆ でけたら起こせだぜ……☆ Zzz」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「あれ? C# の int って 32 ビットなのかだぜ☆?

64 ビットかと思っていたぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「じゃあ ulong 型を使ってみよう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「NTZ は符号付きか☆ じゃあ long で。

あっ、== 0 が全滅だぜ☆ == 0L はめんどうなので、

IsEmpty( ) でラッピングしよう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「64ビットlong型には符号があるので、実際使えるのは63ビット☆

8×8盤は無理かだぜ☆ じゃあ、8×7盤で☆」


2017-04-21 06:10

    public enum Masu : uint
    {
    }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「これ、long 型にできるのかな……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「uint を long に置き換える作業がめんどい……☆

あっ、自殺手判定のビット演算間違えていたぜ☆」

                        return (Masu)((int)ms + Option_Application.Optionlist.BanYokoHaba + 1);

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「(int)みたいな型キャスト、全部 (long)に書き直しだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「あれっ☆? Masu は int でいいんじゃないか☆?」


07:25

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「なんか わたしの C#、long でも 32ビット みたいだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu

「64 ビットにできないの?」

# デバッグ
# (1L<<31)=[2147483648]
# (1L<<32)=[4294967296]
# (1L<<33)=[8589934592]
# (1L<<62)=[4611686018427387904]
# (1L<<63)=[-9223372036854775808]
# (1L<<64)=[1]
# (1L<<65)=[2]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「62ビットまで 使えてるのか……☆

どこかで 32ビットに縮めてんだろな☆」


07:54

        public bool IsIntersect(Masu ms)
        {
            return 0 != (Value & (1 << (int)ms));
        }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「これ、long 型じゃなくて int 型に切れてね☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「ただしくは こうだろ☆」

        public bool IsIntersect(Masu ms)
        {
            return 0 != (Value & ((long)1 << (int)ms));
            //return 0 != (Value & (1 << (int)ms));
        }

OKAZAKI_Yumemi_80x80x8_01_Damaru

「よく見つけたわね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「デバッグアウト連打で☆」

fen krz1h2H/1Z1K4/3R4/8/8/8/8/8 - 2

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「今度はこれが パース・エラーだぜ☆」

            Itiran_TextParser.KyokumenPattern = new Regex(
                @"fen " +
                // 123~はスペース数
                @"([123456789RZKHNrzkhn]+)" +//1段目
                @"/" +
                @"([123456789RZKHNrzkhn]+)" +//2段目
                @"/" +
                @"([123456789RZKHNrzkhn]+)" +//3段目
                @"/" +
                @"([123456789RZKHNrzkhn]+)" +//4段目
                @" " +
                // 持駒
                @"\-?" +//なし
                @"(\d*Z)?" +//▲ぞう ※持ち駒が1個だけの場合は、数字が省略されます。
                @"(\d*K)?" +//▲きりん
                @"(\d*H)?" +//▲ひよこ
                @"(\d*z)?" +//△ぞう
                @"(\d*k)?" +//△きりん
                @"(\d*h)?" +//△ひよこ
                @" " +
                @"(1|2)" +//手番
                @""
#if !UNITY
                , RegexOptions.Compiled
#endif
            );

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「段を可変にするのは マッチングのグループ番号がずれて タイヘンだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu

「じゃあ、今日はここまでだぜ☆」

KIFUWARABE_80x100x8_01_Futu

「おつだぜ☆」

OKAZAKI_Yumemi_80x80x8_01_Damaru

「おつね」

はてなブックマーク - 目指せ、第27回世界コンピュータ将棋選手権☆ ポナンザ・チェイナーを倒そうぜ☆(^~^)<その3>
[`yahoo` not found]
[`yahoo_buzz` not found]
このエントリーを Google ブックマーク に追加
Digg にシェア
Facebook にシェア
reddit にシェア
LinkedIn にシェア
[`evernote` not found]
StumbleUpon にシェア
GREE にシェア
email this
LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です