はじめに
列と行のそれぞれの合計を出力するコードを書いてみました。
縦×横=4×4の任意の表から、行と列の合計を出力するといった問題になります。
こちらの値をインプットします。
sample.rb
9| 85| 92| 20|
68| 25| 80| 55|
43| 96| 71| 73|
43| 19| 20| 87|
アウトプットがこちらです。
sample.rb
9| 85| 92| 20| 206
68| 25| 80| 55| 228
43| 96| 71| 73| 283
43| 19| 20| 87| 169
-------------------------
163| 225| 263| 235| 886
コードの解説
input変数の配列の各要素を文字列でつなげて1行で印字することは難なくできるかと思います。このとき、数字が1桁であっても、2桁であっても、桁ずれを起こすことなく印字する必要があります。そのときに利用するのが、rjustメソッドです。rjustメソッドを利用することで、文字列を右詰めにして、先頭に指定した数の空白をセットすることができます。そして次に、各列の要素を合計して、最終列に印字することも難なくできるかと思います。
この問題で一番難しいと感じる部分は、各行を印字しながら、列単位での合計も加算しないといけない箇所だと思います。列の加算はこの部分で行っています。
sample.rb
sum_row[idx] = sum_row[idx] + col.to_i
そして、すべての行を印字した後に、最終行に各列の合計を印字します。変数にセットした各列の合計を取得している箇所がこちらです。
sample.rb
col_sum << " #{sum.to_s.rjust(3)}|"
更に、各列の合計の総合計も加算します。
sample.rb
sum_sum = sum_sum + sum.to_i
コード
sample.rb
def row_col_count(data)
sum_row = [0,0,0,0]
# 行のループ
4.times do |cnt|
col_work = ""
sum_col = 0
# 列のループ
data[cnt].each_with_index do |col, idx|
col_work << " #{col.to_s.rjust(3)}|"
sum_col = sum_col + col.to_i
sum_row[idx] = sum_row[idx] + col.to_i
end
# 行+行の総合計
puts "#{col_work} #{sum_col.to_s.rjust(3)}"
end
col_sum = ""
sum_sum = 0
# 行の合計
sum_row.each do |sum|
col_sum << " #{sum.to_s.rjust(3)}|"
sum_sum = sum_sum + sum.to_i
end
# 行の総合計
puts "-" * 25
puts "#{col_sum} #{sum_sum.to_s.rjust(3)}"
end
input = [[9, 85, 92, 20],
[68, 25, 80, 55],
[43, 96, 71, 73],
[43, 19, 20, 87],
[95, 66, 73, 62]]
row_col_count(input)
実行結果
9| 85| 92| 20| 206
68| 25| 80| 55| 228
43| 96| 71| 73| 283
43| 19| 20| 87| 169
-------------------------
163| 225| 263| 235| 886