将棋ウォーズで二段になったので採用している序盤作戦について書いてみた

 先日将棋ウォーズで二段になりました。将棋を始めたきっかけは電王戦FINALなので、将棋歴は約3年ということになりますね。ちょうど区切りも良いということで、今回は二段になったタイミングで採用していた序盤作戦についてまとめてみたいと思います。

 局面図もいくらか載せてみますが、手順とかは正確ではないことをご了承ください。

居飛車

 相居飛車は基本的に横歩取り、角換わりを目指します。相手の変化によっては雁木や、その他力戦という感じになります。

1.角換わり

 角換わりは基本的に先手でも後手でも腰掛銀で4八金2九飛車の形を目指します。もちろん駒組の段階でも仕掛けを考えはしますが、大抵は図のように自陣を組んでから相手の形に応じて考えることになります。

 一番気分として楽なのは相手が5二金、8二飛車の形で4四歩と突いてくれている形(下図)で、これなら4五歩から仕掛けて良いんじゃないかなぁという感じです。形勢としては別に差はないとは思いますが、先攻できるならまぁ不満なしです。f:id:tokumini:20180208133423j:plain

 一番嫌なのは同型(下図)になることで、そうなるともう仕掛けがわからないので先手でも千日手やむなしの姿勢で、多少待機気味に玉を動かしたりして相手に隙ができるのを待つしかなくなります。しかし意外と千日手にはならないもので、こっちがバランス崩したり相手が崩したりしてなんだかんだ決着はつくものです。多分あまり僕の勝率は高くないと思います……。f:id:tokumini:20180208133724j:plain

 相手が早繰銀ならば腰掛けるのを急いで6五歩で相手の銀を追っ払う形(下図)を目指します。しかしこれ棒銀に切り替えられたりしたときにちゃんと受かるのかは自信がありません。f:id:tokumini:20180208134048j:plain

2. 横歩取り

 横歩取りは先手なら勇気流、後手なら斎藤流を目指します。といっても特に研究しているわけではないので、形とか狙い筋だけをちょっと真似している程度ですね。

 当然、勇気流は相手にやられることもあって、その時には飛車をぶつける作戦(下図)をやっています。これはプロで前例があったやつで、初出がどの対局かは知りませんが僕が記憶しているのは去年の羽生-村山戦ですね。一度だけ40手くらいこの前例をなぞりあう展開になったことがあり、その時は僕が先に手順を忘れていて負けにしたので、特に記憶に残っていますね。f:id:tokumini:20180208135832j:plain

 後手では斎藤流(下図)を目指します。斎藤流は神崎蘭子さんの将棋グリモワールを読んで知ったもので、まだちゃんと変化とかを全部覚えているわけではないんですが相手よりは多少知識はあって有利かなぁというくらいです。f:id:tokumini:20180208140038j:plain

 横歩取りの後手を持っていて気になるのはときどき8七歩と受けるのが早い(下図)人がいることですね。これは一応2四飛と回れば先手は歩で謝るしかなくて多少指しやすいと思っているんですが、まぁめちゃくちゃ有利というわけでもありませんか。f:id:tokumini:20180208135903j:plain

3.対雁木

 最近はプロの影響なのか、相手が角道を止めてくる居飛車力戦みたいな形がちょっと増えた気がします。しかしこれは叡王戦本戦の丸山-小林戦のように船囲い+早繰銀というような形にすれば互角以上の形勢で先攻できる(下図)ことが多いので特に不満はないという感じですかね。f:id:tokumini:20180208140818j:plain

 これは銀を2六と4六のどっちにあがるべきなのかなぁとかちょっと迷いますが、うーんまぁよくわかりません。

振り飛車

 対振り飛車では対抗形が苦手なので相振り飛車を目指すようにしています。特に向飛車に振って相居飛車の左右反転した局面としてとらえていきたいところです。手数の関係で相振りにしにくい先手の時だけはちょっと対抗形も指すように変えつつあるタイミングで二段になりました。

