AtCoderでRubyはいかがなものか
はじめに
私は初めて AtCoder のコンテストに参加してから今まで Ruby で参加してきました。
今回はずっと Ruby を使ってきたからこそわかる AtCoder で Ruby はいかがなものか、その疑問に答えていこうと思います。
AtCoderとは
AtCoder とは日本最大級の競技プログラミングを開催しているサービスです。
コンテスト内容は時間内に指定された問題を解くものでアルゴリズムに関する能力が問われます。
筆者のAtCoder歴
執筆現在(2024/03/10)ではレートが 802 の緑なりたてです。
使用言語は Ruby で参加した 72 回すべて Ruby で解いています。
Ruby について
Ruby(ルビー)とは、日本人のまつもとゆきひろ氏(通称、Matz)によって 1995 年に開発されたプログラミング言語です。
詳細は長所短所にて記載します。
AtCoderの使用言語としての Ruby はいかがなものか
長所
- コードがシンプル
クラスやメソッドといったものを定義する必要がないため少ないコード量で書けます。 - 型を気にしなくてよい
言語によっては型宣言しないと使えれませんし途中から型を変更することが出来ないこともありますが、Ruby なら気にせず使えます。 - 桁の制限がない
問題によっては 64 ビット整数型( 20 桁)よりもっと精度の高い値を求められることがありますが、Ruby は桁の制限がなく何も考える必要がありません。 - デバックが楽
自分の書いたコードに問題があっても途中までは動きを確認することが出来るため、コードにエラーが出た際どこでエラーになったのかわかります。 - 便利なメソッドがたくさんある
二次元配列の縦と横を入れ替えるArray#transpose
や配列の先頭に対し挿入削除を行うArray#unshift
,Array#shift
など便利なメソッドがあり結構な頻度で使えます。
短所
Ruby で AtCoder をする上で大きな欠点があります。
Ruby はコンパイル言語と比べると遅いです!!!
例えばこちらの問題を見てください。
C - Takahashi Gets Lost
この問題は単純な全探索です。(解説でもそのように説明されていました)
H 行 W 列のグリッドがあり、全マスに対し陸地なら指定された方向に計Nマス移動しずっと陸地なら ans + 1 というものです。
しかし制約が以下のように少し厳しく
- 3 ≤ H , W ≤ 500
- 1 ≤ N ≤ 500
最大ケースを考えると計算量が 500 ** 3 = 125000000 ≒ 10 ** 8 になります。
C++ などのコンパイル言語であれば AC(Accepted) できますが Ruby だと TLE(Time Limit Exceeded) になります。
結論
メリットに書いているように使い慣れていない言語でコードのエラーを直すことがある場合などを考えると Ruby は始めやすい言語だと思います。実際私は Ruby を使って参加していましたが茶色レートに到達するまではすんなりいけました。
しかし、上を目指いしていくならコンパイル言語を使った方が良いです。
短所で上げた問題は実際に自分がコンテスト中に遭遇し解けなかった問題です。ここで問題なのは解けなかった理由が自分の力不足ではなく Ruby だからということです。
体感ですが 10 回のコンテストの内 1,2 問はこのような Ruby だから解けない問題がありますので C 問題や D 問題もちゃんと解きたい人はお勧めしません。
最後に
結論にて Ruby は AtCoder を始めやすいが難しい問題(計算量の厳しい問題)を考えるとお勧めしないと書きました。
しかし、解き方次第で解ける問題ももちろんありますし別の問題を早く解けばレートは上がっていきます。
結局は本人のやる気次第な気もしますね。
実際私は Ruby で緑色コーダーになれました。色変記事もありますのでいかにしてここまで成長できたか気になる方は見ていただけると幸いです。
Discussion