見出し画像

競プロに役立った業プロ知識5選

趣味で競技プログラミング(以下競プロ)をやっていた学生がエンジニアとして就職し業務プログラミング(以下業プロ)を始めて一年弱経ちました.

特に学生の方など,業プロってよく聞くけど実際競プロの役に立つの?と思っている方も多いのではないでしょうか.
そこで今回は実際に業プロを経験した私が,これまで業プロで学んだ知識から競プロに役立ったものを5つ紹介しようと思います.

この記事は#バレンタインアドカレ 14日目の記事となります.

Ctrl + A

ターミナル上で行頭に戻るショートカットです.
学生の頃からターミナル上で使えるいろんなショートカットがあるのは知っていたのですが,なかなか覚えられず毎回左矢印を叩くだけの日々でした.
現在も会社の人から教わった Ctrl + A しか覚えていませんが,これだけで長さ $${n}$$ のコマンド上を移動する際の打鍵数が最悪 $${n}$$ 回から $${n/2}$$ 回程度になり約二倍の高速化になりました(⚠️ 競プロ脳の人向けの注意:二倍はすごいです).
そもそも競プロでターミナルに長い文字列を打つことはほぼない(私の環境だとコンパイルや実行など主要なコマンドはすべて alias で一文字にしている)のですが,ヒューリスティックコンテストなどでたまに重宝している気がします.

高速カーソル移動

会社の人の画面を見ているとターミナル上でのカーソル移動がやたら速い人がいました.
確認すると,Mac は設定から簡単にカーソルの移動速度を弄れることが分かりました.

おそらく Mac はボタンを $${t}$$ 秒以上長押しすると以降は $${1}$$ 秒あたり $${k}$$ 回の連打として扱われる仕様になっており,この $${k}$$ の値を設定しているのではないかと推測しています.
これにより Ctrl + A 以外のショートカットを覚えられない人間でも爆速でカーソルを移動出来るようになりました.
ついでに同じ設定画面から上記 $${t}$$ の値も小さくしました.

私はやっていないですが,ターミナル上から設定することでシステム環境設定の上限値を突破出来るらしいです.

フォーマッタ

コードの体裁をエディタが自動で整えてくれる機能です.

今までは以下のようなスペースが入っていないコードをずっと書き続けていたため,むしろスペースの入っているコードの方が読みにくいと思っており,フォーマッタの必要性を感じていませんでした.

for(int i=0;i<n;i++)
  std::cout<<i*i<<std::endl;

フォーマッタ に 慣れて いる 人 から する と スペース が 入って いる 方が 読みにくい と いう の が イメージ しにくい かも しれません が note が 一記事 丸々 こんな ふう に 書かれて いたら 嫌 です よね ?

また,自分の中でインデントやスペースを入れる箇所などに関して多少のオリジナルルールが出来てしまっていたこともフォーマッタを敬遠する理由の一つでした.

しかし業務では他の人にもコードを読んでもらう機会がある都合上会社が定めたフォーマッタを使う必要があるため,自分の感覚を統一するため現在は競プロの環境にも会社と(ほぼ)同じフォーマッタを導入しています.

結果としては導入して非常に良かったなと思います.
最初こそ見慣れない書き方になってしまい自分の書いたコードの読解にすら苦労しましたが,一ヶ月程度で完全に慣れてしまったので現在は読みにくいと感じることは一切ありません.
速度を重要視する競プロではしばしばコードを雑に切り貼りすることもあり以前はインデントがぐちゃぐちゃになることも多かったのですが,現在はそれがすべて自動で正しく修正されており,もうフォーマッタが無い環境は考えられなくなりました.

また,以下の記事に書かれているように思いの外自分ルールをカスタマイズ出来る点も嬉しかったです.

例えば競プロ御用達の REP マクロなどが for 文と同じインデントルールに従うような設定をしています.

// デフォルトのフォーマッタ
REP(i, n)
std::cout << i * i << std::endl;

// REP について設定をしたフォーマッタ
REP(i, n)
  std::cout << i * i << std::endl;

GitHub

元々ライブラリ管理に GitHub を使っていたのですが,単にコードをインターネットに保管するツールとしてしか利用できておらず,たまに操作を間違えてリポジトリを壊滅的にする日々でした.

業プロで branch や github action の概念を完全に理解した現在は,操作を間違えても reset や status などの各種コマンドを用いて自力で元に戻せることが多いですし,各種ツールの理解度も上がりました.

近々社外に向けたコンテストを開く予定なのですが,その時の入力生成や想定解のコード管理も GitHub でおしゃれに行うことができました.

余談ですが Git 周りをグラフ理論など競プロで馴染みのある言葉で説明してくれる記事があると嬉しかったかもしれないなと思っています.
実はもうありそうな気もしますが,僕もそのうち書こうと思います. 

簡単な Python の知識

業プロでさまざまな言語に触った結果,Python が少しだけ書けるようになりました.
現在私の環境は1コマンドで「compile + sample 実行 + library 展開 + clipboard 格納」を全部行うなど,競プロ用の便利スクリプトが数種類あるのですが,こういった便利なものなかなか競プロの C++ 知識だけでは書くのが難しいと思います.
解答コードを Python で書くことはほとんどないですが,自分の環境の最適化という面で非常に役に立っています.

終わりに

週40時間勤務を一年弱続けた割には寂しい内容ですね.
これなら普通に競プロの問題を解き続けていた方が明らかに有意義です.

仕方がないので退職しますと書きそうな流れですが,諸々の事情(金とか)でそれも難しいため,最近社内で競プロ勉強会を勝手に始めてみました.
社内勉強会と言いつつ connpass 経由で社外にも公開しており,会社の宣伝になるなどの理由から業務時間内での資料作成 + 発表を許されています.(そもそも社内勉強会が推奨されている会社なので社外公開関係なく許されるのかもしれませんが)
業務時間に競プロをやってしまえば全部解決じゃん!というアイデアを形にしてみた感じですね.
僕が隔週火曜の 20:00~21:00 に好きなアルゴリズムやデータ構造を Discord で語るだけの気楽な会なので(社外からの参加人数が少ないと廃止させられるかもしれないので)暇な人は覗きに来てください.

次回は 1/30 に UnionFind の発展・応用について喋る予定です.

他にも最近だと上でも述べた通り1月27日 13:00~16:00で社外向けにコンテストも開く予定です.
ギリギリまで参加登録受け付けています.
豪華商品
も出ます.
採用にもつながる
かもしれないです.

といった感じで,今後も業務に競プロをねじ込む運動をガンガンやっていこうと思います.
この運動を手伝いたい方はぜひ入社してください.

この記事が気に入ったらサポートをしてみませんか?