4.対四間飛車

 先手だと3手目に2六歩と突いてしまうのが相振りを目指すうえでネックとなります。特に最近は雁木が増えたこともあって、角と左銀だけ動かされると雁木か四間飛車か判別できないことが多いく、困りどころです。雁木には居飛車を、四間飛車には相振りをやりたいのですが、どちらでも対応できるようにしても下図くらいが限界なので最近は諦めて対抗形をやるようにしています。2五歩まで指してしまうと相振りにはしづらい気がしているのですが、2六歩は許容しているのに一貫性がないかもしれません。f:id:tokumini:20180208141820j:plain

 とりあえず最近の対四間飛車先手番では対抗形、急戦を目指します。穴熊はさっぱり得意ではないので急戦で頑張ります。よくやるのは下図のような形で、飛車角銀桂でなんとか攻めていきたいところですが、やっぱり自玉が薄くて大変なことが多いですね。f:id:tokumini:20180208150353j:plain

 後手だとほぼ相振りにします。これは8四歩の一手を省略できることが多いからです(下図)。しかし雁木に警戒しつつの駒組となるので、厳密には相手に上手くやられると不利な展開になる気がしています。f:id:tokumini:20180208142301j:plain

 具体的には相手に囲いよりも攻めを重視されると嫌で、下の局面は5五銀が見えてても受からないような気がします。しかし個人的な印象としてはそこまでこうやられる頻度は高くなく、四間飛車を指すような人はあまりこういうことはしない性格なのかな……? とか思います。f:id:tokumini:20180208142813j:plain

5.対三間飛車

 あまり三間飛車には当たらない気がしているんですが、結構やられて嫌な作戦ではあります。大抵は対四間飛車と同じように先手なら対抗形、後手では相振りを目指します。しかし後手で対四間飛車と同じように相振りを目指すと時々いきなり突っかけらて、そこでなんとなく7二飛車とぶつけるのが何度か経験した局面です(下図)。f:id:tokumini:20180208144010j:plain

 別に飛車交換する一手ではないと思いますが、今までのところは交換になることが多い感じですかね。こうなれば互いに飛車を持ち合っての戦いになるのでまぁ対抗形よりは好みの将棋になります。

6.対中飛車

 対中飛車でも相手の態度が早いなら相振り、そうでなかったら対抗形という感じになっています。対抗形になるのは大抵相手の後手ゴキゲン中飛車なので主に超速で対応します。対中飛車の相振りはツノ銀雁木のような形にしていきます(下図)。他のよくわからない相振りよりは隙がない感じに組めることが多く、これはこれで一局になっているという気がします。f:id:tokumini:20180208144744j:plain

7.その他振り飛車

 角交換振り飛車は対抗形にすることが多いのですが苦手な戦型ですね。

 向飛車も逆棒銀の筋をそのまま食らって負けるということを何度かやらかしている気がします。

 この辺のちょっと遭遇頻度が低い振り飛車は苦手で、対抗形の指し方、考え方が根本的に身についていないという気がします。

終わりに

 特に相居飛車ではプロが指す戦型を真似をするというのが僕の好みとなっています。対抗形はよくわからなくて変な相振りに逃げたりしていますが、三段を目指すとしたら対抗形をきちんと見つめ直す機会が必要なのだろうなぁと感じているところです。

 三段になれる気はさっぱりしないのですが、初段になったときも二段になれる気は全くしなかったなぁということを思い出すとそういうものなのかもしれません。

デレステ・イベント『Trinity Field』 感想

前置き

 アイドルマスターシンデレラガールズ・スターライトステージにおいて、イベント『Trinity Field』が開催されている。新曲やそのMVなど語るべきことはたくさんあるが、ここではコミュに焦点を当ててみたいと思う。そこに何が描かれており、そして何が描かれなかったのか。特に北条加蓮に注目し、それを解きほぐしてみたい。

