LoginSignup
11

More than 3 years have passed since last update.

Rubyで競プロをしていた時に使っていたライブラリを供養する

Last updated at Posted at 2020-12-13

はじめに

僕は数年前、競プロをかじっていました。一応水色までは行きましたが、それ以降はあまり振るわず、現在はほとんどやることがなくなってしまっています。
僕は水色になるまでほとんどの問題をRubyで解いていました。
その時に使っていたライブラリが誰かの役にたつかもと思ったので、この記事でそのライブラリの解説を行って使っていたライブラリの供養をしようと思います。

昔解いていた問題は https://github.com/getty104/AtCoder に残しています。コードを見た方が使い方のイメージがつきやすいかもしれません。

ライブラリ一覧

はじめに使っていたスニペットをそのまま貼っておきます。これらのライブラリの使い方や使うシーンについて説明していきます

  require 'prime'
  require 'set'
  require 'tsort'
  include Math
  ALP = ('a'..'z').to_a
  INF = 0xffffffffffffffff
  def max(a,b);              a > b ? a : b                              end
  def min(a,b);              a < b ?  a : b                             end
  def gif;                   gets.to_i                                  end
  def gff;                   gets.to_f                                  end
  def gsf;                   gets.chomp                                 end
  def gi;                    gets.split.map(&:to_i)                     end
  def gf;                    gets.split.map(&:to_f)                     end
  def gs;                    gets.chomp.split.map(&:to_s)               end
  def gc;                    gets.chomp.split('')                       end
  def pr(num);               num.prime_division                         end
  def pr?(num);              Prime.prime?(num)                          end
  def digit(num);            num.to_s.length                            end
  def array(s,ini=nil);      Array.new(s){ini}                          end
  def darray(s1,s2,ini=nil); Array.new(s1){Array.new(s2){ini}}          end
  def rep(num);              num.times{|i|yield(i)}                     end
  def repl(st,en,n=1);       st.step(en,n){|i|yield(i)}                 end

入出力系

競プロでは標準入力で問題のデータを受け取ると思います。問題の入力形式はだいたいパターンが決まっているので、シュッと実装できるようにいくつか関数を用意していました。それらについて解説していきます

gif

gifは、入力を1つの整数として受け取る関数です。
入力の形式が1つの整数だった場合に使えます。

利用例

入力形式 
N
実装
n = gif

gff

gffは`gifのFloat版です。入力をFloatとして扱いたい時に使います

入力例
R
実装
r = gff

gsf

gsfは、入力を1つの文字列として受け取りたい時に使う関数です。この関数は受け取った文字列をクエリとして扱う場合によく使います。
受け取る文字列を操作する場合は後述するgcを使います。

S
実装
s = gsf

gi

giが一行で複数の整数を受け取る時に使う関数です。一番よく使う関数な気がします。

入力例1
A B
実装1
a, b = gi
入力例2
N1 N2 ... Nk
実装2
n = gi

gf

giのFloat版です。一行で複数の値をFloatとして受け取りたい時に使います。

入力例
r1 r2
実装
r1, r2 = gf

gs

giのString版です。一行で複数の値をStringとして受け取りたい時に使います。

入力例
S1 S2
実装
s1, s2 = gs

gc

文字列を配列として受け取りたい時(Charのような感じ)に使える関数です。

入力例
C
実装
c = gc

その他

入出力以外でも、記述を減らすために用意していた関数が色々あったので紹介していきます。

max, min

rubyでは 配列のメソッドとしてmaxminがあるのですが、AtCoderでは2値の比較をよく行うので、min,maxというメソッドを用意していました。

digit

digitは数字の桁数を取得できる関数です。

digit(100) # => 3

pr

prは与えた値を素因数分解してくれる関数です。Rubyの標準モジュールのprimeにあるInteger#prime_divisionのエイリアスです。


pr(100) #=> [[2, 2], [5, 2]]

pr?

pr?は与えた値の素数判定をしてくれる関数です。

pr?(2) #=> true

array, darray

競プロをやっていると初期値を設定した配列を用意する必要があるときがあると思います。
arraydarrayはそういう時に使える関数です。arrayは一次元配列、darrayは二次元配列を用意したい時に使えます。

dp = darray(100, 100, INF)

rep, repl

rep, replは競プロをやっているとおなじみの関数のような気がします。
これはfor文を簡潔に書けるようにした関数です。

rep 10000 do |i|
 # 何かしらの処理
end

repl 1, 10 do |i|
 # 何かしらの処理
end

INF, ALP

INFは無限大の値のエイリアスです。初期値で使うことが多いです。
ALPはアルファベットの配列です。たまに使います。

まとめ

Rubyで競プロをやるのはパフォーマンス的な部分やライブラリ的な部分で不利なところも多いですが、もしRubyで競プロをやる機会があれば参考にしてもらえれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11