入力
基本はgets
を利用。改行を削除する必要がある場合はgets.chomp
を使う必要がある。基本文字列として扱われるので、数字の場合はto_i
メソッドを使う必要あり。文字列として受け取りたい場合はto_s
を利用。
# スペース区切りで与えられた数字をリストに格納
numbers = gets.chomp.split.map(&:to_i)
# 個別の変数に格納する場合も同様(入力数が確定している必要あり)
a, b = gets.chomp.split.map(&:to_i)
その他必要に応じて調べたメソッドや処理方法
複数行に渡る入力を受け取る
先頭行に後に続く行数M、以下にM行の入力が与えられる場合。
# 例
3
1 2
2 3
3 4
m = gets.chomp.to_i
m.times do
numbers = gets.chomp.split.map(&:to_i)
p numbers
end
計算や確認用メソッドなど
2 ** 3 #=> 8 #累乗
0.zero? #=>true #レシーバが0であるか
2.even? #=>true #レシーバが偶数であるか
2.odd? #=>false #レシーバが奇数であるか
四捨五入(丸め操作)
# 四捨五入する(桁数指定可)
puts 1.6.round #=>2
puts 1.4.round #=>1
puts 150.round(-2) #=>200
puts 1500.round(-2) #=>1500
puts 1500.round(-3) #=>2000
puts -1.5.round #=>-2
# 自身と等しいか、自身より大きい整数のうち最小のものを返す
puts 56.5.ceil #=>57
# 自身と等しいか、自身より小さい整数のうち最大のものを返す
puts 56.5.floor #=>56
# 自身から0までの整数で、自身に最も近いものを返す
puts 22.2.truncate #=>22
puts -1.5.truncate #=>-1
配列操作
array.unshift("hoge") #配列の先頭へ追加
array.push("hoge") #配列の末尾へ追加
array.shift #配列の先頭から削除
array.pop #配列の末尾から削除
array1 += array2 #2つの配列の要素をつなげた配列を作る
array1 -= array2 #後ろの配列の要素を除いた配列を作る
array.uniq #配列から重複した値を取り除く(新しい配列を返す)
array.uniq! #破壊的に重複した値を取り除く(自分自身を変更)
array.sample #配列内の要素をランダムに取得
array.shuffle #配列内の要素をランダムに並び替え
array.sort #配列内の要素を昇順に並び替え(小さい順、A→Z)
array.reverse #配列内の要素を逆順にする
array.sort.reverse #配列内の要素を降順に並び替え
条件に合う要素を抽出する(合うものがない場合空の配列が返る)
[1, 2, 3, 4, 5].select { |n| n % 2 == 0 } #=> [2, 4]
{:a => 1, :b => 2}.select { |k, v| v == 1 } #=> {:a => 1}
条件に合わない要素を抽出する(合うものがない場合空の配列が返る)
[1, 2, 3, 4, 5].reject { |n| n % 2 == 0 } #=> [1, 3, 5]
{:a => 1, :b => 2}.reject { |k, v| v == 1 } #=> {:b => 2}
条件に合う最初の要素を返す(ない場合はnilが返る)
[5, 4, 3, 2, 1].find{ |n| n % 2 == 0 } #=> 4
# 要素のインデックス番号を返す
[5, 4, 3, 2, 1].find_index{ |n| n % 2 == 0 } #=> 1
条件に合う要素の数を返す
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
puts numbers.count {|item| item % 2 == 0 } #=> 4
便利なやつ
array.each_slice(3).map.to_a #配列の要素を指定数で分割する
"12345".chars.map(&:to_i) #文字列を配列に分解
number.to_s.chars.map(&:to_i) #数字を受け取って一桁ずつ配列に分解
# コメントでより良い方法を教えて頂きました
1024.digits #=> [4, 2, 0, 1]
1024.digits.reverse #=> [1, 0, 2, 4]
スライス
animals = ["dog", "cat", "mouse", "rabbit", "horse"]
p animals.slice(3) #=> "rabbit"
p animals.slice(1, 3) #=> ["cat", "mouse", "rabbit"]
p animals.slice(2..4) #=> ["mouse", "rabbit", "horse"]
ループ処理
インデックス番号付きのループ
array.each_with_index do |a, i|
puts "#{i}. #{a}"
end
ハッシュ操作
配列と使えるメソッドが重複することが多い。ハッシュ独自の物について。
hash.default = 0 #存在しないキーを取得しようとした際のnilを0に変更
hash3 = hash1.merge(hash2) #hash1とhash2をまとめた新しいhash3を作る
hash.delete(:hoge) #キーhogeと対の値を削除
繰り返し処理
#通常の繰り返し
hash.each do |key, value|
puts "#{key} #{value}"
end
#キーのみ取り出し
hash.each_key do |key| #ブロック変数は1つでいい
puts key
end
#バリューのみ取り出し
hash.each_value do |value| #ブロック変数は1つでいい
puts value
end
mapの扱い
配列の各要素を変換するメソッド
result = [1, 2, 3].map do |x|
x * 2
end
p result #=> [2, 4, 6]
後置if, unlessで行数削減
単純な条件の場合、if
,unless
は処理の後に書くことで行数を削減できる。else
等が必要な場合はちゃんと書く方がいい。
m = 1
puts "even" if m.even? #=> falseなので実行されない
puts "odd" unless m.even? #=> trueなので実行される
出力の時に使いがちなjoin
array.join #リスト内の要素を連結
array.join("hoge") #リスト内の要素に引数を挟んで連結
["hoge", "fuga", "piyo"].join(" ") #=> hoge fuga piyo