けものみち

まったりと、きのむくままに。

Opfer MASTER 工夫運指&餡蜜運指集

先日、オンゲキ現在最難関と言われている Opfer で ALL BREAK を達成しました!

登場当初はSSSも乗らなくて、ABは当分無理では?という感じでした。 さらに、同時に出たもう一つのLv14+ である Titania の方が得意だったので、 Opfer から目を背けて逃げていました(´・ω・`)

しかし、Titania が AB, FB, SSS+ を終わっている以上、Opfer を終わらせないわけにはいかない!という気持ちがわいてきたので、いろいろ考えてやれば突破できるはず!と思い、頑張ることを決意しました(というのが表向きの頑張った理由*1)。


というわけで、正規運指ではだいぶ難しい Opfer をできるだけ楽して通せるように色々工夫してきたので、その運指たちを公開します。

一応対象とする読者は

  • Opfer MASTER S 以上 SSS 以下で伸び悩んでいる人
  • Opfer MASTER AB 狙いたい人

あたりを想定しています。

S が取れない人は、単純に実力不足なので、他の易しい曲(Lv.12 ~ Lv.13)で練習した方が個人的にはいいと思います。

以下、譜面の画像と動画を参照しながら記述していこうと思います。 譜面の画像については SDVX譜面保管所の Opfer のページ (https://sdvx.in/ongeki/01/01108mst.htm) 、動画については [オンゲキ] Opfer (MASTER) SSS [外部出力] - YouTube を参照しており、各運指ごとにこの動画のどの時刻にあたるかを記述してあります。


1. 階段をトリルに読み替える

f:id:WhiteFox-Lugh:20190423211322p:plain

動画の 0:34~ の両手トリル部分は16分で交互に叩くだけなのですが、8個だけ階段になってます。 これを上の図の右のように両手トリルに直してあげます。階段苦手な人は BREAK 数が減るし、導入するのも簡単なのでおすすめです。

2. レバーを直前に振っておいて放置する

f:id:WhiteFox-Lugh:20190423212707p:plain

動画の 0:53~ のあと、普通にやると片手でレバーを操作しながら、もう片方の手で片手トリルをしないといけない感じになりますが、ホルード終点に左向きのフリックがあると思って、図の星印あたりにレバーを放置してしまえば、フィールドから脱線しないので、両手でトリルをとることができます。

これも小さい工夫ですが導入が容易でかなり安定します。

3. 難関の24分階段は16分トリルで餡蜜せよ!

f:id:WhiteFox-Lugh:20190423223828p:plain

動画の 1:20~ くらいからの部分です。この記事の一番重要なところではあります。 ここを普通に階段でさばいて、HIT, MISS でない人はこのままでいいですが、AB 狙い位だったら、16分交互トリルに読み替えるだけでABで通ります。しかも、慣れると90%以上は AB で通ります。

ポイントとしては、

  • の順の階段は、に分けてトリルにする
  • の順の階段は、に分けてトリルにする

ことです。の位置が違うこと(後ろに来る方のノーツの色にくっつく)に注意してください。

なぜこれで BREAK 以内で収まるかを一応理論的な観点から説明しておくと、 Opfer の BPM は 175 であることから、24分音符は 175 / 60 / 24 = 0.12152777... 秒間隔で叩いていることになります。判定の幅は「フレーム」という単位が基準になっており、1フレーム = 1/60 秒 = 0.016666... 秒 となっています。

オンゲキの場合、判定のフレーム幅についてはあまり解明されていませんが、自分の経験で言えば

  • CRITICAL BREAK: 3 ~ 4フレーム(おおよそ ±0.06 秒以内程度)
  • BREAK: 6 ~ 8フレーム(おおよそ ±0.13秒以内程度)

あたりかなと思っています。 つまり、正しい判定位置から ±0.13 秒程度のズレであれば BREAK までには収まってくれるわけです。 以下、このフレーム数を仮定して議論します。

さっき計算した、Opfer(BPM 175)における24分音符の間隔は 0.1215 秒程度であり、 24分音符の間隔(0.1215秒) < 「BREAK」判定の許容誤差(0.13秒程度) が成り立ちます。

ところで、24分階段を16分トリルに直すと、2つのズレたノーツの丁度中間を叩いてあげるような感じになります。これだとちょっとわかりにくいので下の図を使って説明します。

f:id:WhiteFox-Lugh:20190423223843p:plain

右の簡易化した運指と左の正規譜面を見比べ、右の図から左の図に点線を引いてみました。 これでわかると思いますが、緑と青についてはちょうど間をたたいてあげるような感じになります。 これは、24分音符と16分音符の関係を考えてあげるとわかると思います。

ということは、(正しい配置でボタンをたたく時刻) - (工夫した運指でのボタンをたたく時刻) の秒数の絶対値は、24分音符の間隔(0.1215秒)の半分の 約0.608秒 ということになり、これなら十分 BREAK までに収まってくれることがわかります。さらに、わずかだけ2個同時押しをずらせば、同時押しの2つのノーツも CRITICAL BREAK に収めることができるようになります。

簡単な算数使うだけでこんなに楽することができるんです。算数、数学はこういう時に便利だぞ。

4. 実は簡単な青赤トリル

f:id:WhiteFox-Lugh:20190423225632p:plain

動画の 1:40~ の部分です。一見複雑な配置をしていますが、が交互に来るので、右手で、左手でを16分音符の速さで交互に叩くだけです。

これはかなり有名なのでこれ以上説明しません。導入も簡単ですし、精度も取りやすくなるのでやりましょう。

5. 視覚的に見づらいだけ

f:id:WhiteFox-Lugh:20190423230205p:plain

動画の 1:48~ の部分です。これも見づらいだけで、右手で、左手でを交互にやるだけです。

その後のホールド、32分音符トリルはガチ押ししかないのでがんばって下さい(´・ω・`)b

