Dockerを使って競技プログラミング用環境を構築

この記事では、dockerを使って競技プログラミング用の開発環境(C++Python)を構築する方法を説明します。ソースコードは、こちらに載せています。

ブログを書いている本人がDockerにあまり詳しくないため、間違っているところがあればごめんなさい><(指摘してくれると嬉しいです。)

 

環境

Windows10、VSCode

手順1: Docker Desktopのインストール

以下の記事を見ながら、Dockerのインストールを行います.

WSLも使います.

*以前環境構築をしたときに参考にした記事を載せているので、うまくいかない場合は他の記事を見てみた方がいいかもです。

手順2: 各種ファイル設定

以下に沿って競技プログラミング用の作業ディレクトリを作っていきます。こちらの記事を参考にしました。

手順3: イメージ・コンテナ作成


$ docker-compose build 
$ docker-compose run dev

二回目以降は、

docker-compose run dev

のみ実行すればよいです。

上手くいけば以下の様にC++Pythonを実行することができます。

実行画面

 

手順4: VSCodeでの設定

ここまでで一通り、環境を作ることができました。

最後に、こちらの記事を参考にしつつ、VsCodeでの設定を行っていきます。

VSCodeで、拡張機能「Remote-Containers」をインストール

2個めに表示されている拡張機能をインストールします。

Open Folder in Container をクリック

VSCodeの左下の緑色のマークをクリックして、「Open Folder in Container」をクリックします。

左下の緑色のマーク

途中でどのような環境を構成するか聞かれますが、Pythonで進めていけば大丈夫だと思います。起動できたら、「.devcontainer」というフォルダが出来ていると思います。

必要な拡張機能をインストール

C++Pythonに関する拡張機能をインストールします。以下の手順で追加できます。

  1. 拡張機能を検索(例:「C++」)
  2. 拡張機能にマウスーソルを合わせて右クリック
  3. 「Add to devcontainer.json」をクリック

上手く追加できない、場合は「表示→コマンドパレット→ウィンドウの再読み込み」をするといいかもです。

ACL、Boostのパスを追加

.vscode/c_cpp_properties.jsonを開いて、includePathを書き換えます。

以下を追加してください。

"${workspaceFolder}/work/atcoder/", "${workspaceFolder}/work/boost/"

コード実行

後は、いままでと同じようにコードを実行できるようになると思います。

コードランナー等の拡張機能は設定が引き継がれていると思います。

以上です!

 

読んでいただきありがとうございました!

astherier.com

 

astherier.com

 

github.com

 

 

入水しました!

はじめに

11月20日のABCで無事入水できたので、いつか誰かの役に立てばいいなと思い入水記事を書かせていただきます。

緑色になった時のスキル

一応緑色なった時点でのスキルは

  • BFS,DFS:時間をかければ書ける
  • UnionFind:知っているけど、コンテストで使ったことはない
  • 簡単なDP(ナップザックまで):時間を書ければ書ける
  • 難しめのDP(ナップザック以上):解説を見ても理解することが難しい
  • 累積和:スムーズではないけど書ける
  • ダイクストラ:知っているけど使ったことがない
  • ワ―シャルフロイド:書ける
  • modint : 持ってて、使うことができる
  • 二分探索:よくバグらせるけど、時間をかければ書ける

くらいであったことを書いておきます。

緑色から水色になるために効果的だったもの

勉強法

灰~水diff埋め

一番記憶に残っているのは、Ratedコンテストの灰~水diffを全て埋めたことですね。ある色を全埋めするという目標を立てると、苦手な問題にも取り組む必要がでてくるので個人的にはおすすめです(ある人の受け売り言葉ですが)。

ゆきこの算数タグ埋め

特殊な例かもしれませんが、ゆきこの算数タグを埋めたのは力になった気がしています。僕は算数問題に割と苦手意識があって、例えばABCのA問題でたまにO(1)で解ける問題を解くときに、繰り返し処理を書いちゃうようなタイプです。緑コーダになった後でも、たまに算数問題で引っかかって大きくレートを落とすことがあったのですが、最近は前よりも減った気がしています。ゆきこの算数タグにはARCのAに出てくるような算数問であったりとか、ABC-Cででそうな問題が多々あるのでお勧めです。

EDPC埋め

DPに対する苦手意識がかなり軽減されたのが大きな貢献だと思っています。

登場するアルゴリズムを全て身に付けられたかどうかには、僕の精進不足もありかなり疑問符がつきます。けれど、これまでにナップサック問題にも割と苦手意識があった僕にとっては苦手意識を減らすという意味でものすごく良い経験になりました。埋める際に分からない問題があっても、フレンズさんの解説記事があったり、最近では競プロyoutuberのかつっぱさんが解説動画を公開されていたはずなので、EDPC埋めをしやすい環境が整っているかと思います。

www.youtube.com

アルゴリズム

セグメント木、遅延セグメント木

