読者です 読者をやめる 読者になる 読者になる

集中力なら売り切れたよ

プログラミングや、将棋などについて書きます。

囲碁と将棋を趣味にする理由

なんで今さら囲碁・将棋をやるのか。子供の頃から始めたなら、自然に強くなって楽しいかもしれないが、大人になってから始めてどうするのか、といった疑問もあると思います。

個人的な考えですが、無料のネットゲーム(ネトゲ、オンラインゲーム)は数え切れないほどありますが、サービスが終わったら積み上げたアイテムや成長したキャラクターもなかったことになってしまいます。思い出は残るかもしれませんが、むなしい気がします。

囲碁・将棋は、何世紀も前から続いている伝統的なゲームであるために、今後も何世紀も残り続ける可能性が高いです。また、自分で対戦しないでも、プロの対局やアマチュア高段者のネット対局を観戦しながら、その人の手を参考にしたり、自分で手を考えたりするだけでも楽しいと思います。

手筋や詰将棋(詰碁)、定跡(定石)の本などを買いだすと結構な値段かかってしまいますが、まあそれでもスマートフォン向けゲームのガチャ課金で使うよりは、手元に形として残るので納得できると思っています。

もちろん楽しんでゲームをやって納得してガチャに課金している人を批判したいわけではありません。楽しみ方は人それぞれです。ただ、囲碁・将棋を古臭いからやらないとか、大人になってから入門しても全然勝てなくて楽しくないとやめてしまう人が多いと思いますが、辛抱して続けてみると楽しくなるかもしれませんね。

最近買った書籍

東大教養囲碁講座―ゼロからわかりやすく (光文社新書)

東大教養囲碁講座―ゼロからわかりやすく (光文社新書)

初段になるための将棋勉強法

初段になるための将棋勉強法

寄せの手筋200 (最強将棋レクチャーブックス)

寄せの手筋200 (最強将棋レクチャーブックス)

将棋ソフト「激指」最新版がしばらく出ていない理由

マイナビから有料将棋ソフトが「激指14」(2015年11月27日発売)を最後に出ていないのは、「将棋新世紀PonaX」(2014年5月30日発売)がバグだらけで回収に終わった失敗もあるでしょうが、私が思うにフリーソフトの「将棋所」や「ShogiGUI」が便利すぎて、商品として売れないからだと思われます。

「Apery」や「技巧」などのオープンソースの思考エンジンと組み合わせて使うだけで、局面の検討に関してはトッププロを超える読みが行えます。激指シリーズはそれでも、女流棋士の読み上げとかいろいろな付加価値はついていますが、ほとんどのアマチュアにとって必要なのは検討機能でしょう。

しかし、それに関しては現在はフリーソフトが名人級に強くなってしまいなんとでもなっちゃいます。また、最近2017年3月には詰将棋を解くエンジン「脊尾詰(せおづめ)」もフリーで公開されており、もはや有料ソフトの魅力ってなんぞや?というレベルに来てしまっています。

売れない商品

C#の匿名メソッドとラムダ式の使い方を勉強しました

以下のような判定処理を委譲するカウントメソッドを定義する。

static int Count(int[] numbers, Predicate<int> judge)
{
    int count = 0;
    foreach (int n in numbers) {
        if (judge(n)) {
            count++;
        }
    }
    return count;
}

C#2.0で追加された匿名メソッド、C#3.0で追加されたラムダ式を渡して実行する。

static void Main(string[] args)
{
    int[] numbers = System.Linq.Enumerable.Range(1, 40).ToArray();

    // 匿名メソッド(C# 2.0)
    // 後述するラムダ式のほうが簡潔に書けるので、
    // 互換性のためだけに残されている機能
    int count = Count(numbers, delegate(int n) { return n % 2 == 0; });
    Console.WriteLine(count); // => 20

    // ラムダ式(C# 3.0)を省略なしで書く
    count = Count(numbers, (int n) => { return n % 3 == 0; });
    Console.WriteLine(count); // => 13

    // ラムダ式の型と括弧とreturnは一つなら省略可能
    count = Count(numbers, n => n % 4 == 0);
    Console.WriteLine(count); // => 10
}

Rubyでyieldで処理を委譲したり、メソッドにブロックを渡す感覚とほぼ同じだとわかりました。

0から15までの数値を16進数、2進数で表示するプログラム

Rubyで書くと標準のprintfの指定方法に2進数が備わっているので簡単です。

(0..15).each do |i|
  printf("0x%02x = %04b\n", i, i)
end

C#ではConsole.WriteLineの書式では16進数は可能ですが、2進数には変換できないのでConvertクラスを利用して一旦変換してから呼び出します。

using System;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 16; i++) {
            string b = Convert.ToString(i, 2);
            int n = Convert.ToInt32(b);
            Console.WriteLine("0x{0:x2} = {1:D4}", i, n);
        }
    }
}

出力結果

基本情報技術者試験などでは基数変換問題で16進数から2進数に変換する問題は頻出なので0から15は丸暗記するくらいでもいいと思います。

0x00 = 0000
0x01 = 0001
0x02 = 0010
0x03 = 0011
0x04 = 0100
0x05 = 0101
0x06 = 0110
0x07 = 0111
0x08 = 1000
0x09 = 1001
0x0a = 1010
0x0b = 1011
0x0c = 1100
0x0d = 1101
0x0e = 1110
0x0f = 1111

C言語で数値のべき乗を求めるにはpow関数を使う

標準ライブラリのpow関数を使うとべき乗を求めることができます。

#include <stdio.h>
#include <math.h>

int main(int argc, char* argv[])
{
    for (double i = 0; i < 32; i++) {
        printf("2 ** %d = %d\n", (int) i, (int) pow(2.0, i));
    }
    return 0;
}

しかしコンパイルして実行してみるとわかりますが2 ** 31で桁あふれしてしまいます。

C言語は難しいですね。

実行結果

2 ** 0 = 1
2 ** 1 = 2
2 ** 2 = 4
2 ** 3 = 8
2 ** 4 = 16
2 ** 5 = 32
2 ** 6 = 64
2 ** 7 = 128
2 ** 8 = 256
2 ** 9 = 512
2 ** 10 = 1024
2 ** 11 = 2048
2 ** 12 = 4096
2 ** 13 = 8192
2 ** 14 = 16384
2 ** 15 = 32768
2 ** 16 = 65536
2 ** 17 = 131072
2 ** 18 = 262144
2 ** 19 = 524288
2 ** 20 = 1048576
2 ** 21 = 2097152
2 ** 22 = 4194304
2 ** 23 = 8388608
2 ** 24 = 16777216
2 ** 25 = 33554432
2 ** 26 = 67108864
2 ** 27 = 134217728
2 ** 28 = 268435456
2 ** 29 = 536870912
2 ** 30 = 1073741824
2 ** 31 = -2147483648