0824

将棋

観戦

 藤井-豊島戦は千日手。▲2五歩を保留して▲5八金、▲4五歩と位を取っていく指し方は△6五歩▲同歩△同銀と仕掛けていって後手千日手以上と考えられるわけかな。僕は6二金、8一飛型しか指さないので、相手がこうやってきたらこの仕掛けから7五銀やってみよう。まぁ普通に同銀とされてもアマチュアレベルなら1局という感じはするけどね。

 指し直し局は豊島八段が強さを見せて藤井四段を寄せ付けずに勝ったという印象。先手を見て銀交換からぶち込んでいけば手になるのかぁと思ったらやっぱりそうでもないみたいな。角換わり新形の(ほぼ)同形は難しいな。

将棋ソフト

 並列化するためにまずは簡単なサンプルを書いてみた。いくつか書き方が変な点とかはある気がするけど、一応これでちゃんと動くことには動くので海底の方にも実装してみるか。

#include<iostream>
#include<thread>
#include<vector>
#include<atomic>
#include<string>
#include<mutex>

struct SharedDate {
    long long value;
    std::mutex m;
};

SharedDate sd;

std::atomic<bool> stop_signal;

class Thread {
private:
    bool is_working_;
    std::thread thread_;
public:
    unsigned int id;

    void work() {
        while (!stop_signal) {
            std::lock_guard<std::mutex> lock(sd.m);
            sd.value++;
            if (sd.value % 1000000 == 0) {
                std::cout << sd.value << "を踏んだのは" << id << std::endl;
            }
        }
        is_working_ = false;
    }

    void startWork() {
        //trueにするタイミングはここか、work()の先頭か、どっちがいいんだろう
        is_working_ = true;

        //下のように書きたいのにエラー
        //thread_ = std::thread(work);

        //わざわざラムダ式作って関数呼んでるの絶対変な気がするんだけど
        thread_ = std::thread([this]() {
            this->work();
        });        
    }

    void finishWork() {
        thread_.join();
    }

    bool isWorking() {
        return is_working_;
    }
};

int main() {
    unsigned int max_thread_num = std::thread::hardware_concurrency();
    std::cout << "max_thread_num = " << max_thread_num << std::endl;
    std::cout << "before value = " << sd.value << std::endl;

    std::vector<Thread> threads(max_thread_num);

    //threadにidを振っていく
    for (unsigned int i = 0; i < max_thread_num; i++) {
        threads[i].id = i;
    }

    //USIのコマンド処理部を意識した作り
    std::string command;
    while (std::cin >> command) {
        if (command == "go") {
            std::cout << "start go" << std::endl;
            stop_signal = false;
            for (auto& t : threads) {
                t.startWork();
            }
        } else if (command == "stop") {
            stop_signal = true;
            for (auto& t : threads) {
                //終了の待ち方はこんなんでいいのかな
                t.finishWork();
            }
            break;
        } else {
            std::cout << "invalid input" << std::endl;
        }
    }

    std::cout << "after value = " << sd.value << std::endl;
}

競技プログラミング

 ABC001のD問題を解いた。時間を表す構造体を定義して比較演算子オーバーロードしてソートして、っていう方針でAC。解説見ると座標圧縮とかいもす法とか、やり方はいろいろあるもんだなぁ。そしてこの頃のAtCoderは入力例にCopyボタンがなくてちょっと不便。

その他

カープ

 性懲りもなくカープの話もしていきます。冷静に考えると中継ぎに負担がかかっているのもエースのジョンソンが離脱していたという影響が大きかったんだろう。エースと4番が離脱している中での戦いと認識すると途端に厳しい印象がしてくる。

 CSや日本シリーズで負けるのは、まぁ悲しいところもあるけど、短期決戦はしょうがないと思えるところもある。やっぱり僕はペナントレースで首位になるというのが素敵なことだと感じていて、主力の怪我とか好不調の波がありながら1年通して一番上にいることにはきっと重大な価値がある。気を落ち着けて一つ一つ冷静にやっていくしかないですね。

デレステ

 今やってるイベントのコミュを渋々観始めた。別に下げて上げるとかそういう話の作りが気になるわけじゃなくて、その描写がよくわからないというのが大きな問題なんだと思っている。そしてそれはほとんどセリフと独白でしか構成できないとか、尺が足りなすぎるとかいうコミュの表現形式の限界だという気がするので、どうしようもないんかなぁ。良い話には臭みがあるというが、その臭みを取り払うために必要なあらゆる演出が不可能になっている。

 二宮飛鳥さん、本質的にニヒリストであるのかニヒリスト気取りであるのかっていうところでキャラクター性が大きく違うと思うんだけど、その辺をどうなのかが今一つ掴みきれていない。

 ふとルームを覗いたら前川みくさんが「ホンマに?」とか言ってて大阪人アピールしてきやがった。そういうところだぞ。