はじめに
今回は配列の中の二つの数字の差分を計算をしていきます。
例題
あなたは体調管理のために天気予報の最高気温、最低気温から 1 日の気温がいくつ変化しているかを知りたくなりました。
ある日の最高気温 t と最低気温 u がスペース区切りで入力されるので、 1 日の気温がいくつ変化しているかを出力してください。
例えば以下のように入力された場合、最高気温が 7 度、最低気温が -3 度を意味し
7 -3
温度の差は 10 なので以下のように出力してください。
10
訂正前
input_line = gets.split(' ').map(&:to_i)
# 前後の配列を作る
before_after = input_line.each_cons(2)
before_after.each do |ba|
puts (ba[1] - ba[0]).abs
end
# ↓ 同じ意味です(分解して分かりやすく修正)
before_after.each do |a, b|
puts (b - a).abs
end
解説
input_line = gets.split(' ').map(&:to_i)
・getsメソッドで入力値を取得
・splitメソッドで配列の要素をカンマ区切りで分ける
・mapメソッドで要素を一つずつ取り出して整数に変換する
before_after = input_line.each_cons(2)
・each_cons(2) は連続した 2 個の要素を1つずつずらしながら取得できる。
before_after.each do |a, b|
puts (b - a).abs
end
・2つの要素をa,b変数に代入して差分を計算する
・adsメソッドで絶対値に変換
*ご指摘
each_cons(2) は [1, 2, 3, 4, 5] から [[1, 2], [2, 3], [3, 4], [4, 5]] を求めるメソッド1なので、今回のケースではあまり有効なではない
each_slice(2) なら、例えば 7 -3 5 2 のように複数続く場合に [[7, -3], [5, 2]] を経て10 3を求めることができますね。
訂正後
a, b = gets.split.map &:to_i
puts (a - b).abs
# 無理矢理一行で書くなら
puts gets.split.map(&:to_i).inject(:-)
解説
a, b = gets.split.map &:to_i
・今回は二つの要素限定なので変数をa,bに分ける
・getsメソッドで入力値を取得
・splitメソッドで配列の要素を分ける
・mapメソッドで要素を一つずつ取り出して整数に変換する
puts (a - b).abs
a,bの差分を計算し、adsメソッドで絶対値に変換
最後に
この記述で計算はできたのですが最後がいまいち理解できなかったのでご教授いただければ幸いです。
今回もご教授いただいてありがとうございます。
発信することでいろんな発見やご指摘してくださるのでとても勉強になります。
これからも発信を続けていきます!