緑色から水色になるまでに覚えたアルゴリズムで、コンテストで使用したのはこの2つだけだと思います。この2つのおかげでABC-D問題あたりで想定解じゃない解法で通すことができました。色々な問題に使えたりするので、覚えておくとどこかで役に立つ機会がきっとあると思います。

解説を見るタイミング

基本的には灰~水diff埋めをしていた時は30~40分考えて何もわからなければ解説を見ていました。ちなみに現在青diff埋めをしている際は、1時間考えて分からなければ解説を見るようにしています。

印象に残っている問題

印象に残っている問題はたくさんあり、なかなか一つに絞ることは難しいのですが、一つ上げるならPondです。コンテスト中に通した最高diff(1622)で時間ぎりぎりにACできたので印象に残っています!

atcoder.jp

最後に

最後まで読んでいただき、ありがとうございました!

【自己紹介】はじめまして

はじめに

はじめまして、せいゆうです。

まずはこちらの記事にアクセスしていただいてありがとうございます。

今回は初投稿ということで僕の自己紹介とか、プログラミングとの関わりだったりを簡単に書いていこうと思います。ブログ初心者なのでどうか温かい目で読んでくれると嬉しいです(笑)。

自己紹介

現在、大学院の一年生です。

専攻としては情報理工学専攻というものを専攻しています。ところで、情報理工学ってなんですか?と聞かれると端的に説明できる自信がないです(笑)。研究分野も多岐に渡っていて、いわゆる競技プログラミングにすごく近いこと(文字列アルゴリズムとか離散アルゴリズム)をガチガチにやっている研究室もありますし、セキュリティの研究をやっているところもあれば、深層学習、ロボティクスとかをやっているところもあります。

僕自身は「ラーニングアナリティクス」と呼ばれる分野の研究に携わっています。

ラーニングアナリティクスはどういう分野か、を一言で表現すると"情報通信技術を用いて教育現場からデータを収集、分析してそれを教員、学生にフィードバックすることで教育に貢献する分野"になります。長いですね(笑)。最近だとデジタル学習教材とか授業の出欠管理をインターネットで行う大学もあるので大学生の方とかだとピンとくる方もいるかもしれません。研究領域はかなり色々ある(成績予測や教材推薦、教育用ダッシュボード開発)のですが、僕は「学習者同士の教え合い、学び合いをいかにしてオンライン上で実現するか」を大きなテーマとしてあの手、この手を使って課題解決に取り組んでいます。教員の方と研究方針を話したり、雑談をする中でも日々あたらしい学びがあったりするので楽しく毎日を過ごさせていただいています。このブログも書いている今日も、今まで道具として使ったことがなかったモデルを勉強することになりそうで、不安とわくわくがせめぎ合っています(6:4くらいで不安の方が勝っています笑)。どのような大学院生活を送ろうとも、あと一年で学生という身分からは離れることになると思うので、悔いが残らないように頑張りたいと思います。

 

趣味についてですが、最近家に帰るとTwitter競技プログラミングをしてねるみたいな生活ばかり送っている(怠惰か?笑)のでこの二つがいまは趣味みたいになっちゃいます。これを機にブログを趣味にしてもいいかも?。友達とドライブするのが好きなので、コロナが始まる前は折を見つけて近くの二見ヶ浦とかに行ってました。すごく眺めがいいところなので、福岡に来られたら是非です!(夫婦岩があったりするのでカップルにおすすめ)

f:id:seiyu0225:20220125004447j:plain

以前、友人ドライブしたときの写真。鳥居の後ろに写っているのが夫婦岩です。(きれいだった~~)

あとは大学進学をきっかけ福岡に来てからなんですが、グルメ巡りにもはまりました.福岡にははずれの店が無くて、おいしい店ばかりなので!特に海鮮、ラーメン系ははずれが無いです。こちらもコロナのおかげて一人で食べることが多くなっちゃいました。早くみんなで食べられる日が来るといいですね~~。深夜にこの記事をみる方がいないだろうと信じて僕史上一番おいしかった海鮮丼を下に貼っておきます。ただ、食べるのは好きでも料理を作る方はさっぱりなので、就職した後はどうしようかなと思っています。最近、ベースブレッドを食べるようになって体調がよくなっているので朝と晩はそれでもいいかもなのですがさすがに飽きちゃうかな。noshみたいな宅配弁当はどうなんですかね・・・?結構気になってはいるので、いつか買ってみようかな。

f:id:seiyu0225:20220125010302j:plain

僕史上最大においしかった海鮮丼(形良し、味良しで最高でした)

他の趣味としては、中学生の頃に特に京都アニメーションの作品(ハルヒけいおん...)が好きでアニメをよくみていたのですが、大学生のころからあまり見なくなっちゃいましたね。理由は「30分、連続視聴できる体力がない」です。若いころ(10代)に戻りたい...

プログラミングとの関わり