6. 交互じゃなくても通るよ

f:id:WhiteFox-Lugh:20190423235339p:plain

動画の 1:55~ の部分です。巻き込んで HIT でやすいので、僕は図の右側のように連続2回押すようにしています。巻き込まないし、BPM175で2回なのでそんなに難しくはならないです。

6. ちょっとずらすだけ

f:id:WhiteFox-Lugh:20190424001305p:plain

動画の 2:03~ の部分です。 オレンジ色の丸で囲った部分がすごく抜けやすく、こんな短い間隔で2回もボタン押せるか!って感じだったので、それなら分業しちゃえばいいじゃん、ということで2種類ほど案を考えていました。 たった1ノーツずらすだけで抜けなくなります。 左手と右手で指の動きやすさが違うと思うので、お好みの組み合わせを見つけてみてください。

7. 階段と壁が混合した難所も3と同じ理論で突破!

f:id:WhiteFox-Lugh:20190424125246p:plain

動画の 2:06~ の部分です。 ここめちゃくちゃ HIT, MISS が出やすいと思いますが、3の運指の理論を適用すれば16分トリル+αぐらいの運指で BREAK までに収まってくれます。

図の右側のオレンジ色の丸印の部分がちょっと厳しい感じの部分になっていて、遅れやすい(HIT(LATE))ので注意してください。

8. ホールドの始点をずらそう

f:id:WhiteFox-Lugh:20190424125320p:plain

動画の 2:11~ の部分です。 ホールドが左側から流れてきますが、たぶんホールドは左右対称になっている方が見た目的にはキレイだという理由でこのような配置になっています。

ですが、スコアアップには邪魔なので、素直に右手でホールドを取ってあげましょう。この場合、オレンジ色の丸で囲んだホールドの終点まで押せていなくて HIT になるパターンがあるので終点まできちんと押し続けることを心がけてください。

9. 最後の難所の一部もトリルでカバー

f:id:WhiteFox-Lugh:20190424125343p:plain

