(初心者)【色変記事】某国支社長61歳文系、AtCoder入茶しました!!
タイトル盛りぎみ。10人少しの小さな支社 + 帰任決まりました( ;∀;)
自己紹介
経済学部卒。某中堅電子部品メーカーに入社後ずっと営業畑(向いてない)。3か国目の駐在からもうすぐ帰任。生きがいは現場業務のデジタル化!紙嫌い(=社内資料の話。本は好きです)・Excel好きだけどネ申Excel嫌い。触ってきたのはほとんどスクリプト言語(現場なので。VBA、PERL、PowerShell、Python等)。
モダンExcel(パワークエリ・パワーピボット)社内布教活動中。別途記事書きます。
AtCoderを始めたきっかけ
自分と同じくプロITでない文系おじさんがプログラミングに挑戦するという日経クロステック連載「大森敏行のプログラミングで行こう」が好きで毎回楽しみなんですが、筆者の大森さんがAtCoder挑戦を諦めたとの記事を読んで、じゃあそこだけ勝てるかも?と、こじらせ推しっぽい気も。まあもともとVBAとかのコーディングは好きでした。(話それますがPython始めてからVBA配列の不便さにいまさら悶絶してます)
環境
Windows10(新PC欲しい)・Python3・VS Code
ローカルで実行できる環境があるとやっぱり便利です。
コンテスト参加時はVSCで3ファイル開いてます。
- メインのmyCode.py:提出コードをここでコーディング
➡ ローカルPythonでサンプルテスト
➡ OKならここから提出フォームに貼り付け - Jupyter Lab:覚えきれてないライブラリ関数の引数を確認したり、ちょこちょこ実験するのにメインのコードをグチャグチャにしたくないので VSCのJupyter Labプラグイン側でやってます。あとA問題➡B問題➡・・・と移る時に回答済みの提出コードをこっちにコピペして記録も。
- 入力サンプル貼り付け用ファイル:下で説明しますが、サンプルをローカルで試験実行するときに、標準入力の代わりに①コードの上にコメントの形で貼り付け、か②ファイルから読み込み、を使い分けてます。
よくある2行入力(N=数字一つ、A=数列とか)の時は①ですが、メインファイルのコードの上に貼るんで、行数が多いと貼り付け・実行が面倒になるので別ファイルに貼り付けてます。
入茶時の状態
A・B問題: 速解き頑張る(たまにBでハマる)
C問題: 5~7割くらい解ける。ここで時間使い切る。
D問題: 本番中解けた事一度もなし!(➡ ABC392-Dで初めて本番中AC出来ました)
AtCoder Novistepsで言うと4Q~3Qですね. 5Qだと簡単、3Qは難しいけど3割~5割くらい解けるかも、そんな感じです。NoviStepsは自分のレベルがよく分かってありがたいです。
覚えた・ とりあえず使える |
覚えてない・ 使えない |
|
---|---|---|
データ構造 | リスト、set、 dictionary、deque |
Union Findとか セグ木とか何それ。 |
アルゴリズム | 全探索・貪欲法・ bit全探索・累積和 |
BFS/DFS・恐怖のDP・ 「〇〇法」全般 |
ライブラリ(Python) | itertools, collections, bisect |
まだ複雑なアルゴリズムを知らないので、C問題以降で「愚直にやったらTLE確実」といった時は dictionaryに頼ることがとても多いです。あと後述しますがライブラリで挙げた最初の2つは本当に良く使います。
入茶に役に立ったもの・こと
ABC参加を続ける!
皆さん言っているようにたぶん一番大事(最近これだけに・・・)。仕事が忙しいと平日精進する時間も気力もなくなったりしますが、土曜の夜さえ何とか空けておけば続けられます(灰色当初は2完でもレート上がってくのでモチベーション上がりやすいし)。
過去問
基本これですね。AtCoder Problemと AtCoder NoviStepにはお世話になってます。作成者の皆様ありがとうございます!
ただ最近さぼって本番参加オンリーになってきてます。 いかん。
ローカルでサンプルテスト
こういう風にサンプルケースを直接貼り付けて試すと便利1。 「_INPUT = """\」から「"""」の間にサンプルケースを貼り付けて([Ctrl]+[F5])すると、そこを標準入力として実行します.(参照元URL失念しましたすみません)
import io, sys
_INPUT = """\
2 3
10 5 7
"""
sys.stdin = io.StringIO(_INPUT) # Input from above _INPUT
# sys.stdin = open('D:/もにょもにょ/input.txt', 'r') # Input from file
N, M = map(int, input().split())
...
"sys.stdin = open("ファイル", 'r')の方のコメントを外すとファイルから読み込みます。
入力行が多い時はこっちが便利ですね(毎回input.txtをセーブしてから実行、を忘れずに)。
VS Code/Pythonの「デバッガ」
これAtCoder入門記事などであまり触れられていない気がするので強調したいですが、めちゃ重要だと思います。自慢にならないけど自分のレベルだとけっこうB問題でも使います。
コードに変数の中身確認用 print 文いくつも入れている皆さん print()消し忘れて提出して、せっかくロジック合ってるのに無駄な WA 喰らった事ありませんか?(自分は何度もあります) print文の代わりにデバッガ使いましょう!(後述のAtCoder Easy Testも併用で)
ここからF11でforループの中を一行ずつ実行、変数の中身がどう変わるか見たりできます。
ライブラリ(Python)
本来筆頭に挙げるべきかもしれません。自分はPythonで参加していますがこれまで以下のようなライブラリに助けられてきました:
itertools (combinations, permutations, product など)
何度もACをくれた神ライブラリです。二重三重ループ避けたい時とか、bit全探索とか。
以下分かりやすかった記事です:
Pythonで競プロをやる時にそこそこ使う書き方(itertools編)
collections (defaultdict, Counter, deque など)
dict[a] += 1 でキーaが存在しない時エラーになる対策が面倒なので defaultdictはよく使います。
Counterは数え上げ結果を辞書形式で持ってくれて便利です。dequeは・・・まだBFSが実装できないので使った経験ないかも。
分かりやすかった記事:
競プロでも使える Python の便利な標準ライブラリ Tips
itertoolsとcollectionsの両方を詳しく解説してくれています。
X/Twitter
周りに競プロerいなくてもXにはたくさんいて嬉しい・・・ただ先人たちが書いているようにXで活発にポストしてる人達は上澄みなので、レーティングや解けなかった問題の差とかは気にしちゃダメです。当初は「大負け5完」とか上級者のポストを見てると、自分などがポストして良いのかと悩みましたが、気にしなくなりました。
とはいうものの上級者にお願いです(上級者はこの記事読んでないと思いますがww)。
「5完!負け」はともかく「5完!俺馬鹿だ」とかはできれば勘弁してください・・・下方にたくさんの庶民がおります。
スクリプト
AtCoder Easy Test (Chromeプラグイン)
(v2 になってますね)
サンプルコピーしてローカル実行➡ OK!➡ 提出 ➡ あれ全部WA??(デバッグ用 print()文を消し忘れていた)という悲劇が何度かあったので大変助かってます。インストールすると通常の「提出」ボタンの横に「Test & Submit」と「Test All Samples」というボタンが追加されます。
この「Test & Submit」ボタン、「サンプル全件通ったらそのまま提出・通らなかったら提出中止」を自動的にやってくれるんです。素晴らしい! 作者様本当にありがとうございます。
最近は速解き重視でA問題とかだと直接提出していますが(時々ジャッジが遅いのと、デバッガ使う事が増えてprint文あまり入れなくなったこともあり)、C問題以降は必須。
(2025/03/23追記:ABC398のA問題で直接出したらサンプルも合ってなかったという大ポカやらかしました。初心者はやっぱりA・B問題でも Easy Test経由が良いかも)
エディタのダークモード(素人視点)
営業現場(≒ VBA界隈?)では コード背景って白だと思ってたり思ってなかったり(自分は思ってました)・・・デフォルト白なんで。 そういえばPowerShellのISEも白地ですね。
素人的には、プログラマーの方々がダークモード使ってるのを見て、なんか画面見づらそうだなぁ、 単にカッコつけてるのかな? とか失礼な事を思ってましたが、ふとした機会に自分でVSCをダークモードにして気付いたのは 予約語とか()とか変数の色分けがメチャ見やすい!
あまり居ないかもしれませんが初心者でエディタ白背景で使ってる人がいたらダークモード、お勧めします。
その他
実戦でWA出た時に自分でコーナーケースを考える・作るのは役立ちました。N=1とか。
ABC396 - C Buy Ballsでは WAx4が出た理由が分からずローカルで色々あやしい入力を試してみて、入力が下記の時WAになるのを発見できたので、対策を立てACできました:
2 2
5 -100
-100 -100
競プロやって良かったと思う事
アルゴリズムとかまだよく知らないのであまり言えないのですが、例えば比較的入門編の「累積和」を知った時に大感動しました。なるほどその手があったか!と。大げさに言うと人類の叡智に触れてる感ありますね(競プロというかアルゴリズム勉強の話かもですが)。
あと単に楽しい。
コンテスト終了後の楽しみ
当日は終了直後感想をXに投稿したり、他の参加者の投稿見たり。翌日以降はYouTubeの実況放送を見るのが楽しいですね。推しは岩井星人さん。AtCoderがちゃんとエンタメになっているのが素晴らしい。最近(2025年3月)入水間近で、運上人になってしまいそうなのがちょっと寂しいです。
運上人といえば、こたつがめさんの実況は凄すぎてギャグの領域に入ってます。自分が100分間苦しみぬいて解けなかった問題を、軽やかに語りながらほんの数分で解いてしまうのを見る魔界体験、あまりのスピードに声を出して笑っちゃった事も実際あります。
その他
レーティングについて
1年しかやっていませんが、最近全体にレベル上がってないですか?
茶色だけど文系非ITのおっさんとしては頑張ってる方のはずだ!・・・と自分に言い聞かせてます。
今後の予定
帰国後シニア社員としてなんと本社IT部門に受け入れてもらえました。自分のランク(茶)について「非ITのおっさんとしては」と言い訳できなくなるのがつらいかもですが、引き続き認知症予防も兼ねて頑張ります。
しかし緑は遠い・・・ そろそろ名前有りアルゴリズムちゃんと練習しないと!
追伸:
色々勝手にリンクを張っちゃっておりますが、もし問題ある場合ご連絡を頂ければすぐ外します。
-
ただ上級者のYouTube見ると、ターミナルに直接貼り付けて入力にしている人が多いようなので、そっちが良いかもしれません(m模索中)。 ↩