コミュの総括

 『Trinity Filed』のコミュにおけるテーマとは、トライアドプリムスのメンバー同士が果たしていかなる関係にあるのか、ということであった。たびたび強調されたのは、単なる仲良しではなく「ライバル」であること、高めあう存在だということだ。そしてそれは忌憚なく意見を言い合うことで実現する——それが今回のコミュの骨子であった。三人は互いに互いの道を進みながら、目標は異なりながら切磋琢磨していく。それこそがトライアドプリムスの在り方なのだと。

 確かにそのことについて異論はない。 それは第2話で速水奏が指摘したようにある種の甘えの上に成り立つものであり、北条加蓮のイベント報酬SR・特訓後コミュで言及があったように「お伽噺のような理想の友情」の一つであることには納得できる。それの表現としてコミュを概観すれば、やはり「良い」コミュであったと感じることは間違いない。

本論

 しかし、しかしだ。やはりここには語られなかったもの、描かれなかったものが存在していると私は考える。仲間とぶつかり合いながら上を目指し、強情なまでに良いLIVEを目指す北条加蓮の、より根源的な動機に迫っていきたいのだ。

 今回のコミュにおいて、北条加蓮はより良いLIVEを、より良い結果を求めていくという姿勢において仲間と衝突したわけだが、本当に問われなければならなかったのはその奥の、根底に流れている動機だったのではないか。それはすなわち、北条加蓮が抱く焦燥感、不安感、あるいは後悔といったものである。

 幼いころ憧れたアイドルになることを実現でき、プロローグでも触れられているように「ソロ活動でも忙しい」ほど売れている彼女は、しかし幸福感の中にあるだろうか。今回のコミュで示されるような、ある種ヒステリックとも言える振る舞いは、そういった余裕からはいまだ遠く、強烈な脅迫感、焦燥感に突き動かされていることの証左であると考える。

 では、この焦燥感の正体とはなんだろうか。

 北条加蓮は第3話において忘れられた歌の話に触れた。その中では「忘れられたくない」「消えたくない」という思いが強く表現されていた。有名になること、よいLIVEをすることはその手段なのだ。決して前向きな動機ではない、むしろ何かからの逃避といった色彩がここにはある。

 北条加蓮の背景に照らしてもう一歩深くまでたどるならば、「生きた証を刻みたい」というのはつまり、死への恐怖そのものから導かれるものなのではないか。北条加蓮のストーリーコミュにおいては病院から「卒業できなかった」人らへの言及があり、幼少の頃において死が決して遠いものではなかったことが示唆されている。そのような境遇で育った彼女の中に、死の恐怖が現実的なものとして君臨していると考えることは、不自然なことではない。

 この根源に立ち返らなければならない。振る舞いとしてのストイックさ、結果を求めることは、死の恐怖が表面上で形を成したものでしかないのだ。北条加蓮の根底にはメメント・モリが響いている。

 焦燥感によって動くことに良い面があることは認めよう。ある意味北条加蓮というキャラクターはそれによって結果を出してきたのだともいえる。むしろそれこそが重要な点である。 単なる善悪の2値だけしかない問題ではないのだ。脅迫的な観念に駆られて動くことと、前向きな気持ちで努力すること、この間に広がるグラデーションの中でバランスを求めていく不安定さこそが、北条加蓮というキャラクターのテーマであり、魅力なのだと私は考える。これが私の主張したかったこと、今回のコミュで描かれなかった部分についての話である。

結び

 北条加蓮には「前科」がある。メモリアルコミュ第4話において、初LIVEの際にプロデューサーの忠告を無視して前日遅くまでレッスンに励み、結果、本番では曲が終わるとともに倒れた。根源的な不安を振り払うために、限界まで努力しなければならなかった。ある意味今回のコミュはそのリバイバルなのである。

 そこに成長はあった。結局のところ、今回のLIVEでは(おそらく)倒れることはなかっただろうし、人の忠告を無視しようとしたわけでもなく、衝突の末、妥協できないという結論に至っただけなのである。メモリアルコミュ第4話では「信じられるもの。ひとつずつ増やしていくから」と語られている。トライアドプリムスは、まさにその一つとして数えられるものであろう。

 繰り返すが、私は今回のコミュを非難したいわけではない。トライアドプリムスの関係性というテーマについて見れば、優れた問題意識からしっかりと描ききった良作であると感じている。 そもそも今回のコミュはトライアドプリムスのコミュであって、北条加蓮のコミュではないのだ。

 しかしこの文章を読んでくれたプロデューサー諸兄姉には、感じてほしいのだ。考えてほしいのだ。テーマの外側にあったものを、北条加蓮の本質を。少しでも心に残るものがあったなら、一人の北条加蓮Pとしてこれに勝る喜びはない。