動画の 2:14~ の部分です。 ここで点数ごっそり持っていかれますよね。最難関だと思います。 まず、黄色の枠で囲った部分ですが、頑張って16分交互か近い形に変形しようと思ったのですが、ホールドが邪魔して無理でした。ここは正規でがんばるしかなさそうです。

その後のジグザグは 3 の理論を使ってしまえば BREAK までに収まります。理論値とか1009000とか狙おうと思わなければ、もうこんな複雑な階段をガチでさばく必要なんてありません。これだけでおそらく数千点はアップします。ぼくはこれを思いついたおかげでいつか AB 取れると確信しました。

余談なんですが、なんでここだけレーンがジグザグになっているんでしょうね。


終わりに

オンゲキのできない部分は、いかに頭を使って自分のできる運指、あるいは楽な運指に落とし込むかがカギだと僕は思っています。これはズルでもなんでもありません。思いついて実践した人の勝ちです。

これを執筆した時点では自分はまだ SSS+ に達していないし、全国ランキングでも SSS+ 以上獲得した人は 100 人もいないので、次の目標は Opfer SSS+ ですかね。長い戦いになりそうです。

*1:本当は、自分よりレートが少し下の人から「やっぱ Opfer 無理っすよね~wwww 自分もまだSSS乗ってないっすwww」っていう謎の煽りを受けたので、少しだけ懲らしめるためにやりました。

AtCoder 水色になったよ

やっとAtCoder 水色になりました(っ¯꒳¯c)エッヘン

えっへん

さて、何書こうか迷ったんですが、単純にここまでの記録を振り返りと反省を書き綴ろうかなと思います。

軽く振り返る

記念すべき(?)第1回目のコンテスト(2018 年 6 月中旬ごろ)

周りの人がそこそこ競プロやっているのみて面白そうだなーと思いつつも、どこか難しそうだし、コンテストとかヤバそう…頭のいい人にとってはお遊び、とかパズルみたいな感じなのかな?と正直敬遠していました。

競プロやってた親しい友人の1人が「とりあえずまず AtCoder Beginner Contest に参加してみれば??」とアドバイスしてくれたので、「まあ初回だし、爆死してもいいや、記念参加〜」みたいな軽いノリで初参加をキメました。ちょうど ABC100 です。キリがいいですね。

といっても、プログラミング歴の浅い僕は大学の講義で扱っていた JavaOCaml ぐらいしか書けませんでした。競プロをやっている友人何人かにオススメの言語を聞いてみると、多くの人は C++ で参加しているので C++ がいいぞ、とのことだったので、それまで一度も書いたことがなかったのですが、C++を選択しました。

初めてのコンテストの結果は 100 点と 300 点の問題を時間内に AC して終わりました。

緑レートくらいになるまで(2018 年 9 月末くらいまでの期間)

始めてから少しすると被験者バイトを紹介されました。AtCoder のレーティングが 600 ~ 1200 くらいの人が必要、ということだったのでちょうどいい目標だな、と思い緑レートくらいを目標に少しずつ勉強をしていきました。このバイトについては少々レーティングが足りなかったものの、パフォーマンスの値は十分あったこともあり、無事に採用されることになりました*1

この時期にやっていたことといえば、

ぐらいで正直言うと熱心な人と比べたら本当にゆるふわ*2にやってる感じでした。

水色になるまで

9月末、自分自身があまりにも自己流で学習を進めていてよろしくないことと、競プロが楽しくなってきたこともあり、ようやく蟻本を購入し、体系的に勉強をするようになります。企業コンテストも多く、本戦に出場している人が交流していたり、楽しそうにコンテストに参加するのを見て少しずつ憧れを抱くようになります。

