見出し画像

稚魚は競プロのハードルを下げたい

初めまして稚魚通り越してプランクトンです。この記事はwin+vscode+MinGWでAtCoderの問題を解くときに便利な設定やテンプレを紹介する目的で書きました。ただしMinGWのvscode導入方法はほかに詳しい記事がいくつかあり自分が書くのはおこがましいと思ったので省きます。強い方はこの記事に書かれている内容は無用でしょうし、なんじゃこりゃというのもあるでしょうがどうかお目こぼしよろしくお願いします。

前書きは言い訳や御託なのでスルー推奨です。

前書き

私は情報系の大学生なんですが特にスキルがあるわけでも知識があるわけでもコネがあるわけでもない状態で就活に臨まなければならないいたって普通の雑魚です。せっかく一年の時から競技プログラミングにふれているのに全く精進しなかったせいで死んでます。それでもまぁ学ぶ機会っていうのは思い立った日が後から振り返って最古の日なのでやる気のあるうちにやるべきです。

さて、プログラミングのスキルを上げる方法として自分でサービスを作ってみたりゲームを作ってみたりいろいろあるわけですが、特に目的もなくただスキルが欲しいってこともあるわけでその場合最終目標を立てることがめんどくさいということもあると思います。競技プログラミングなら出された問題を解いていくことでいろいろな場面で役に立つデータ構造やアルゴリズムを学べます。

競技プログラミングとは?

まず競技プログラミングってなんぞや。というのを私なりに説明しますと、数学の問題が出題されるので入力が変わってもその場合の正しい答えを出す式をプログラミングしましょう。という感じです。詳しくは問題を見てください。

icpcという大学の国際大会があったり、それの問題をいつでも解けるaojというサイトもあったりいろいろありますがここが一番手を出しやすいと思います。

AtCoder Beginner Contest(ABC)A問題は特に初心者向けでif文をかければクリアすることができます。さらにページ内で環境構築せずにプログラムのテストをすることができるので(エディタとして使うのはあまり推奨できませんが)参加するのは非常に簡単だとご理解いただけると思います。

ここからが本題です。

vscodeと仲良くしたい。

すでにvscodeの日本語化、自動フォーマット、予測変換などの拡張機能が入っている状態でもうちょっと便利にならないかなと、四苦八苦した場所を紹介したいと思います。

vscodeのターミナルでビルド&実行するのがめんどくさい。

→task.jsonを書く。ctrl+shift+pでvscodeのコマンド入力ができるのでそこでtaskと入力しタスクの構成の項目を開きます。

画像1

そうすることでtask.jsonが勝手にできるので(すでにある場合は開く)そこをちょっと書き換えます。

画像2

labelはタスクの実行時どれか判別するための名前で ターミナル(T)→タスクの実行→実行するタスクの選択 でプルダウンメニューに表示されます。自分でわかる名前で大丈夫です。

typeはいじらない。

commandはそのままコンパイルするときはg++で実行タスクの方は何も書かない(コマンドプロンプトのpythonとかcdとかmkdirとかのコマンドと一緒(?))

argsもそのまま引数でコンパイルするときは

>g++  ***.cpp -o  ***.exe

といちいち入力しなければいけないものをtask.jsonをちゃんと設定することで省略できます。(g++ ***.cppだけでもコンパイルされるができる実行ファイルはa.exeになってしまうため-o以降を付けている)

groupのkindはビルドタスクかテストタスクかvscode側に認識させるために必要です。これでショートカットキー一つで済む。便利。

後はいじらない。(これで動いてもしばらくして動かなくなることはたまによくある。その時はおとなしく入力しましょう…)

後はターミナルのデフォルトをpowershellからコマンドプロンプトに変えたり、ショートカットキーを押しやすく設定したりお好みで。

テンプレについて

#include <bits/stdc++.h>

#define ed cout << "\n";
#define speed                         \
   ios_base::sync_with_stdio(false); \
   cin.tie(NULL);                    \
   cout.tie(NULL);
#define ll long long
#define ffor(i, a, b) for (ll i = (ll)(a); i < (ll)(b); ++i)
#define rep(i, n) ffor(i, 0, n)
#define All(obj) (obj).begin(), (obj).end()
#define INF ((ll)1e9 + 7)
#define c(a) cout << a << "\n";
using namespace std;
const int N = 100005;
const int MOD = 1000000007;
int main()
{
   speed;
   cout << fixed << setprecision(9);
   /*start*/
   return 0;
}

私のいつも使っているテンプレです。すでに管理しきれてません。
よく使うものだけを紹介したいと思います。

#define ed cout << "\n";

本当に意味の不明な奴ですがデバックをするときにどこからどこまでが入力値かとか一目ではっきりわかるように区切りとして二つとか入れて利用しています。

#define ll long long
#define ffor(i, a, b) for (ll i = (ll)(a); i < (ll)(b); ++i)
#define rep(i, n) ffor(i, 0, n)
#define All(obj) (obj).begin(), (obj).end()

これらは普通に打つ量が減るので便利です(fforはいらない子。これの使い方思い出すよりもfor分普通に打った方が早いのは内緒)
特にrepとAllは非常によく使います。repはデバッグ時とても便利ですし、Allはsortでもfindでも一瞬で使えるので重宝しています。

#define c(a) cout << a << "\n"

デバッグに便利です。(変数cが使えなくなりますが…)

#define INF ((ll)1e9 + 7)
const int N = 100005;
const int MOD = 1000000007;

Q.なぜ10,00,000,007がdefineとconstで二つも定義されてるの?

A.なんでじゃぁ…

defineはコンパイル時、constは実行時置換されるって話らしいですが二つもあるのは全くもって意味が分からん…
一応どちらもmodを求めるときに使えます。
Nは配列を用意するときの適当に。

後はおまじないです。(検索すればすぐ出ます)

最後に

長々書きましたが正直こんなやつのテンプレ見るよりも提出されているコードを見た方が良いと思います。

今回は私の使っている環境を晒すにあたってc++ですが、正直環境構築はめんどくさい部類です。私が省いたところが一番ネックなはずです。
一番簡単なのはgoogleアカウント持ってればgoogle colab でいきなりpython書ける奴だと思います。ブラウザ上で動くので環境構築一切せず書き始められて非常に便利です。大体のコンテストではc++だけでなくjavaやpythonなどメジャーな言語での提出を受け付けていますから今すぐにでも提出できますよ。

AtCoderではいつでも回答提出できますし、毎週のようにコンテストをやっています。他人の提出コードも見れるので非常に良い勉強になるかと思います。中にはそんな方法あったのかというような鮮やかな回答がしれっと混ざってたりして面白いですよ。ほかにも公式解説動画やpdfがありますしQiitaにもいろんな記事が載ってます。さらに公式がプログラム初心者用に作った入門教材を用意しています。

このように学習する土壌は整っていますし、こんな私でもA問題B問題は早解きできると聞けば、参加に対するハードルは限りなく低くなることでしょう。

ぜひ参加してみてください。

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