ニコニコ超会議の将棋企画

 今日はニコニコ超会議なるものの将棋放送を観ました。斎藤慎太郎六段とAperyがタッグを組んでponanza、nozomi、大樹の枝連合軍と指すという企画から見始めましたが、多数決による合議制がponanza単体よりも強いのかというのは微妙な感じでしたね。興行としては強そうに見せながらほどほどの強さに抑えることができるのでうまい手法なんだろうなと思いました。そうは言っても尋常じゃない強さであろう将棋ソフト連合軍を打ち負かした斎藤六段はやはりプロ棋士、異次元の強さを誇るのだということを改めて感じました。僕自身の棋力は将棋ウォーズでも初段になれないくらいのものなのですが、将棋ソフトが好きなせいでどうしてもプロ棋士の強さを過小評価してしまいがちであるようです。プロ棋士の方々というのは将棋が強いという一点で飯を食っていける恐ろしい人たちなわけで、わざわざ「プロ棋士へのリスペクトを忘れてはならない」と戒めるまでもなく本来ならばその強さを見ただけで自然と尊敬してしまうべきなのでしょう。僕がそうならないのは棋力が低すぎてプロ棋士たちの力を適切に理解できていないからなのだろうなと思います。勝負事が嫌いなので対人戦はあまりしないのですが、プロの凄さをより理解できるようになるという意味で棋力を高めたいですね。

 午前中には飛車と角はどちらが強いのかという企画を行っていたと後になってから知り、悔しさを感じながら番組のページを開いてみたら一般会員で予約してなくてもタイムシフトが見れるらしく、夜も遅くなってから見始めました。もともとはプロパンゴリラさんという人がニコニコ動画に投稿した動画がきっかけとなっていて、僕も氏の動画はほとんどすべて見たことがあるものですから、とうとう竜王と共演するまでになったかと驚きました。(芸のある)一般人が有名な人と同じステージに立てるというのは何かしら素敵なことであるように思います。夢がある時代だと思いますし、それをうまく活かせていない自分がちょっと嫌になったりします。ニコニコ及びニコニコ超会議が良いことばかりとは思いませんが、利用できるものは利用するのが正しいあり方なんでしょうね。企画内容そのものはやはり飛車が自由に動けるのが大きくて、駒組が制限されてしまう角側に対して縦歩取りを見せる急戦、堅く囲える持久戦のどちらでも飛車側が有利なのでしょう。竜王の切れ味鋭い発言が効いていて良い番組でした。

AtCoder Regular Contest 050に参加しました

昨日行われたAtCoder Regular Contest 050に参加しました。
結果はA問題しか解けず、100点の259位でした。200点取れると順位がふた桁以内になるようなので頑張りたいところですね。
以下各問感想

A問題 大文字と小文字

最初A-Zとa-zは数字が続いているものと思っていたので入力をAとaで受け取ったとすると A - a == 26 とすれば判定できるのではないかとか考えていました。やってみると全然違う数字が出てきてしまったので、しばらく悩んだあと諦めて小文字の方にtoupper()を適用して比較しました。解説放送であったとおり A - 'A' == a - 'a' と比較すればスマートにやれたのですね。解説放送のコメントでXORを使うとかもありましたが、よくわからないですしまだそんなことを気にするレベルではないかなという感じもします。

B問題 花束

入力が{R,B,x,y}とあって、{(x,1)}の束をa個、(1,y)の束をb個作るとすると、できる花束の総数M M = a + b 個となるのでこのMを最大化すれば解けるのではないかと考えました。このとき、赤い花による条件は ax+b \leq R , 青い花による条件は a + by \leq B となり、b = M - a からbを消去すれば
{\displaystyle
M \leq R - a (x-1)
}
{\displaystyle
M \leq \frac{B - a}{y} + a
}
という不等式を両方満たせば良いことになるので、つまりaが定まったとき {\displaystyle
M = \min(R - a (x-1),\frac{B - a}{y} + a )
}
ということになります。  a = 0 から  a = \frac{R}{x} まで変化させたときの M の最大値を返せばいいのではないかと考えましたが、最大とする a を三分探索で求めようと実装していたところで時間が尽きました。この方針でいけるのかわかりませんが実装を速くしないと試せるアイデアが少なくてもどかしいですね。 解説では花束の数を与えれば二分探索で解けるとのこと。二分探索は数式に使える条件が増やせるし関数の返り値はbool型で良いしで、ぜひとも適用できるかどうかを見極める力を身につけたいテクニックですね。

C問題 LCM 111

愚直に処理をプログラム化しただけでは絶対通らないんだろうと思いつつも、ユークリッドの互除法の実装をしたことがなかったのでその練習も兼ねてということで小さいサンプルだけ通るようなものを書いて提出もせずに終了。ユークリッドの互除法は引数の2整数の大小関係を気にしない書き方ができるらしいのですが、いちいち大小関係見てスワップさせながらみたいな実装をしました。こういうところもなんとかしたいですね。書いたコードを他のコンテストで再利用するってどういう方法が最適なのかわからず、とりあえず今は手を動かすことを再優先にやっています。 解説を聞いたあとでも、多分うまく大きい数を関数でバラしていくあたりが実装できないんだろうなと思いました。まぁ慣れればなんとかできるんじゃないかと思いますが。

D問題 Suffix Concat

コンテスト中は問題文を読みすらしてなかったのですが、解説を聞く限りとても難しそうでまだ手の届くものではなさそうだなという感じです。

A問題のタイムアタックみたいな状況からは一歩抜け出したいですね。