あとがき

 まずはここまで読んでくださった方に感謝の念を申し上げたいと思います。随分と独りよがりな文章になってしまいました。必要なテーマは描ききられたと認めているのに、テーマ外のところで難癖付け始めるのがいいことだとは思っていません。でも書かずにはいられませんでした。

 ここから先はデレマスについてというよりも、私自身についての話になっていきます。個人的な解釈の色も強くなってきます。できれば、ここでブラウザバックしてほしい。いや、本当は読んでほしい。

 では、続けましょう。

 まず、北条加蓮の根底にはメメント・モリが響いていると思っています。これは一つの、僕の解釈です。

 この解釈がどの程度一般的なものなのかは知りません。今までほとんどデレマスの二次創作を漁ったことはないからです。今回のコミュについても、どういう評判なのかは全く調べていません。情報をシャットアウトして、とにかくこれを書いていました。

 だから僕は自分の解釈にあまり自信がないのです。各コミュのテキストから北条加蓮が死について何かしら考えを持っていることは確かだと信じていますが、このような解釈が素直に読んだときに出てくる解釈かというと、そんなことはないようにも思えます。

 何よりも問題なのが、どこからメメント・モリなんて考えが降ってきたのかっていうことであって、結局それは僕自身からなんですよね。僕が持つ死への恐怖を、北条加蓮というキャラクターに背負わせようとしているだけなんだ。テキストを冷静に読んで解釈を組み立てているわけではなくて、だからこれが的外れでなかったとしても、それはたまたま運が良かったというだけのことでしかなくて……。

 それでも、アイマス、デレマスという世界はある程度自由な解釈が許容される場だと思っていて、どうしてもこれを書き残したくなってしまった。自分というものと分かちがたく結びついてしまっているこの解釈を。誰かにはきっと響くんじゃないかと信じて。

 少し話を戻すと、今回のコミュでは第3話で神谷奈緒が発した不安が一番印象に残っています。「ある日突然、ふたりがあたしの前からいなくなるんじゃないかって」「あたしの手の届かないところにいっちゃう気もするし、どこかでふと立ち止まって、そのまま折れちゃう気もする」。僕はこれがものすごく重要な見方だと思っている。

 北条加蓮は破滅の道を行くんじゃないか。燃え尽きる形か、折れる形かはわからないけれど、神谷奈緒が発した不安はきっと正しいもので、放っておいたらそうなってしまうとしか思えない。

 だからやっぱり、僕は神谷奈緒に、渋谷凛に、北条加蓮を救ってほしいんだ。対等であるとか、互いを高めあうとかいう以前に、北条加蓮が破滅の道を進まないように引き留めてほしい。それはプロデューサー(僕)には不可能なことで、同じように死が怖いと思ってしまっている人間には不可能なことで……。

 北条加蓮に必要だったのは泣くことだったんじゃないか。二人の前で、「死ぬのが怖い」って。それですぐ解決ということにはならないと思うけど、そこをさらけ出さずに話を進めることなんてできやしないんじゃないか。

 これはもう完全な妄想で、こんなことを公式に求めても仕方がないことはわかっている。それにトライアドプリムスの話は別に今回のコミュだけが全てではないこともわかっている。後にも先にも物語はあるし、今回のコミュはその断片の一部でしかない。いろいろな可能性を探っていけば良いのだと思う。トライアドプリムスの可能性を、北条加蓮の可能性を。

 ここまで読んでくださった方がいるとしたら、本当にありがとうございます。書きたいことはすべて書きました。自分の中で上手く消化するためには、こうして書き出してみる必要があったんだと思います。それをこなせて一つ大きな区切りがついた気がしています。

 それでは、またどこかで。

