@moriyatakashijp さん、今年もアドベントカレンダーの作成ありがとうございます。
はじめに
私は現在育休を頂いており、自分の母親ってこんなブラックな仕事に就いてたんだ・・と思いつつ家事に育児に奮闘しています。
今回は、子供が寝静まったあと、最近夜な夜な遊んでいる競プロについてお誘いしたく書かせていただきました。
まだまだはじめたばかりの初心者です。間違ったことを書いている可能性がございますのでお気づきの点がありましたらご指摘ください。
また、本記事は弊社の方に興味を持っていただくことを目的としています。
競プロとは
競技プログラミングの略で、そのままの意味でプログラミングによって競争することです。
競争の仕方には、タイムアタックやスコアアタックなどがあります。
今回は、タイムアタックにのみ言及します。
競プロの面白いところ
競プロは一言でいうとオンラインゲームです。
基本的に、プログラムを書いて提出すると複数のテストケースが走り、すべて通ればクリアーです。
それをいかに早く正確に解いていくか。早いことが正義です。
ちなみに、このとき表示されるWJからACに表示が変わる瞬間が気持ちいいです。
(WJは、WaitForJudge。ジャッジ中です。ACは、Accepted、正解!ってことです)
そして一般的なオンラインゲームと同じようにランキングが出ます。ガチ勢とエンジョイ勢がいます。
オンラインゲームでもランキング上位の人ってチートでしょ?と思うようなタイムだったりしますよね。
そんな人が沢山います(上の画像は私の提出結果です。B問題が21:31に解き終わっていますが、その間に上位勢はほぼ全問解き終わってます)
当然私はエンジョイ勢ですので、ランキング上位なんて無理ですが、同じ付近にいる方々と競えれば十分楽しいです。
AtCoderとは
競プロを定期的に開催している日本の会社並びにサービスです。
数年前からスタートしたそうですが、どんどん人口が増えていっているようです。
AtCoderからはじめるとよい理由
**AtCoder**からはじめるとよいと思う理由は主に3つです。
すべて日本語
英語アレルギーの私にとってかなりハードルが下がります。
サイトを開いた瞬間に**「あ、英語っ・・。そっ閉じ」**ということはひとまず避けられます。
ビギナー向けのコンテストが(ほぼ)毎週開催されている
ABC(AtCoder Begginer Contest)という名前でほぼ毎週ビギナー向けのコンテストが開催されています。
A問題からF問題まであり、A問題とB問題はとても簡単(入出力処理、IF文、FOR文、四則演算が実装できれば解けるレベル)です。
なので、**「参加したものの一問も解けない・・そっ閉じ」**とはなりづらいです。
おかげで私も続けることが出来ています。
ちなみにC問題以降になると、アルゴリズムの知識が必要であったり性能が出るような実装を考える必要があると思います(思います、というのはいま現在私がD問題以降を一度も解けていないため推測です。C問題も1度しか解けていません)。
ほかの人の解答がみれる
コンテスト終了後には、ほかの人の解答をみることができます。
コンテストが終わったあとは、AtCoderから解説PDFとYoutubeでのライブ解説がすぐに出るのですが実装例が基本的にC++です。
**「あっ・・C++やん、読めない・・そっ閉じ」**となりそうですが、
Pythonで実装している私はそっ閉じせずに、お気に入りのPython使いの人の解答をいくつかのぞかせて頂いて勉強しています。
ひとつの問題でも色んな解き方があるので、ほかの人の解答がみれるのはとても面白いです。
※コンテストでは多様な言語が使用できます。
他にもコンテストごとのランキングや個人のレート表記などやる気をあげる要素があります。
実際にどんな問題が出題されるのか?
では実際にどのような問題が出されているのかを見て頂ければと思います。
先日開催されたABC147のA問題、B問題の解答を載せます。
問題はリンクを貼っていますのでお手数ですがご参照ください。
A問題
(私の)解答
要するに入力値を足した結果が、22以上か21以下かなので、
a,b,c = map(int,input().split())
if a+b+c > 21:
print("bust")
else:
print("win")
B問題
(私の)解答
要するに文字列を半分に割って、お互いを比較していけばいいだけです。
回文ということなので、半分に割った前半は手前から、後半は後ろから比較していき
違った場合は、カウントアップすればよいということになります。
ちなみに半分に割る際、文字列の文字数が奇数の場合は真ん中の1文字が余るので判定いれてます。
s = input()
l = len(s)
s3 = ""
if l%2 == 0:
s1=s[:l//2]
s2=s[l//2:]
else:
s1=s[:l//2]
s2=s[l//2+1:]
hug = 0
for i in range(l//2):
if s1[-i-1] != s2[i]:
hug += 1
print(hug)
どう思いますかね?
これくらいならできそうだと思われた方。一緒にやりましょう。
**簡単すぎない??**と思われた方。Fまで読んでみてください。そしてこのコンテストはビギナー向けです、さらなる高みに向かってください(下のほうから応援しています)。
さいごに
さあ、AtCoderにいってアカウントを作成しましょう。
アカウントを作成したら、下記の記事などを参考に進めていきましょう。
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
以下、蛇足となります。
個人的な今後の目標
目標は年度内にABCのC問題まで安定に解けるようになり、D問題も解けることがあるというレベルまでもっていきたいと考えています。
そのために、参加したコンテストの復習や過去のC、D問題を解いて知識を蓄えていこうと思います。
ちなみに実務に役に立つのか
役に立つかは実務の内容によりますが、こういうときはこんなやり方があるなという選択肢は増えると思うので、少なからず影響はあるんじゃないか、と思います。
競プロ自体が役立つというよりは、競プロでレベルアップを図る過程が実務にも役立つ可能性はあるような気がします(わかりませんけど
育児と両立できるのか
AtCoderのABCコンテストですが、パパママにとっては最適な時間に開催されていることが多いです。概ね、毎週土曜日の21:00~22:40に開催されますので、子供を寝かしつけてフリーになりやすい時間帯です。
遅刻しがちですが私も毎回参加することが参加できています(寝室のモニターを横目に)。
以上、駄文・長文大変失礼しました。