メモやらログやら

考えたこととかメモする

自分向け競プロ手順書

コンテスト中のミスが目立つので、解くときの手順書を用意した。
個人的に、以下のミスが目立つ

  • 問題を読み違える
  • 制限を見忘れて、方針を間違える
  • typoや使う変数を間違える
  • ミス→焦る→ミス の無限ループ

実装に入る前

  1. 手はキーボードかメモ以外に置かない(机の上から手を下ろさない。関係ないことをしない。集中力を切らさないためには意外と重要)
  2. 問題を読む
  3. 条件(制限)を見る
  4. 入出力例をみる
    • ここまでで問題で何を問われているかを理解する
  5. 解法のロジックを考える。ここでは愚直解を考える。
    • ここで重要なこととして、問題の理解があっているかを確認する。ここで問題が理解できていないと、これ以降で全て意味がなくなるため。
    • 愚直解の出し方が分かれば、自作のケースの正誤判定に使えるので、愚直解は必ず考える。
    • また、制限などからボトルネックを見つけ出す。(愚直解だとO(N2)なので間に合わない~とか)
    • 図+文章でメモをとる&とったメモは残す(実装後に理解が間違ってるとか気付くタネにするため)
  6. 制限などから解法を考える。
    • 重複するが、図+文章でメモをとる&とったメモは残す
    • 小さいケースで、処理を一つ一つ丁寧に見ておきメモを残しておくと、デバッグの時に使える
    • テストケース以外に、扱いやすい例やコーナーケースも自作し、そちらでもロジックを考える/あっているか試す。自作ケースの正誤判定は上で求めた愚直解が使える
    • N=1,2,3,...のようにある変数について、いくらかの程度の範囲で確認し、規則などが見つからないかも確認
    • 提出用のコードではなく、規則発見用のコードは書いてもよい

実装中に気を付けること

- 空白行を入れすぎない(視界に入る量が減るので、ミスを身をとしやすくなる)
- 不要な変数を残さない(間違えて使ってしまうのを避けるため)
- 同じような変数名を複数使わない(補完でバグらせることがあるので)
- このへんをきちんと意識しないと、デバッグの時にうまくいかなくて、全部書き直しとかやりがち
- インデックスについて、毎回-1するような実装にしない。事前に引いておく。多くはindex out of rangeになるが、ならないと見つけるのが面倒な場合がある

実装がおわったらデバッグ

  1. 使ってない変数などは削除する
  2. まずはテストケースを流す
  3. 問題なければ、答えが明らかな自作ケースを流す
    • こちらもある程度連続した範囲を試す。
  4. 提出前にデバッグ用のprint等を削除する/コメントアウトする

想定する出力がでてこなければ

  1. 実装前のメモを見直し、やりたいこと(問われていること)の理解が問題とあっているかを確認
  2. 問題がないのであれば実装が間違っている。次いで、メモを見直してロジックを確認する。
    • 注意点は実装前と基本同じ。
    • ここで注意したいのが、焦らないこと。提出前位に問題が見つかって良かったと考える。
    • 手はメモかキーボードの上。水を飲んだりリラックスして焦りを解消するのもあり。
  3. ロジックに問題なさそうなら実装を確認する
    • インデックスが間違ってないか
    • 使う変数を間違ってないか確認する。特に不要な変数を残していたり、似た名前の変数を複数使ってエディタの補完で間違える、というのをやりがち。
    • サンプルとprint文で、想定の処理の流れになっているか確認する。これをやるために、解法を考えるときのメモをみる
      • 提出前に消すこと

提出後WAだったら

  1. 焦らない。ここでも手はキーボードかメモ以外に置かない。水を飲んだりしてリラックス。
  2. WAの数などから、ロジックがそもそもあってないとか、部分的な想定の漏れがあるかなど候補を挙げる
    • テスト+いくつかはACだが、少なくない数がWA:ロジックが部分的に間違っている or 考慮漏れのケースがある。
    • サンプルケースを増やしてデバッグする。一部の変数を固定&残りの変数を頭から動かしてみていくなどするとよいかも。
    • 全ケースWA:デバッグ用の出力がのこっている可能性大
    • 少数のケースのみWA:コーナーケース漏れ
  3. デバッグで変数の値を動かしたりして、手で解いた時の解と一致するか確認する。
    • 愚直解を利用して、自作ケースの解が間違っていないか、もう一度確認する
    • 連続値以外にも、飛び値も入れてみる。MODの忘れなどが見つかるかもしれない