さて、この時期に勉強していたことですが、とにかく基礎を固めました。 おおまかに対策した順番に並べると、

  1. 純粋に全探索をする問題をまず完璧にする
  2. DFSやBFS系の問題をたくさん解く
  3. 貪欲法の問題を解く
  4. DPのうち易しい問題や(蟻本に出てくるくらいの)典型的な問題を解く
  5. 数え上げ問題や整数問題系の問題に慣れる
  6. Union-Find や二分探索、累積和、素因数分解あたりの AtCoder 300~400点によく出てくるテクニックを身につける
  7. 1~6 までがいくつか組み合わされた問題を解けるようにする(難易度にして400点くらい)

といった感じでしょうか。とにかく、ABC のC問題の打率を9割以上、D問題を頑張って時間内に通すことに焦点を当てていました。

反省

競プロ開始直後

A. 言語選択

競プロをしていく上で途中で言語を乗り換える、なんて人はほとんどいないと思いますし、最初に選ぶべき言語は非常に重要だと僕は思います。結論から言うと、僕は C++を選んで正解だったと思います。理由としては、

  1. 解説のサンプルコードや、他の人の提出や解説を見ても C++ が圧倒的に多い
  2. 実行速度が速く、問題文の制約等も C++ 基準で設定されていることが結構ある
  3. ライブラリ等が充実している

ということが挙げられます。1 は独学する人も、友人と一緒に勉強していく上でもかなりメリットになると思います。 2 については、「Python だと想定解なのに TLE ギリギリでヒヤヒヤする」みたいな余計な心配等をしなくて済みます。他のコンテストだと「Python でコンテストに参加している人は、PyPy を選択してほしい」みたいな記述もあったりします。

実は自分もコードの書きやすさから Python で進めていくことも考えていました。 もちろん JavaC#Python などを使い、かなり高いレベルに達している人もいますが、スムーズに学習を進めるためにも僕は C++ を強くおすすめします。

B. とりあえず ABC から

AtCoder Beginner Contest ほど初心者向きの問題が出題されているコンテストはおそらくないと思います*3。普段から開発とかその他もろもろでコード書きまくっている人もとりあえずABCから始めるのが良さそうです。回数もかなり頻繁に開催されています。

C. Twitter を積極的に活用しよう

始めた頃は「強い人に見下されたくないなぁ…」「あの人クソザコだ、みたいに思われたら嫌だ…」「みんな強くて怖い」と思ってしまいがちですが、強い人の多くの人はめちゃくちゃ優しいです。

なので、Twitter で「これくらいの実力の人とつながりたい」とか呟いたり「今日はこの問題が解けた!うれしい!」みたいに進捗をつぶやくと、いろんな人が「お、この人頑張ってるな」みたいな感じで拾ってくれると思いますし、疑問点をつぶやくと、つながりがあればかなりの確率でリプライが期待できます。こういう何気ない繋がりが結構モチベーションの維持につながると思うので、恐れずに自分の成果とかコンテストの結果とか疑問点とかつぶやいてみるといいかもしれないです。

緑レートまでの振り返り

かなり基礎的な部分に不安があったため、Hello, world! をスタートするくらいのレベルから本当にスタートしてました。この辺で文法とか標準入出力(整数、文字列、浮動小数点数)といった初歩的なことはほぼ大丈夫になります。これについてはできないとどうにもならないのでやるしかなかったと思います。

あとは今後に備えて、環境構築もきちんとしておきました。MacVSCodeC++ の基本セットを入れてあとはテストケース実行(Code Runnerとか)できるようにするだけですぐに終わります。それまでは Wandbox を使っていました。

その後は、ソートとか最大公約数、map や vector などの使い方をやっていました。この時は全く気づかなかったのですが、問題を解く上で一番基本的な考え方である「全探索」「貪欲法」「動的計画法」あたりは完全に抜けていました。これは非常にまずかったと思います。有名どころである蟻本とかを持っていなかったせいもあると思います。

問題を解く上でまず全探索を考え、制約を見て間に合いそう(制限時間 2 sec で O(106) 程度までにおさまる)ならそれで十分、間に合わないなら工夫をする、という考え方が完全に抜けていたので、当時は全探索の問題が全く解けていませんでした。

