🔎
rubyだけで罫線入りの九九の表を作る
どうすれば表を作ることができるのか一人じゃ全く発想が出て来なかったので調べた。
答えの一つを見つけたのでこう考えると作れるということを備忘録として残したいので残します。
完成形
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
==========================================
2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18
==========================================
3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27
==========================================
4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36
==========================================
5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45
==========================================
6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54
==========================================
7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63
==========================================
8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72
==========================================
9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81
こんな表を作りたい
行は|
(半角スペース2つとバーティカルライン) で区切り、
列(段)は上の行と文字数が等しくなるように=
で区切りたい。
数値を出力する時は2桁になるように半角スペース埋めにする。
考え方
ループ処理を使った配列を作成することを考える。
配列はjoinで結合できる。
こういった九九の処理は二重ループが適しているらしい。
数値を出力したいときは2桁になるように指定したいので、sprintf
メソッドかまたは指示子"%2d"
とString#%
メソッドを使う。段はjoin(' | ')
で結合。
リファレンスマニュアル - sprintfフォーマット
参考になる記事
二重ループで作り終えたらさらにjoinメソッドを使って("=" * (文字数)+ "\n")
で連結
("=" * (文字数)+ "\n")
→改行も含めて連結しないと罫線区切りにならない。
具体的な実装コード
# 1の段から9の段までの計算を二重ループで作る
# 1から9を格納するために空の配列を用意
column = []
(1..9).each do |i|
#先ほどの1から9を格納した配列に1から9を掛けた結果を格納する空の配列を用意
row =[]
(1..9).each do|j|
# 2桁指定して掛け算した結果を上で用意した配列に入れる
row.push("%2d" % (i * j))
end
#それぞれの段を" | "で連結し各段ごとに改行して最初の配列に格納
column.push(row.join(" | ") + "\n")
end
# 罫線を入れる処理 2桁*9つ + (" | ")の3文字 * 8つ = 42文字 42文字ごとに改行を入れる
table = column.join("=" * 42 + "\n")
puts table
#上記を簡潔にした書き方
kuku = (1..9).map do |i|
(1..9).map {|j| "%2d" % (i * j)}.join(" | ") + "\n"
end
table = kuku.join("=" * 42 + "\n")
puts table
Discussion