[Atcoder]Rubyでよく使う記法

2020年11月1日

今までAtcoderをRubyでやってきましたが、難易度が上がるにつれて参考コードが少なくなってきたので使用言語をPythonに変更することにしました。
Ruby卒業記念にAtcoderでよく使う記法をまとめておきます。

入力

数字の入力

n = gets.chop.to_i

スペース区切りの入力

N, M = gets.chop.split.map(&:to_i)

縦にならんだ入力

A = []
N.times {A << gets.chop.split.map(&:to_i)}

配列

配列の和

AtcoderのRubyが2.3.3でsumが使えないためinjectを使う

a = a.inject(:+)

配列のソート

1つ目の要素でソートしたあと、2つ目の要素でソートする

a.sort_by!{|x| [x[0],x[1]]}

二次元配列の初期化

m行n列の配列

arr = Array.new(m).map{Array.new(n,i)}

アルファベットの配列

a = [*'a'..'z']

ハッシュ

出現回数のカウント

入力と同時に行うことが多い

h = Hash.new(0)
n.times do
  a = gets.chop.to_i 
  h[a] += 1
end

ハッシュの中に配列

隣接リストとして通常のグラフに使える

graph = Hash.new{ |h, k| h[k] = [] }

二次元のハッシュ

重み付きグラフに使える

hash = Hash.new { |h, k| h[k] = {} }

その他よく使うもの

最大公約数・最小公倍数

def gcd(a, b)
  a,b = b, a % b while b > 0
  a
end

def lcm(a,b)
  a * b / gcd(a,b)
end

階乗

再帰的にやるとtoo deepとエラーが出てしまうので、injectで行う。
MODはここでは10^9+7

def factorial(num)
  (1..num).inject (1){ |sum, x| (x*sum) % MOD }
end

+や-をハッシュでわたす

a[0]+a[1]が計算できる

a[0].send(:+, a[1])