また、貪欲法については、「なんとなくこれでいける」みたいな雰囲気で書いてしまい、それが通ることも多かったので深い考察をすることもなくコードを提出していることが多かったです(のちに痛い目にあいます)。

動的計画法については、AtCoder では Typical DP Contest とか Educational DP Contest とか開かれるくらいには重要な項目だし、この時期に取り組んでおけばもう少し成長が早かったのかな、と思っています。

個人的には大丈夫だったので、特に勉強はしていませんでしたが、緑目指すくらいの人のうち、「答えはあっているはずなのにどうしてTLEになるのかわからない」という人は、時間計算量の感覚を灰色〜茶色くらいで必ずマスターした方がいいと思います。

水色になるまでの振り返り

全探索から始め、AtCoder 400点くらいの難易度まで対策をして自分なりの考察フローチャートが自然に出来上がっていた気がします。自分の考察手順としては、全探索をまず第一に考え、それで間に合うならそれ以上のことはしない、間に合わないならどういうデータ構造やアルゴリズムを用いて計算量を落とすか、貪欲に行けるかどうか、貪欲でまずそうなケースはないか、余計な計算をしているところはないか、今まで自分が勉強してきたものに帰着できないか、というように考察をしていました。

先ほど挙げた 1~6 の内容だけでもきちんとものにすればビギナーは卒業できると思います。 ここまでたどり着くのに挫折してしまう人はいっぱいいます。ここまできたなら十分自信を持っていいと思います。

あと、蟻本の例題を解くために POJ に登録したのですが、コンパイラが古く、UI もイマイチでとにかく気に入らない点が多かったので、こちらの Qiita の記事を参考に勉強を進めていました。蟻本の例題を AtCoder の問題で置き換えてくれています。すごく役に立ちました。

qiita.com

中級編、上級編も存在しています。

その他

体調管理

夜に開催が多いのでつらいかもしれないですね。 体調悪い時はコンテストの参加は見送りましょう。ぼくは熱出ている時に参加して普段の半分のパフォーマンスになった経験があります(ABC113)。

部分点解法

もし、コンテストで制約が小さい部分点解法の結果だけジャッジを知ることができたら良い、という場合はその制約にそぐわない入力が来たら即プログラムを終わらせる、みたいなことをすると、ジャッジが返ってくるのが少し早くなります。例えば、Nを正の整数として「1 <= N <= 200 を満たすデータセットに正解すると 300 点が得られる」といったときに、1 <= N <= 200 なら普通に実行して、201 以上の値が来たらすぐ main で return 0みたいな感じです。

最近は部分点が設定されている問題はほぼないですね。

コンテスト中にSNSは控えた方がいいかも

順位表から分かる情報はつぶやいても大丈夫、ではありますが、うっかり「なんでこれTLEするんだ?」とか「5ケース落ちてる…」みたいなツイートをコンテスト後にTLを遡ってみるとたまに見かけることがあり、これはまずいのではと思うことがあります。特に鍵アカウントの人はRT等されないため、普段から意識をしていないとダメだと思います。

目標を見失わない

正直、水色になるまでに同じ大学の他の人のレート変動を見て「この人5回で青色になってる…」とか才能と努力の差を見てものすごく凹んでいた時期がありました。凹んでいても突然天才になったり脳みそが急に覚醒したりするようにはなりません。直近のパフォーマンス等を見ながらそれよりちょっと上ぐらいの目標を立てて一歩ずつ前に進む方が精神的にいいかもしれません。

*1:自分が始めてからそれほど期間が経っていなかったことと、短期間でUnrated コンが2回発生したため特例

*2:毎日やっていたとかではなく、3日ごとに少しずつ進める、みたいな超マイペース

*3:最近では Codeforces Div.3 というものがあるのですが、いきなり飛び込むとレートが下がりまくるので萎える人が多そうです。