ここではプログラミングとの関わり、競プロとの関り方とかについて書いていきます!

大学1年生

高校まで全くプログラムというものに触ったことがなかったので、大学の授業がプログラムデビューでした。初めて触った言語はC言語で、本当に戸惑いの日々を送ったのを覚えています。特に関数とかポインタのあたりが難しすぎて友達に教えてもらいながらなんとか課題を終えて提出していました。たしか、プログラムを書いていた環境もなかなか凄まじくリモートサーバ(Linux)にアクセスしてCUIで全て書いていたのですが知識が無さ過ぎてめちゃくちゃきつかったです(笑)。

競技プログラミングをはじめたきっかけは、ちょうどそのころサークル見学の期間で友人に誘われて「ICPCチャレンジ部(競プロサークル)」というところに見学にいったことです。恐らく、この友人に誘われなければサークルに入ることはなくて、そもそも僕が競技プログラミングを始めるきっかけは多分訪れなかったと思うのでものすごくラッキーな出来事だったと思います。

大学2~3年生

このころは授業以外でほとんどプログラミングをしていません!!!(え?)。というのも兼部で「合気道部」に入っていてそちらの活動に集中していたためです。合気道自体をほぼ毎日していたので、Atcoderのコンテストにも参加することはできず、競技プログラミング自体とも疎遠になってしまいました。それでも、たまに競プロサークルに行くと先輩とか友人がいつも通り接してくれてうれしかったのを覚えています。参考までに、大学3年生までのレート遷移を張っておきます。(飛び飛びで参加してるのが分かります。)

 

f:id:seiyu0225:20220125015212p:plain

大学3年生までのレート遷移(たま~に参加してる程度でした)

大学4年生

部活動も引退していよいよ研究活動が始まるという時期です。もともとプログラムの才能があるわけでもなかったので、順調に研究生活に入れるかかなり不安でした。そこで、競技プログラミングをすることでプログラミングが上手に書けるようになるのでは?と思い4月からしっかりと取り組むことにしました。このころは競プロ用のTwitterのアカウントを作っていなかったので、外から競プロerの方たちのツイートを眺めながら情報を仕入れていました。ちょうど、よるかつとか、くじかつと呼ばれるバチャが始まっていた時期で基本的には毎日参加して精進していました。大きな出来事としては6月くらいに緑コーダになったことですね。とにかくすごくうれしかったのを覚えています。たしか入緑した日に初めて親にAtcoderをやっていること、緑コーダになれたことを報告しました。喜んでもらえてうれしかったです。11月くらいには競プロ用のアカウント(@seiyu_kyopro)を作って、色々な方と交流する機会が増えました。新しく入ってきた人にも、壁を作らずに仲良くしてくれるコミュニティですごくいいなあと感じました。研究活動の方では1月くらいになると、卒論が慌ただしくなってきました。比較実験を回す際にたまたま深さ優先探索を書く必要があったのですが、思ったよりもスムーズにかけて競プロありがとう!!になってたなあ。

うれしすぎてツイートをしていた様です↓

2月に卒論を提出後はしばらく研究をのんびり進めていたので、Twitterをする時間が増えました(研究活動の進捗さん...)。このころは、競プロerの方々と深くかかわるようになり自分と競プロの向き合い方を決めていく上で大きなターニングポイントだったかもしれません。特にだれさん(@pro_anyone)と関わりはじめて、色々なアドバイスをもらうようになりました。時には朝まで一緒に高難易度精進に付き合ってもらったり、EDPCをひたすら埋めたりと貴重な経験だったなと感じます。

EDPCを全埋めして達成感であふれていたときの僕↓

 

大学院1年生

基本的には授業と研究を平行させつつ競プロをするという形になりました。前期は単位をいっぱい取ろうと思って授業を詰め詰めにしてかなり体力的に少しきつかったです。ただ、アルゴリズム系の授業は競技プログラミングに取り組んでいたおかげで授業もしっかり理解できたし、課題にも困ることはなかったです。たしか、この時期は研究室から帰った後に夜中の二時からバチャを走って、朝8時前に起きていた日もあったはずです。今となっては信じられません(笑)。後期を迎えた今では大学院での生活にも慣れてきて研究、授業、競プロのバランスを考えながら生活できています。競プロでは12月頃にかねてからの目標だった水色には到達できたのですが、いまはもう少し上の世界を見てみたいなという気持ちで続けています。正直なところ、全く青色になれるイメージがついていないですが、こつこつと頑張っていきたいと思います。

将来のこと

具体的に将来どのような職種についているかはまだわからないです。とりあえず、プログラミングをする職には就いている可能性が高いですが。職種によらず社会人になっても、競プロ自体はずっと続けていくことを目標の一つにしたいですね。これからも皆さんと仲良くできたらいいなと思っています。

さいごに

ここまで読んでいただきありがとうございました!

これからも何か折を見つけて更新できればと考えています!!