P5S
エンディングまで30時間ちょい、リクエスト埋めからレベル上げやら稼ぎやらで55時間かけて仕込み、最終的にラスダン手前でトロコンしたあたりでだいたい75時間。
無双ゲーということで若干敬遠してたんだけど蓋を開けてみたらちゃんとペルソナでしかも神ゲーだった。
ペルソナシリーズのコミュは楽しいんだけど、それがないことを逆に利点にしていたのが偉い。
一つの都市に縛られる必要がなくなって、全国を回るストーリーにできたし、人間力上げのリセマラやらアルカナの調整やらダンジョンから脱出しての回復やらがなくなったのは相当楽に感じた。
とはいえ本家シリーズではそこらへんの重さも込みで楽しみたいので6が出るならそのままで期待したいです。人間力のランダムイベントだけはなくしてくれていいけど。
2周目用のペルソナとして用意したのは以下10体。
弱ブースタについては、火炎と祝福は宝魔ドロップを大阪の十王子駅で粘って入手、後は合体経路で適当にとった。合体事故とかも利用したため記録はない。
1. アリス
死んでくれる? ムド成功率UP ランダマイザ 魔術の素養
デビルスマイル 状態異常成功率UP 恐怖率UP ソウルスティール
SP回復と即死用。雑魚戦はほぼこれ。中ボスも即死がだいたい効くのでこれ。
2. メタトロン
マハコウガオン 祝福ブースタ 祝福ハイブースタ 魔術の素養
マハンマオン ハマ成功率UP メシアライザー 大天使の加護
呪怨無効相手にはこちら。あとメシアライザーも打てる。
祝福弱点のボスに魔法連打も可能だけど、他の属性が通るならそっちのほうが火力が出るのでそっちの出番はあまりなかった。祝福ブースタ回収するのだるかったんだけどなあ。
3. ヨシツネ
八艘飛び ワンショットキル ヒートライザ 大治癒促進
クリティカルハイ ダウンテクニック 不屈の闘志 反逆の意思
どちらかというと1周目のラスボスみたいな長期戦で使っていた。
大治癒促進は大天使の加護とかのほうがよさげ。
ワンショットキルはクリ率重視でこっちにしたけど使い道が対モスマンとかのモブ戦くらいしかなかったので至高の魔弾で良かったかも。
魔術の素養を持っていないので、ヒートライザは他のペルソナに持たせたほうがよかった気がした。
見返してみると反省点の多い一体。でも作れるようになってすぐ作ったからどうしてもこうなってた気はする。
4-6
ルシファー ジャアクフロスト トール
メイン魔法 ○○ブースタ ○○ハイブースタ 魔術の素養
状態異常成功率UP ○○率UP ソウルスティール 自由枠
状態異常が付与できる属性。
自由枠は元々覚えるスキルに左右されるため、嘆きの闇・不屈の闘志・宣戦布告にしていた。こだわるならスキルカードで。ジャアクフロストは合体でも変更可。
7-9
フォルトゥナ フォルネウス モト
メイン魔法 ○○ブースタ ○○ハイブースタ 魔術の素養
超絶技巧 自由枠 自由枠 自由枠
超絶技巧に対応した属性。
これも自由枠といいつつ元から覚えるスキルにかなり依存していた。
フォルトゥナ:コンセントレイト アムリタドロップ 極・電撃見切り
フォルネウス:マジャカマオン 不屈の闘志 サイコフォース
モト:コンセントレイト 不屈の闘志 メギドラ
絶対に使わないメギドラよりはマハラクカジャのほうがまだマシだったかもしれない。
10
ネビロス
ランダマイザ デクンダ デカジャ ムド成功率UP
アリスをムド特化にした結果産まれたなにか。
7-10のどれかにヒートライザをもたせるのが正解だったと思う。こいつだとかなりちょうどランダマイザの枠も節約できて最高だったはず。
SP回収→即死は特にハッキング戦で多用することになるので、そこに切り替えは使いたくないからアリスにエイガオンやブースタを覚えさせたくはなかった。
AtCoderでレート青になるまでにやったこと
AtCoderでレート青になったのでそれっぽいことを書きます。
だいぶサボっていたとはいえ、水色から1年くらいかかってるんですよね。
[1] 目指すべき実力
・青になるためには、5完以上を目指す。水色になるには、4完を目指す。
現在のABCでは、だいたい5問解ければ青パフォは出るようです。
そのために必要なものは、E・Fを解く能力もですがまずはD問題まで確実に解けるようになることです。
私が水色になった時は、まだABCとARCが分かれていて、ABCのD問題は今と比べると少し難しかったように思います。
この頃にD問題が半分以上とけるかな?という実力で水色になりました。
今の基準ではもう少し正答率が高くないと上がれないかもしれません。
[2] 言語の選択
・赤はC++が極端に多いですが、青まではPythonでも問題ありません。
Pythonは確かにC++などと比べて遅いですが、ABCレベルであればPythonだから解けないということはありません。maspyさんを参考にしましょう。
実際に、PythonでTLEが出た後にC++で書き直したら通ったという経験は1~2回ありましたが、乗り換えは行いませんでした。
言語の難しさという点ではC++のほうが遥かにハードです。大きい数は10^9+7でMODをとることが多いですが、中にはlong long intの範囲を超える数を答えとして出力しなければならないケースもあります。
また、計算の途中経過で超える場合などもあり、そこでWAやREが出るのは厳しいです。
また、VectorとPythonのリストや辞書も、扱いやすさがかなり違います。
Pythonから入った人間の意見ではありますが、こうした部分を考えると、初学者であり、競技プログラミング以外でもPythonを使う場面がある、という方であれば、そのままPythonで競技プログラミングに挑戦することをおすすめします。
paizaなどでは、Pythonのほうが実行時間の制限がゆるい場合もあります。
他の言語は、といわれるとやっていないのでわかりません、としか言えないです。
Go言語は流行りの言語という意味では悪くないのですが、基本のライブラリがあまり充実しておらず、maxの計算すら手間がかかるため、試しに採用してみたことはあるものの常用はしませんでした。
[3] 練習方法
・atcoder problemsなどを利用しながら過去問を解く。
atcoder problemsで933AC、その大半がABCとARCの低難易度埋めではありますがそれなりに頑張った気はします。
このときに考えることはいくつかあります。
1. 典型問題で利用する関数、入出力の部分などを作成しておき、ファイルやgithubからいつでも参照できるようにする。
非常に重要です。プライベートリポジトリなので公開できませんが、私は以下のようなアルゴリズムや関数のコードをgithubに登録しています。
・最小公約数、最小公倍数(最近、math.gcdがサポートされたので不要になりました)
・MOD下での逆数
・MOD下での組み合わせ
・Union-Find木
・スライド最小値、スライド最大値
・ダイクストラ法、ベルマンフォード法、ワーシャルフロイド法
・トポロジカルソート
・転倒数
・最小共通祖先
・セグメント木
一度やった問題が確実に解ける、ということは大きな強みになります。頑張って自分の武器を増やしていきましょう。
2. DPを使えるようになる。
typical DP contestなどの問題を通して、典型的なDPを利用する問題を覚えましょう。
D以上の問題は、全探索すると解けないという問題が多く、その際に適切なDPを行って計算量を減らすことが求められます。
といいつつも、DPの漸化式が早く思いつけるようになるための方法は説明できません。ABCの過去問をたくさん解いて、パターンを覚えていったくらいですね。
[4] いまだにできていないこと。
青になってもできないことがあるので青なのです。AGCなどはA問題以外まず解けないです。
面白いもので、AtCoder Problemsで黄色以上のパフォーマンスになっているF問題はほぼ解けていないです。
このあたりの問題は、解説を読んでも解けない場合が多いので、配信動画を見るなり、自分と同じ言語を使っている人のAC解を見るなりして学んでいくしかありません。
話が逸れますが、他の人の解答をみることは非常に重要です。入力部分や、ループなどのコードをもっと効率的に書く手段が見つかります。私もPythonのmapなどを使いこなせているとは言い難いため、他人のコードを見て「この部分はどういう挙動をするのだろう」となることが多々あります。
こういった部分を潰していくことで、より効率的で可読性の高いコードが書けるようになります。
あとは、セグメント木や最小共通祖先を使う木の問題も苦手です。
特にセグメント木は何度解説を読んで実装してもわかってないような気がしています。
この先は「自分の苦手な問題はなにか」を明確にして、それらを潰していくことが重要になりそうです。
[5] 読んだ書籍
蟻本や、アルゴリズムとデータ構造は家にあるのですが読み切ってはいません。紙の本読むの苦手なんですよね。
ただ、色々な話を聞いている限り、ちゃんと読んだほうが良いかとは思います。
たとえば、blogなどで、ABC参加しました。この問題は蟻本にあった~で、というような記事はよく目にします。ABCでまだ出たことはないが、蟻本には書いてあるものは少なからずあると思います。
何したら良いかわからない方はやりましょう。持っていないならABCノックでもいいと思います。
[6] 最後に
・ABCはできるだけ出ましょう。緑や水色に上がり立てて下がるのが怖くても、出てください。
過去問をやったらやっただけ、本戦は出たら出ただけ実力がつくと思います。
本戦と、過去問ノックでは集中力が格段に異なります。本戦で100分間しっかりと頭を使う、ということを超える練習を私は知りません。(実力をつけるだけなら座学は強いですけれど)
それでは良いAtCoderライフを
オクトパストラベラー(2)
とりあえず全ジョブ開放+主人公の4章クリアまで終わったので。
良い点はグラフィックとBGMと戦闘、良くない点を上げるならシナリオのテンポという感じ。
良い点は見ての通りなんだけど戦闘面はやはりすごい。
サポートジョブが4つしかつけられないのでかなり悩むし、防具の性能も完全上位互換が次々と出てくるという感じではなく、敵に合わせて物理防御と属性防御のどちらを重視するかを考える必要がある。
ただ、レベル上げ自体はやりやすいゲームなので普通にやっているとストーリーのボスで苦戦することがないのが残念。
魔術師以外の上級ジョブなしで武芸家の開放をしにいった時の戦闘が一番おもしろかった。ジョブ・スキルの構成を考える楽しさと、実戦の緊張感がたまらない。
その武芸家が強すぎてそれ以降がなんともという状況なので、ラスダンに期待ですねもう。
そういった消化試合感が出ている中でストーリーを進めているので、セリフが表示された瞬間の読みづらさが厳しい。セリフウィンドウが出る時のアニメーションのせいだと思うのだけれど、一泊おかないと読めなくてテンポが悪くなっている気がする。
あとは、イベント中の操作不可時間がそこそこあるのも険しい。いわゆるムービーゲーよりはマシなんだろうけど。
シナリオの内容も賛否わかれるポイントだと思うけど個人的には好き。良くも悪くも王道なので、意外性を期待する人には無味に思えるかも。一部キャラはそれを差し置いても薄味だが。
後はまあ、キャラクターの固有アクションの強さに差がありすぎたり、後から回収が面倒だったりするのも問題かな。ハンイットはオルベリクと比べると使い勝手が悪すぎるように思う。
オクトパストラベラー
セールきてたので買いました。
主人公はなんとなくハンイットに。
最初は全員仲間にするところからスタートなのだけれど、2人くらいまでの間はかなりしんどかった。
弱点をついていくペルソナのような戦闘なのだけれど、全体魔法一発あてたらOKではないため、キャラクターが揃っていないと弱点がつききれない。
このゲームの大きな特徴として、固有アクションがある。
各キャラクターに、フィールドで発生するパッシブ効果や、NPCに対して利用できるアクション、戦闘中に使用できる専用技などが存在している。
固有アクションは、このゲームの楽しい点でもあり、苦しい点でもある。
例えば今回選んだハンイットは固有アクションの扱いが若干難しいため、テリオンやアーフェンにすればよかったという後悔が若干残っている。
テリオンはRPGである以上盗むが強力だし、アーフェンは強い斧を手に入れれば全体攻撃で1キルなども可能。
トレサの固有アクションも強力だが、テリオンと役割がかぶる上に宝箱が開けられないなど、他のキャラはいくらか難しい部分がある。
正味な話、主人公を外せないという成約がある以上、選択に迷うようであればテリオンにしておけばよいのではないだろうか。
というのが最序盤(1章)の感想。
最終的にクリアが近づいていくにつれて、ストーリー的な面であれこれあるかもしれないけど、今はちょっと失敗したかもなあという印象が拭いきれない。
好きなボードゲーム
ボドゲ会なら今日はこれの気分!で持っていくんだけど、
ボドゲカフェみたいな場所だとまた話が変わってくるなあということで
今日いった店にあったやつ(要するに定番)でオススメのモノとか
・ボブジテンその2
シリーズは多数出ているが、その2のデイブ(ジェスチャーで説明しなければならない)が最高傑作
引きが悪いと全然伝わらなくて苦しいのだけれど、当たったときの感動がすごい
・ICE COOL
コマを弾いて相手にぶつける男子小学生が大好きなゲーム
物理ゲーの中ではコンセプトがわかりやすく、まっすぐ飛ばすだけならそんなにコツもいらないのが良いかな
ルールブックがわかりやすく、だいたいの疑問がすぐ解決できるのも良い
・テレストレーション
お題→お題の絵を描く→お題を推測する→推測されたお題の絵を描く→を繰り返すイラスト伝言ゲーム
伝言ゲームの常で、途中であらぬ方向にずれていくのがとてもおもしろく、プレイ中は笑いが絶えない
説明が簡単、お題の種類が豊富で繰り返し遊べると非常に優れたゲーム
ボドゲ会だとだいたい誰かが持っているので自分では持っていない
・デンポー!!
お題をできるだけ少ない文字数で伝えるゲーム
2文字とかでも平気で当たったりするのでかなり盛り上がる
インストが簡単で、ボドゲをあまりやらない人にもウケたので今後も持っていく機会は多そう
・横暴編集長
名作のタイトルを2つに分割して、その上下を別々に組み合わせて新しいタイトルを作り出すゲーム
何と組み合わせても面白いだろみたいなパーツが多く、売れそうなタイトルを選ぶというタテマエの大喜利が行われることになる
あまりボドゲをやらない人にもウケがいいのと、小さくて軽いので持ち運びが楽なためボドゲ会があると99%持っていきます
ボドゲ慣れしているメンツなら、のゲーム
・マカリョーシカ
ルールがとてもわかりやすい
運の要素が割とあるのが面白い部分。逆にガチガチなのが好きなら難しいかも
人数が3人なので、4~5人で集まったときは遊びづらいのもある
・デクリプト
キーワードを使って意思疎通を図るゲーム
考えるのがかなり難しいので見た目ほどライトなゲームではない印象
ゲーム自体は早く終わる
・アズール
タイルを取得して並べていき、取得できた数に応じてボーナスが入るゲーム
コンポーネントが綺麗、ルールがわかりやすくインストが簡単など
非常に優れたゲームだが、やったことがある人が有利な感じは否めない
・テラミスティカ
マップ上のタイルを開発して自分の領地を広げていくゲーム
非常に面白いのだが、インスト1時間プレイ2時間みたいな感じのゲームなので
今日は1日テラミスティカくらいじゃないと遊びづらい
・ナショナルエコノミー メセナ
いわゆるワーカープレイスメントゲーム
グローリーはまだ遊べてないので早く遊びたいです。要するに遊ぶ機会がない
これもインストに時間がかかる上に初見の人をサポートしながらやるのが難しいのが難点
・ロングロングマホウ
カードをめくって出てきた言葉(呪文)をつなげていき、制限時間以内に読めなかったり噛んだりした人が脱落していくゲーム
負けすぎて温まってきた時の秘密兵器。自分は(勝てるから)最高に好きだけど、他の人がどうかといわれるとよくわからない
ABC151
A
chr(ord(input()) + 1)
B
取るべき合計点から現状の合計点を引く。
それがK(満点)以上なら不可能なので-1を出力。
0以上ならば該当する値を出力。
負の値(すでに超過している)ならば0を出力。
C
AC出した後にWAを提出する謎の行動を弾き忘れ2回WA。
あとは別にフラグ管理していれば良いかと。
今回は、n個のフラグを用意し、WA回数を記録していくことにした。
ACが出たら現状のフラグ(WA数)をペナルティに加算、フラグを-1にセットする。
正解数は、フラグから-1の数を数えれば良い。pythonならcountで一発。
それか別に正解数カウント用の変数を用意してもいい。
D
マップが小さいことからワーシャルフロイド法レベルの計算量まで耐えられると判断。
隣り合う「.」のマス同士の距離を1として初期化を行い、ワーシャルフロイド法ですべての点と点の距離を計算する。最終的にinf以外で最大の値が正解となる。
最初のWAの後、.のマスのそれ自身との距離を0にセットする初期化を追加することでACできたが、なぜそうなったのかがわからない。
E
大きな数の組み合わせを連続で計算する問題であるため、MODの逆数を利用する。
あとは、K個の値の最小値がa[i]になるパターンが何通りあるかを計算し、a[i]と掛け合わせたものを足していけば最小値の合計が求まる。最大値の合計も同様にしてもとめられる。
その個数は、i = 1とすると、のこりn-1個からk-1個を選ぶことになる(1個目は必ず選択するため)。ここで、i = tとすると、n-tCk-1となる。
念の為k=1のパターンを除外して提出し、AC。
F
典型問題だなと感じたが、うまいソースコードがみつからなかった。
答えとなる円は、ある2点を直径とする円か、ある3点の外接円のいずれかである。これらのすべてについて内包を判別し、最小値を計算すればいいらしい。
外接円の求め方は適当に探せば出てくるはずなので、そこに気がついていれば自力でたどり着けたかもしれない。
ABC147
危惧していたことが起こりました。
難易度が以前のとおりに近くなったため、普通に4完でとどまってしまい、レートを下げることになりました。とはいえ-6なので一応耐え。
A:足して22と比較する。
B:文字列の先頭と末尾から1つずつ比較していく。
C:
正直者か不親切かを01のビット列にして、0~2^N-1までを探索する。
正直者である場合のみ発言を精査し、その回答と合致しているかを見る。
すべての発言に整合性があった場合、ビット列内の1の数をカウントする。
ここまでは簡単(Cはサンプルの出力で間違いに気が付いたので危なかった)。
D:
計算量的に、すべての組を計算することはできない。過去のXOR系問題の経験から、各桁ごとにビットの個数をカウントしていくという方針がまず思い付いた。
ここで、XORで1のビットが立つ組み合わせを考えたところ、(該当の桁が1であるAの個数)x(該当の桁が0であるAの個数)で求められることが分かった。
従って、各桁ごとに1の数をカウントし、それをxとしたとき、Σ_{k=1}^{59}(n-x)*x*2^kで表されることがわかった。
後は適当に組んで完成・・・と思いきやPyPyでTLE。
今回のパターンではPython3にしても早くなるとは思えなかったので、無理矢理C++で書き直してなんとかAC。
ここからは後日解いた分。
最初は各桁の1の個数を新しい配列に格納していたが、これが遅いと考えられたため、1-59のループの中でAiを1-nまで見る、というループに書き換え、Ai%2をxに足し、Aiを2で割るという処理を繰り返すことにした。
これによりメモリアクセスが軽減されたのか、PyPyでACできた。
E:
解説の通り、順番に見ていく。幅優先探索ではなく、全マスを順番に見ればよいため単純なh*w回のループを書けばよい。
これもPyPyでACできなかったのでC++で書き直してAC。手元の環境だとbool dp[80][80][12801];を宣言したところでSegmentation Faultが出たがコードテストだと問題なかった。原因は配列のサイズだと思われるが、なぜ違いが出たのかは調べておこう。
それとPythonでなんとかする方法も。こういうところで甘えているから伸びないんだなあと感じる。
F:
解説の意味を理解するのに時間がかかった。
まず、高橋くんがK個取る場合にありうるスコアの種類について考える。
具体的には、解説でいうところのX*K+D*Iとなり、このIのとりうる値をカウントしていけば良い。
ここで、X*KをDで割った余りについて分類するという話が出てくる。これはどういうことかというと、たとえばX=3、D=2とすると、3,5,7,9,11,13...と3以上の奇数が該当するわけだが、たとえば5,7,11,13と取った場合、36だが、9,27と取った場合でも、同じく36となる。このように、Kの値が異なるが、Sの値がおなじになるパターンが存在しており、それを排除してやる必要がある。
これを回避するために、X*K'%Dが、既出のKについてX*K%Dと同じである場合、X*K'=X*K + X*(K'-K)と変換することで、X*Kを基本とするパターンに合致させることができる。
この時、解説通りの方法で求めたIの範囲をL<I<Hとすると、L=L+X*(K'-K)/D、H=H+X*(K'-K)/Dとすることで、正しい値の範囲に変換することができる。
あとはそれらの範囲(L,H)をリストに入れてあげて、ソートした上でLの小さいものから順番に見ていけば、答えを求めることができる。
実装にはdictを利用したので、Python3で提出して無事AC。