競プロ

競プロやるなら怠惰にテンプレ使え!

こんにちは、チズチズです。

競プロを解くときに大多数の人はPythonでは無しからC++等ではmain等のみでしょう。

ですが、テンプレを使えば書くコード数も処理速度も速く出来るんです!

ここからはPythonでの話をします。

テンプレの必要性

テンプレのコードには基本的に2種類あります。

  • 長いコードをまとめたコード
  • 処理速度を上げるコード

今までのはまだ数十文字が数文字になるだけですが、Union-Find木にでもなったら数百字が数文字になります。

特にAtCのA~B問題まではいかに速く解くかが鍵になります。

だからこそテンプレを使って速く解くことを心がけるようにしています。

テンプレに何を書く

テンプレに書くことが思い付かない人が多いでしょう。

GitHubに僕のテンプレ置いてあるので暇だったら見ていって下さい

僕のテンプレ

入力での話

標準入力の取得って

int(input())、map(int, input().split())

等がありますよね。

特に後者の場合、文字数多くて書くの大変ですよね

そこでそれを関数に予め定義しておけば関数呼び出しのみで入力を取得して返ってきます。

この場合は長いコードを短く書かせる事ができます。

例としてはこんな感じです。ILを呼べば取得してくれます。

 

次は、処理速度の問題です。

Pythonでの処理はC++等の言語に比べてとても遅いです。

つまり、処理速度を上げるコードを書くことも優先されます。

Pythonでは、単純にinput()するより

sysのreadline()の方が速く処理できます

しかし、sysの方を使うと必然的にコード数は増えてしまいます。

そこでテンプレです!

テンプレ(関数)に書いておけば呼び出せば入力を取得してくれます。

テンプレの技

ここからがメインになるかもしれませんね。

では、テンプレにおいて使える技等を紹介します

オブジェクト指向

オブジェクト指向 この言葉聞いたことはありますか?

追加しようと思ったら簡単に追加できたり消そうと思えば簡単に消せたり

Pythonではクラスに当たります。

クラスを書いてもそこまで遅くなることはありません。

逆に関数を使わない方と使う方では後者の方が処理速いんです

このようなコードがあったとします。

このように、関数で実行した方とそのまま書いた方で処理速度を比べると関数の方が速いです。

今は単純なものですが、これが複雑な処理になるともっと差は開くでしょう。

つまり、ベタにコード書くよりテンプレがある方が処理速度も書きやすさもアップするんです

sysの話

入力の取得はsys.stdin.readline()がとても速く処理できるということは結構有名です。

しかし、半分以上の人は使っていません。

なぜでしょう?

文字数が増えてしまうからです

例えで int(input()) をsysでやってみます。

インポートも必要だし関数名も長いし… 競技中にそれを書いてては時間がもったいないです。

だからテンプレを使って短縮させます。

これは今使ってるテンプレのクラスの冒頭ですが、変数の定義においてsys…をinputに定義しています。

そうすることで、クラス内の関数でも各々sys…を書く必要が無くなります。

クラスに入れたら呼び出し面倒だし時間食う

そうですよね。実際そうです。

しかし、短縮させることは出来ます。

この関数に処理を書きますが、予め呼び出しておけば簡単に書けます。

メイン処理においても短縮

このようなコードですが、rはrange、eはenumerateのように長い関数を1文字にさせます。

使うときは

このように1文字で書くことが出来ます。

enumerateとかなんか書いてる暇あったら考える時間増えるので、1文字にして簡単に使えるようにします。

コメントを上手く使う

テンプレってただ呼び出しだけに使うものではありません。

その関数を参考に自作関数を作る参考書代わりにもなります。

コメントがあった方が読みやすいですし、入力と返り値もわかりやすいです。

人が見るにも自分が見るにもわかりやすくて手直しが簡単です。

コメントは上手く使って下さい!

下手にズラズラ書くのも読みづらくなってしまいます。

テンプレの上手な使い方

AtCoderのコンテストにおいての上手い使い方を自分流で説明します

A問題

入力のテンプレで入力取得で周りとの差を付ける

B問題

入力も速くした上で、r=rangeを使ってループを速く書く

必要に応じて昇順ソートのテンプレも使う。

C問題

探索系、全列挙などがあるので、それらのテンプレを使用します。

場合によっては、対応してないことがあるのでテンプレを参考に自作関数を作ります。

参考になる関数があるので、無いよりかは速くコードが書けると思います。

D問題

まだ僕は解けませんが… Union-Find木などの木の関数、クラスを予め定義しておいて思い付いたら書く等ですかね

D問題になると処理が増えるので、コード数も必然的に増えます。

そこで、予め探索系のテンプレを使うことで、正解まで辿り着く時間も速くなるでしょう。

テンプレと親しくなるには怠惰になれ

テンプレは追加が簡単ですし、思い立ったらテンプレ追加する事ができます。

テンプレは関数なので、使わない時は処理されませんし無いよりかは無駄ではありません。

練習で問題を解いてループとか探索の処理をしたと思ったらその処理についての理解を深めてテンプレに追加してみてはどうでしょう。

次いつか使う時が来るかも知れませんし、参考にもなります。

しかし、真面目になるとそれは変わります。

コードが長くてもそれが普通と思うようになり、テンプレにするべき処理をテンプレにせずに1回目、2回目、3回目…も処理を書いてしまいます。

怠惰になって下さい!

rangeもそうですが、これ長いなと思ったり次使えると思ったら即テンプレ追加してください。

僕の目標

  • テンプレだけで1万バイト超えること(どうでもいい
  • テンプレ使ってD問題解く
  • コンテストで最速解答
  • 布教

現在のテンプレ

これからもテンプレに関数を追加し続けます。

競プロをやり続ける限りは…

お読みいただいてありがとうございました

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です