NHK杯、豊島・畠山鎮

先手は豊島。最近、実力が高いレベルで安定してきた感がある。
後手は畠山。攻め将棋だが、インタビューでは闘争心という言葉を出していた。
△84歩から角換わりに。相腰掛け銀。
後手の△65歩はよくある筋だが、▲45歩とこちらも位を取るのは見慣れない形。
これでどうやって先手は手を作るのかと思っていたら、後手から△44歩の反発!
先手の打開の仕方を見たかったので、その意味では少しがっかりしたが、
闘争心がむき出しになった、畠山らしい手だとも思った。
しかし、この棋風で角換わり後手をやると、(勝敗で)かなり損してそうに思うが…。
▲44同歩△同銀に▲25歩△43金右。
ここで先手は飛先交換ができる。しかしスルーで▲88玉と入る。
そしたら後手は△33銀と引いて飛先を受けた。
つまり、先手79玉型なら飛先交換されても後手44銀を生かした攻めが成立した?
4筋の歩を、お互い手持ちにしているという将棋。豊島は▲75歩。
解説で、パスのような手と言われた。なるほど後手は動かす駒がない。
実戦は△64角だった。これもなるほどという手。
が、▲74歩〜▲41角がある。74の地点を受けても、▲65銀(!)という強手が。
ここ、畠山の指し手や時間の使い方は、明らかに変調を思わせた。
畠山は、歩を突き捨てたり、歩を打ったり。かなり辛(つら)そうに見えた。
悪く言えば、苦し紛れの歩。
一方の豊島は、優勢になっても細かく時間を使い丁寧に局面を進めていく。
時間の使い方も冷静で、ちょっと豊島は強すぎると思った。
ただ、意外と長引いている。もっと、後手がどんどん酷くなる将棋かと思っていた。
後手は飛車が受けに利いている。角を入手しての△63桂で、実戦的には先手もイヤだ。
△42飛も、今度はタテの防御と△49飛成を見せてなかなか。
後手が、歩と桂で作った拠点から、馬を消して成桂を残したのはすごかった。
ずいぶん強欲だなあと思っていたのだが、それがわりと通ってしまった感がある。
玉の堅さが完全に逆転していて、これは後手いけるかもと思った。
ただ、駒損で攻め駒が少なく、後手が切れそうではあった。
両者、歩を使った応酬。畠山の歩は怪しく、豊島の歩はわかりやすい。
豊島、慌てた感じで▲75金。後手は角を取られずに詰めろが続けばいいが、という解説。
この解説は、角の守りがなくなると後手玉は詰むという意味だったかな。
ここで、なのかどうかはわからないが、一気に逆転。
端を突かれてどうしようもなくなり、△77同成桂に豊島が投了。
勝った畠山は、疲弊した感じのため息。
「勝った方が激しく消耗している」を、3月のライオンで数年前に読んで以来、初めて見た。
後手がよくなったのは本当に最後のほうだろうから、ちょっと意味は違うけど。
結果を知ってから棋譜を見返しても、畠山の歩は苦し紛れとしか思えないのだが、
それでも、その歩で、離されずに付いて行って、最後は追い抜いた。
相手の攻めで駒を入手し、安い駒でしつこく食らいついて、それを通した。
この畠山の攻めは感動的だった。

ゆるゆり♪♪(9/10)

ラス前。
本当の最終回は全員集合で暴れる必要があるので、ここで最終回っぽいことをする。
タイムマシンが出てくる。1期のBGMを使うのが、好きなタイプの演出。
あかりはずっと1年生でも、1年という時間はちゃんと表現できるんだなあ。
オチはあれだが、京子の創作というより、パラレルワールドと捉えるべきだろう。
EDがよかった。今回はOPがなかったので、EDが2期のよさを象徴する存在になっている。
今期は本当に面白い話が多く、ラス前とラストは、はなから期待していない。
中だるみがなく、1クールの中央部分で楽しむシリーズだ。

こわくなってきた

まだ同じように暑い。急激に日が短くなっているのにもかかわらず。
これは、涼しくなった瞬間に寒くなるパターンではないか。怖い。
実際のところ、今より1度低いくらいが夏の理想であって、
それより下がると、適切に上着を使う必要が出てきて非常に面倒になる。

多重forは再帰で書ける

(追記)
AtCoderのABC165のC問題を再帰と多重forで解いた。
再帰
https://atcoder.jp/contests/abc165/submissions/12674026
・多重for
https://atcoder.jp/contests/abc165/submissions/12686227
(追記ここまで)

C++で、1〜4の数字を1回ずつ使った4桁の数を出力する。

const int N = 4;
void hoge1()
{
    int p[N] = {};
    for (int i4 = 0; i4 < N; i4++){
        if (p[i4]) continue;
        p[i4] = 1;
        for (int i3 = 0; i3 < N; i3++){
            if (p[i3]) continue;
            p[i3] = 1;
            for (int i2 = 0; i2 < N; i2++){
                if (p[i2]) continue;
                p[i2] = 1;
                for (int i1 = 0; i1 < N; i1++){
                    if (p[i1]) continue;
                    printf("%d\n", (i4+1)*1000 + (i3+1)*100 + (i2+1)*10 + (i1+1));
                }
                p[i2] = 0;
            }
            p[i3] = 0;
        }
        p[i4] = 0;
    }
}

この4重のfor文は、読みにくいわけではないが、書くのが面倒だ。
また、Nを4から5に変更したいときにも、手間がかかる。
そこで、再帰を使って書き直す。

const int N = 4;
void fuga(int _d)
{
    static int p[N] = {}, q[N];
    int d = _d - 1;
    for (int i = 0; i < N; i++){
        if (p[i]) continue;
        q[d] = i + 1;
        if (d == 0){
            printf("%d\n", q[3]*1000 + q[2]*100 + q[1]*10 + q[0]);
            continue;
        }
        p[i] = 1;
        fuga(d);
        p[i] = 0;
    }
}
void hoge2()
{
    fuga(N);
}

以下が出力。hoge1()とhoge2()は同じものを出力する。

1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321