スクールなどでRailsやReactを学んだ後、競技プログラミングを知り、最初に悩むのが「どの言語を使うか」ではないでしょうか。
「Rubyを使っていると不利になる」
「C++はRubyとは全く違くて学習コスト高そう・・・」
本当はRubyを使いたいけど、ネットの入門記事はC++を推すものばかり、
なんて悩みを持たれている人も多いかと思います。
また、「Rubyは速度が遅い」なんて言われても、まだ難しい問題に直面していないので判断難しいですよね。
実際、私もこのような不安と付き合いながらAtcoderで競技プログラミングしていました。
もし、あなたがこのような悩みを持っているのであれば、ぜひ最後まで読んでほしいです。
Contents
Rubyで茶色に行ける
特段レートが右肩上がりではなかった私でもRubyのみで茶色コーダーまで行けました。この記事がRubyで参加するということに後押しできると思ってます。
私自身のレートの上がり具合はこんな感じです。
これは会社の同僚である新卒くんのレートです。大学で数学を学んでまもない彼と比較すると私が遅熟であることがわかると思います。私の方が早く始めたものの、あと数回で彼に抜かれそうです。
頑張ります^^
では、凡人でもRubyで茶色に行けることが伝わったと思うので、Rubyのメリットデメリットを見ていきましょう。
Rubyで競技プログラミングをするメリット
Rubyと他の言語の標準入力
競技プログラミングはまず問題から渡される情報を適切に受け取らなければなりません。
渡される情報を受け取るコードを言語別に見てみましょう。
a = gets.to_i
b, c = gets.split.map(&:to_i)
s = gets.chomp
#include<iostream>
using namespace std;
int main()
{
int a;
cin >> a;
int b,c;
cin >> b >> c;
string s;
cin >> s;
}
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
String s = sc.next();
System.out.println((a+b+c) + " " + s);
}
}
比べてわかると思いますが、圧倒的にRubyが簡単です。
もちろんC++やJavaの記述も毎回同じようにかけるので、覚えてしまう範囲だと思います。
しかし、目に見えるコード量が少ないのはそれだけ整理されていて嬉しいです。
便利なメソッド
Rubyには便利なメソッドがたくさん用意されています。
素数
素数かどうかを判別するprimeモジュールを使うことができます。
require 'prime'
Prime.prime?(123) #123がどうか調べる
each_with_index
配列をfor文のように繰り返し処理ができる上、その要素と添字の処理に使える
lang = ["ruby","python","php"]
lang.each_with_index do |ele, i|
puts "#{i}番目の要素は#{ele}です"
end
二分探索
二分探索はメソッドとして用意されているので、自力で実装する必要はありません。
ary = [0, 4, 7, 10, 12]
ary.bsearch {|x| x >= 4 } # => 4
配列の長さが可変長
Rubyは配列の長さが可変なので、オーバーフローなどを意識する必要がないです。
紹介したいくつかのメソッドは他の言語にはあったりするかもしれないです。少なくともRubyは簡潔にかけるようなメソッドが多々用意されています。
茶色コーダーまで確実に到達できる
競技プログラミングでRubyを使用することはネットで賛否両論あるのは事実です。
しかし、AtcoderのA〜D問題のような灰色・茶色コーダーが解くような問題はむしろRubyの方が適していると思っています。
再三となりますが、私は茶色コーダーまでなれました。特別なことはしていません。継続だけ必要でした。
下のリストをみてください。
左がよく使われるアルゴリズムで、右が私が実際に使用したアルゴリズムです。
このようなテクニックが問われるアルゴリズムを知らなくても茶色までは継続できれば行けました。
なので、ここで重要となるのはその言語が好きかどうか、とっつきやすいかどうかです。
では、逆にRubyを選択するデメリットを見ていきましょう。
Rubyで競技プログラミングをするデメリット
実行速度が遅い
結論から言ってRubyの速度は他の言語より遅く、競技プログラミングにおいて不利になる場面が実際にあります。
Atcoderでは、問題ごとの制限時間が2秒であることが多く、2秒というと約10の6〜7乗ステップ数ぐらいならばRubyで処理できます。
一方でC++などの言語では、2秒あれば約10の8乗ステップ数ぐらいまで処理できます。
C、D問題ぐらいから意識し始め、E問題くらいからはこの差を考慮して実装しなければなりません。
Rubyで解いている人が少ない
コンテストを終了した後は答えを見たいものです。C++とかのよく使われる言語であれば、たくさん解いた人がいるので参考にできる数が多いです。一方でRubyは、後半の問題になるにつれて解いた人が少ないので参考にできる数も限られてきます。(0ではないです)
また、コンテスト後はAtcoderの公式Youtubeチャンネルで解説放送があります。これもほとんどC++での解説となっており、Rubyに置き換えて考える必要があります。
ここまでデメリットを述べましたが、このデメリットが大きく効いてくるにはレートがある程度上がってきた後かと思います。
自分は茶色になったばかりなので、まだメリットの方が大きいと感じています。
まとめ
もしRubyに興味があり、しかし競技プログラミングを始めていいのか悩んでいるのであれば、私はRubyを推していきたいと思ってます。
競技プログラミングは継続と精進が大事です。凡人でも継続すれば解ける問題が増えていくのを私は体験しました。
結論、一番興味がある言語で始めるのがいいと思います。C++に興味があるのであればC++で、Pythonに興味があるのであればPythonで始めましょう。
コメント