この記事は 夏のブログリレー 9日目の記事です。
他の記事は 夏のブログリレー タグから見ることができます。
はじめに
みなさまこんにちは。Nzt3です。
普段は競技プログラミングをやったり、競技プログラミングをやらなかったりしています。
最近はマインクラフトをやって3D酔いしてやめたりしています。
競プロでの言語選択
みなさまは競技プログラミングでどの言語を使っていますか?
C,C++,Javaはかなり使われている印象があります。AtCoderではACLというC++優遇もありますね。
Pythonもかなり有力です。外部ライブラリ+PyPyが使える環境ではC++を超える強さになっています。[1](PyPyが使えない環境だと……)
ICPC上位入賞を目指している学生競プロerも多いでしょう。ICPCでは使用可能な言語がC, C++, Java, Kotlin, Python3に限られているのでここから選んだ人も多いのではないでしょうか。
自由な言語選択をする
競技プログラミングは個人戦のことが多いです。しかも、ほとんどのコードは「書き捨て」、コンテスト中にジャッジで動きさえすればどのようなコードを書いても構いません。
この状況では、言語選択に文句を言うのはジャッジシステムだけです。ジャッジシステムにさえ許されればどの言語でも使うことができます。
競プロで日本語を使おう
ジャッジシステムによって対応している言語は違います。C,C++,Java,Pythonなどの競プロ主要言語はほとんどのジャッジが対応していますが、他の言語は対応していないことの方が多いです。
AtCoderは日本最大の競技プログラミングサイトです。このジャッジは非常に多くの言語に対応しています。
なんと、「なでしこ」「プロデル」のような日本語プログラミング言語にも対応しています。
日本語プログラミング言語であれば英語っぽい謎単語を覚えなくとも競技プログラミングができます。日本語話者にとって最高のジャッジです。
プロデルでJOI予選を解く
現在AtCoder上で行われるコンテストであれば、だいたいのコンテストでプロデルが使用できます。これはJOI(日本情報オリンピック)も例外ではありません。
競技規則にちょっと不穏な注意書きはありますが、大体は問題ありません。
JOI 一次予選では,C/C++ と Python 以外のプログラミング言語を用いた場合,使用する言語によっては実行速度が遅く, 模範解答として想定されているアルゴリズムを用いても満点を得ることが難しかったり不可能な場合もあるかもしれない.
今回はJOI 2023/2024 一次予選 (第1回) 過去問をプロデルで解いてみましょう。提出コード一覧はこのリンクから見ることができます。
予選ではインターネット上の資料の閲覧が許可されているので、プロデルマニュアルをガン見してコードを書いていきます。
以下にはJOI 2023/2024 一次予選(第1回) のネタバレを含みます。自力で解きたい方は注意してください。
A - 果物 (Fruit)
X+Y+3を求めよ
この問題では改行区切りで書かれた非負整数を2つ受け取り、加算の結果を出力する必要があります。「コンソールから受け取る」を利用してX,Yを受け取り、結果を出力しましょう。
Xは、コンソールから受け取る
Yは、コンソールから受け取る
X+Y+3を表示する
ACが得られました。嬉しいですね。
B - 和の判定 (Sum Checker)
A+B=C or B+C=A or A+C=B
「もし~なら」と「他でもし」を使って3つの条件を判定しましょう。
変数「答え」を更新していくと簡単に書くことができます。
Aは、コンソールから受け取る
Bは、コンソールから受け取る
Cは、コンソールから受け取る
答えは、0
もしA+B=Cなら
答えは、1
他でもしB+C=Aなら
答えは、1
他でもしA+C=Bなら
答えは、1
もし終わり
答えを表示する
ACが得られました。いい感じです。
C - ハミング距離 (Hamming Distance)
S,Tのハミング距離を求めよ
長さNと文字列S,Tが与えられるので受け取ります。
答えを0で初期化します。先頭から1文字ずつ取り出して答えを順に更新していきましょう。
Nは、コンソールから受け取る
Sは、コンソールから受け取る
Tは、コンソールから受け取る
答えは、0
iを1から1ずつ増やしながらNまで繰り返す
もし(Sのi文字目から1文字取り出したもの)が(Tのi文字目から1文字取り出したもの)でないなら
答えは、答え+1
もし終わり
繰り返し終わり
答えを表示する
ACが得られました。素晴らしいです。ここまで解ければ一次予選突破です!
D - 現れている数字 (Appearing Numbers)
数列から重複を除いてソートせよ
数列の要素を空白区切りで与えられているので、文字列として受け取ります。
値の範囲が小さいので小さい順にAに含まれるかを判定すれば良いですね。
Nは、コンソールから受け取る
Aは、コンソールから受け取る
iを0から1ずつ増やしながら9まで繰り返す
もしAがiを含むなら
iを表示する
もし終わり
繰り返し終わり
ACが得られました。一次予選全完です!もはやにわとりですね。[2]
この調子で二次予選も、と思っていたのですが、厳しかったです。
AtCoder Beginners Selectionは埋めているのでプロデルで競技プログラミングをやりたい人は参考にしていただけると思います。提出一覧
プロデル Language Ownerの人に聞いた話
今回はプロデルのLanguage Owner(その言語でAtCoderの問題をたくさん解いている人[3])に話を聞くことができました。
せっかくの機会なので色々質問してみましょう。
プロデル Language Owener(2024/08/26時点) Problemsより
プログラミング入門に良い言語か
わからないです。英語っぽい謎単語を覚える必要はないですが日本語で文法を覚える必要があるのでその部分が簡単になっている感じはしないです。
プログラミングの各種概念は全然簡略化されていないので、本質部分は入門用にはなってないと思います。
「謎の英単語」というプログラミングの非本質的な困難が無くなっているのはかなり助かると思います。名前と動作が自然に対応するので頭に浮かんでいるやりたいことをコードに起こすことがやりやすく、プログラミングの面白いところに辿り着きやすいです。
競プロ入門に良い言語か
はい、競プロ入門であれば良い言語だと思います。AtCoderに入っている言語の中では相当入門に適しています。
C++のinclude
のような謎のおまじないもなければ、Pythonのmap(int,input().split())
のような謎呪文もありません。
競プロで使う上では型の知識は確実に必要になりますが、「数値」や「文字列」、「数値の配列」など自然な日本語名がついているため理解が容易です。[4]
英語っぽい意味のわからない単語を覚える前に競プロの論理・数学部分をやりたいという人は言語の選択肢に入れても良いです。
競プロ的に強い言語か
いいえ。ABCのC問題でも実行速度的に解くことが難しい問題が多いので、灰difficultyの問題でも安定して通すことはできません。やや考察が重い問題を通して茶色coderになれる可能性があるというところだと思います。ABC338のように問題運がよければ青色perf.を目指せることもありますが[5]、基本的には茶色安定すら厳しいです。
「競プロの面白い部分だけを軽く体験してみる」くらいの使い方なら良いですが、強さを考えると実行速度が不利すぎます。
終わりに
プロデルは競プロに強い言語ではありませんが、競プロをやる上で「謎の英単語」が嫌だと感じている人には適しているかもしれません。
みなさまも競プロの布教の際に「英語がわからなくてもできるよ」と言って競プロ人口を増やしていきましょう。
ブログリレーの明日の担当は@zoi_dayo,@tobuhitodesu,@H1rono_Kです。お楽しみに。