AtCoder Beginner Contest 079 参加記

結果

 0WA、56:02で全完の374位だった。C,D問題でしっかり時間かかってしまうのでまだまだ実力不足だ。

A問題

 stringで受けて判定するだけ。まぁしかし2分かかった。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    cin >> s;
    if (s[1] != s[2]) {
        cout << "No" << endl;
    } else {
        if (s[0] == s[1] || s[2] == s[3]) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
}

B問題

 なんか無駄に再帰を書いて、時間がかかるのでメモ化するという遠回りをした。普通にforループで良かったじゃん……。4分くらいかかった。

#include <bits/stdc++.h>
using namespace std;

vector<long long> memo;

long long ans(int n) {
    if (n == 0) {
        return 2;
    }
    if (n == 1) {
        return 1;
    }
    if (memo[n] != -1) {
        return memo[n];
    }
    return memo[n] = ans(n - 1) + ans(n - 2);
}

int main()
{
    int N;
    cin >> N;
    memo.resize(N + 1);
    for (int i = 0; i <= N; i++) {
        memo[i] = -1;
    }
    cout << ans(N) << endl;
}

C問題

 わざわざdfsなる関数を書いて全探索しにいく。8通りくらいならif文全列挙でいいっていうの、気が付かないんだよなぁ。dfs書くのに手間取って13分くらいかかった。

#include <bits/stdc++.h>
using namespace std;
string ans;
int a[4];

void dfs(int pos, string str, int sum) {
    if (pos == 4) {
        if (sum == 7) {
            ans = str;
        }
        return;
    }
    dfs(pos + 1, str + '+', sum + a[pos]);
    dfs(pos + 1, str + '-', sum - a[pos]);
};

int main()
{
    string s;
    cin >> s;
    for (int i = 0; i < 4; i++) {
        a[i] = s[i] - '0';
    }
    dfs(1, "", a[0]);

    for (int i = 0; i < 3; ++i) {
        cout << s[i] << ans[i];
    }
    cout << s[3] << "=7" << endl;
}

D問題

 ダイクストラ法っぽくやっていくことしか頭に浮かばなくて、しかし普通とは逆向き? なのでかなり手こずる。35分以上かかってしまった。Nが小さいからワーシャルフロイドで一瞬なのになぁ。ただアルゴリズムを知っているだけで適切なタイミングで使えていない。もっと修行を積まないと。

 終わった番号を詰めていくvectorのendも使ってないので不要だろうし、ダイクストラ法っぽいものとして見たとしても出来がいいコードではない。最近まともに競技プログラミングやっていなかった分がそのまま表れているという感じ。電王トーナメントも終わったので、ちょっとは頑張っていきたい。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int H, W;
    cin >> H >> W;
    vector<vector<int> > c(10, vector<int>(10, 0)), a(H, vector<int>(W, 0));
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cin >> c[i][j];
        }
    }
    for (int h = 0; h < H; h++) {
        for (int w = 0; w < W; w++) {
            cin >> a[h][w];
        }
    }

    vector<int> min_cost(10, INT_MAX);
    vector<int> start, end;
    min_cost[1] = 0;
    for (int i = 0; i <= 9; i++) {
        if (i != 1) { 
            start.push_back(i);
        }
        min_cost[i] = c[i][1];
    }
    while (end.size() != 9) {
        int min_index = -1, min_value = INT_MAX;
        for (int i : start) {
            if (min_cost[i] < min_value) {
                min_value = min_cost[i];
                min_index = i;
            }
        }

        start.erase(find(start.begin(), start.end(), min_index));
        end.push_back(min_index);
        for (int i : start) {
            min_cost[i] = min(min_cost[i], min_cost[min_index] + c[i][min_index]);
        }
    }

    long long ans = 0;
    for (int h = 0; h < H; h++) {
        for (int w = 0; w < W; w++) {
            if (a[h][w] == -1) {
                continue;
            }
            ans += min_cost[a[h][w]];
        }
    }
    cout << ans << endl;
}