4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby 配列の数字の差分を計算

Last updated at Posted at 2020-10-05

はじめに

今回は配列の中の二つの数字の差分を計算をしていきます。

例題

あなたは体調管理のために天気予報の最高気温、最低気温から 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メソッドで絶対値に変換

最後に

この記述で計算はできたのですが最後がいまいち理解できなかったのでご教授いただければ幸いです。

今回もご教授いただいてありがとうございます。
発信することでいろんな発見やご指摘してくださるのでとても勉強になります。
これからも発信を続けていきます!

4
4
1

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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?