Ruby」カテゴリーアーカイブ

paizaLvアップ問題と解答(標準入力2)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題4 10 行の入力 (paizaランク D 相当)

s_1, s_2, s_3, … s_9, s_10 の 10 個の文字列が与えられます。
文字列を与えられた順番通りに出力してください。

入力例1

one
two
three
four
five
six
seven
eight
nine
ten

出力例1

one
two
three
four
five
six
seven
eight
nine
ten

解答

# 複数行の入力値を受け取り変数に配列として代入していく
strings = readlines(chomp: true)
# 配列をputsで出力すると1行ずつ出力できる
puts strings

問題5 1,000 行の入力

s_1, s_2, s_3, … s_999, s_1000 の 1,000 個の文字列が与えられます。
文字列を与えられた順番通りに出力してください。

入力例1   (・・・で途中省略しています。)

paiza0
paiza1
paiza2
.
.
.

paiza999

期待する出力 (・・・で途中省略しています。)

paiza0
paiza1
paiza2
.
.
.

paiza999

解答 問題1と同じでできる

# 複数行の入力値を受け取り変数に配列として代入していく
strings = readlines(chomp: true)
# 配列をputsで出力すると1行ずつ出力できる 
puts strings

paizaCランクレベルアップ問題と解答(6) 整数と文字列 Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題6 数字の文字列操作(時刻2) (paizaランク D 相当)

時刻を表す長さ 5 の文字列 S が “XX:XX” の形式で与えられます。与えられた時刻の 30 分後の時刻を同じ形式で出力してください。

入力される値
入力は以下のフォーマットで与えられます。

S

1 行目に文字列 S が与えられます。
S は “XX:XX” という形をしており、 “:” の左側は時を、右側は分を表します。時や分が一桁である場合、十の位は 0 で埋められます。また、 00:00 から 23:59 までの 24 時間表記を採用しています。 

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
与えられた時刻の 30 分後の時刻を “XX:XX” の形式で出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・ S が表す時刻は最も遅くて 23:29

入力例1
01:02
出力例1
01:32
入力例2
12:31
出力例2
13:01

解答  (入力例2で解説)

#1行目の入力値を:(コロン)の部分で分割して変数に代入する["12","31"]
strings = gets.split(':')

#数値に変換して時を示す変数に代入する
hours = strings[0].to_i

#数値に変換して分を示す変数に代入する
minutes = strings[1].to_i

#30分加算した時に60分を超えたとき
if minutes + 30 >= 60

#1時間増やす
   hours += 1

#30分減らす(30 - 60 )  
   minutes -= 30

#60分以上にならない時は30分加算する処理をする
  else minutes += 30
end

#時間と分が10より小さい時に0埋めして(01:02)のように0つきの時間と分を表現できるようにする
hours >= 10 ? hours : hours = "0#{hours}"
minutes >= 10 ? hours : minutes ="0#{minutes}"

#時間と分を:(コロン)を間に挟んで出力する 
puts hours.to_s + ":" + minutes.to_s

paizaCランクレベルアップ問題と解答(5) 数字の文字列操作(0埋め) Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題4 数字の文字列操作(0埋め) (paizaランク D 相当)

0 ~ 999 の整数 n が与えられます。 n が 3 桁の数である場合には n をそのまま出力し、 n が 2 桁の数である場合には n の先頭に 0 をひとつ、 1 桁の数である場合には n の先頭に 0 をふたつ加えたものを出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n

1 行目に整数 n が与えられます。

n

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
n を 3 桁で 0 埋めしたものを出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・0 ≤ n ≤ 999
入力例1
7
出力例1
007
入力例2
123
出力例2
123

解答  文字列として受け取らないとうまくいきません

#1行目の入力値(文字列)を変数に代入する 
strings = gets.chomp

#1桁の時00を追加する
  if strings.size == 1
     puts "00#{strings}"

#2桁の時0を追加する
  elsif strings.size == 2
     puts "0#{strings}"

#その他はそのまま出力する
  else puts strings
end

問題5 数字の文字列操作(時刻1) (paizaランク D 相当)

時刻を表す長さ 5 の文字列 S が “XX:XX” の形式で与えられます。入力された時刻を時と分に分け、時、分の順番で改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

S

1 行目に文字列 S が与えられます。

S

S は “XX:XX” という形をしており、 “:” の左側は時を、右側は分を表します。時や分が一桁である場合、十の位は 0 で埋められます。また、 00:00 から 23:59 までの 24 時間表記を採用しています。 

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
入力された時刻を時と分に分け、時、分の順番で改行区切りで出力してください(2行出力する)。その際、入力値の十の位が 0 である場合には一の位だけ出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
入力例1
12:34
出力例1
12
34
入力例2
01:03
出力例2
1
3

解答 (入力例1で解説)

#1行目の入力値を:(コロン)の部分で分割して変数に数値として代入する[12, 34]
strings = gets.split(':').map(&:to_i)

#出力する
puts strings

※ポイント (入力例2で解説)

入力値01:03の場合
strings = gets.split(‘:’).map(&:to_i) で

stringsは[1,3]となる。これは数値に変換する時0は無視されるため
あとはputs stringsで出力する

paizaCランクレベルアップ問題と解答(4) 整数と文字列 Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題1 整数と文字列 (paizaランク D 相当)

整数 n と、 n 個の整数 a_1, …, a_n が改行区切りで与えられるので、各 a_i (1 ≤ i ≤ n) の文字列としての長さを改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1
...
a_n

1 行目には整数 n が与えられ、 2 行目から (n + 1) 行目には n 個の整数 a_1, …, a_n が改行区切りで与えられます。 

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
各 a_i (1 ≤ i ≤ n) の文字列としての長さを改行区切りで出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≤ n ≤ 50
・各 a_i (1 ≤ i ≤ n) について、 0 ≤ a_i ≤ 10000
入力例1
2
10
100
出力例1
2
3
入力例2
3
1234
0
99
出力例2
4
1
2

解答 文字列として受け取らないとエラーになるので注意

#1行目の入力値(数値)を変数に代入する
n = gets.to_i
#n回繰り返し改行を打ち消してから受け取った入力値(文字列)の長さを出力する
n.times { puts gets.chomp.size }

または length と size は同じ(エイリアス)

#1行目の入力値(数値)を変数に代入する
n = gets.to_i
#n回繰り返し改行を打ち消してから受け取った入力値(文字列)の長さを出力する
n.times { puts gets.chomp.length }

問題2 部分文字列 (paizaランク D 相当)

文字 a と文字列 S が与えられるので、 S に a が含まれているかどうか判定し、含まれている場合には “YES” を、そうでない場合には “NO” を出力してください。

入力される値
入力は以下のフォーマットで与えられます。

a
S

1 行目に文字 a が、 2 行目に文字列 S が与えられます。入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
S に a が含まれている場合には “YES” を、そうでない場合には “NO” を出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・a, S はそれぞれ大文字または小文字のアルファベットからなる文字、文字列
・S の長さは 1 以上 10 以下
入力例1
Z
Kirishima
出力例1
NO
入力例2
a
paiza
出力例2
YES

解答

#1行目の入力値(数値)を変数に代入する
x = gets.chomp

#2行目の入力値を受け取り変数に代入
strings = gets.chomp

#変数xの文字列が存在したときYESと出力
  if strings.include?(x)
     puts "YES"

#変数xの文字列が存在しないときNOと出力する
  else puts "NO"
end

別解   3項演算子を使うと短く書くことができる

#1行目の入力値(文字列)を変数に代入する
x = gets.chomp

#2行目の入力値を受け取り変数xの文字列が存在したときYESと出力
#2行目の入力値を受け取り変数xの文字列が存在しないときNOと出力する
puts gets.chomp.include?(x) ? "YES" : "NO"

paizaCランクレベルアップ問題と解答(3) FINAL問題 標準入出力 Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

FINAL問題 標準入出力 (paizaランク C 相当)

毎年 5 月 1 日に、自分が運営している会社の社員一覧表を作成しています。表は年度ごとに更新され、社員の名前と年齢が載っています。
ところで、会社のメンバーは昨年度から全く変わらず、社員の誕生日は全員 7 月 7 日だったので、前年度の一覧表の年齢欄をそれぞれ +1 するだけで今年度の表が作れることにパイザ君は気づきました。

昨年度の一覧表が与えられるので、今年度の一覧表を出力してください。

入力される値
入力は以下のフォーマットで与えられます。

N
s_1 a_1
...
s_N a_N

1 行目には社員の数を表す整数 N が与えられ、2 行目 〜 (N + 1) 行目の各行では、社員の名前を表す文字列 s_i とその社員の昨年度の年齢を表す整数 a_i が半角スペース区切りで与えられます(1 ≤ i ≤ N)。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
入力された通りの順番で、社員 s_i の名前と、その社員の今年度の年齢を半角スペース区切りでN行出力してください。

s_1 (a_1 + 1)
...
s_N (a_N + 1)

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≤ N ≤ 50
・s_i(1 ≤ i ≤ N)は 1 文字以上 10 文字以下の文字列
・s_i(1 ≤ i ≤ N)の各文字は英小文字または英大文字または数字
・18 ≤ a_i ≤ 120(1 ≤ i ≤ N)
入力例1
1
Yamada 30
出力例1
Yamada 31
入力例2
3
Tanaka 18
Sato 50
Suzuki 120
出力例2
Tanaka 19
Sato 51
Suzuki 121

解答 (入力例1で解説)

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#各変数を空の配列で初期化する
name,age = [],[]

#n回繰り返す
n.times.map do |i|

#2行目の先頭の文字列を文字列としてnameに代入する(name = val)
#2行目の後ろの数値を数値として変数に代入する(このとき+1してから代入する:age = val.to_i + 1)
  gets.split.map.with_index { |val, i| i == 0 ? name = val : age = val.to_i + 1}

# 半角スペースを間に挟んで文字列(name)と文字列(age.to_s)を出力する
# age.to_sで文字列に変換する
  puts name + " " + age.to_s
end

 

paizaCランクレベルアップ問題と解答(2)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題4 入力の配列による保持 (paizaランク D 相当)

整数 n と n 個の数 a_1, …, a_n が改行区切りで与えられます。与えられた a_1, …, a_n の中で最も大きい数を出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1
...
a_n

1 行目には整数 n が与えられ、 2 行目から (n + 1) 行目にかけては n 個の整数 a_1, …, a_n が改行区切りで与えられます。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
a_1, …, a_n の中で最も大きい数を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について 1 ≦ a_i ≦ 50
入力例1
2
4
7
出力例1
7
入力例2
3
20
19
2
出力例2
20

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目以降の数値を配列として変数に代入する
numbers = readlines.map(&:to_i)

#配列の最大値を出力する
puts numbers.max

問題5 半角スペース区切りでの出力 (paizaランク D 相当)

整数 n が与えられるので、n 回、半角スペース区切りで paiza と出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n

1行目に整数nが与えられます。
入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
paiza と n 回、半角スペース区切りで出力してください。最後の paiza の後には半角スペースは入れず、改行を入れ、余計な文字、空行を含んではいけません。

paiza paiza ... paiza
条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50

入力例1
2
出力例1
paiza paiza
入力例2
3
出力例2
paiza paiza paiza

解答 (入力例1で解説)

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#['paiza'] * n →["paiza", "paiza"] #↑にしてから.join(' ')で半角スペースを間に挟んで結合して出力する puts (['paiza'] * n).join(' ')

問題6 改行区切りでの出力 (paizaランク D 相当)

整数 n が与えられ、その後に n 個の整数 a_1, …, a_n が半角スペース区切りで与えられるので、a_1, …, a_n をそのままの順番で改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1 a_2 ... a_n

1 行目には整数 n が与えられ、2 行目には半角スペース区切りの n 個の数 a_1, …, a_n が 1 行で与えられます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
a_1, …, a_n をそのままの順番で改行区切りで出力してください。

a_1
...
a_n

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について、1 ≦ a_i ≦ 50

入力例1
2
1 5
出力例1
1
5
入力例2
3
4 30 12
出力例2
4
30
12

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目の半角スペース刻みの入力値を受け取り変数に代入する
numbers = gets.split.map(&:to_i)

#出力する
puts numbers

paizaCランクレベルアップ問題と解答(1)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題1 単純な入出力 (paizaランク D 相当)

文字列 s が与えられるので s をそのまま出力してください。

入力される値
入力は以下のフォーマットで与えられます。

s

文字列 s が 1 行で与えられます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
入力された文字列をそのまま出力してください。

s

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・s は数字または大文字・小文字のアルファベットからなる長さ 1 以上 10 以下の文字列
入力例1
paiza
出力例1
paiza
入力例2
Paiza21
出力例2
Paiza21

解答  入力値を受け取り出力する

print gets

または

puts gets

問題2 複数行にわたる出力 (paizaランク D 相当)

整数 n が与えられるので、 n 回、改行区切りで paiza と出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n

整数 n が 1 行で与えられます。入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
n 回 paiza と改行区切りで出力してください。

paiza
...
paiza

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50

入力例1
2
出力例1
paiza
paiza
入力例2
5
出力例2
paiza
paiza
paiza
paiza
paiza

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#n回paizaを出力する
n.times { puts 'paiza' }

問題3 複数行にわたる入力 (paizaランク D 相当)

整数 n と n 個の整数 a_1, …, a_n が改行区切りで与えられるので、 a_1, …, a_n を与えられた順に、改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1
...
a_n

1 行目には整数 n が与えられ、2 行目から (n+1) 行目にかけては n 個の整数 a_1, …, a_n が改行区切りで与えられます。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
a_1, …, a_n を入力された順に改行区切りで出力してください。

a_1
...
a_n

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について 1 ≦ a_i ≦ 50
入力例1
2
1
2
出力例1
1
2
入力例2
3
10
5
39
出力例2
10
5
39

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#n回入力値(数値)を出力する
n.times { puts gets.to_i }

paizaLvアップ問題と解答(標準出力25)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

FINAL問題【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 (paizaランク C 相当)

自然数 H, W, A, B が与えられます。縦に H 行、横に W 行で計 H * W 個の (A, B) という形式で文字列を出力してください。ただし、横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。また、縦の文字列間で = を出力する際は、その上の行と文字数がそろうように出力します。また、A と B は 9 けたになるように半角スペースを数値の前(右詰め)に埋めて出力してください。

入力される値
H W A B

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの文字列を出力してください。

(A_{1,1}, B_{1,1}) | (A_{1,2}, B_{1,2}) ... (A_{1,W}, B_{1,W})
=================== ... ====================
(A_{2,1}, B_{2,1}) | (A_{2,2}, B_{2,2}) ... (A_{2,W}, B_{2,W})
=================== ... ====================
...
...
...
=================== ... ====================
(A_{H,1}, B_{H,1}) | (A_{H,2}, B_{H,2}) ... (A_{H,W}, B_{H,W})

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* H, W は 1 以上 100 以下
* A, B は 0 以上 999,999,999 以下

入力例1
2 3 7 8
出力例1
( 7, 8) | ( 7, 8) | ( 7, 8)
========================================================================
( 7, 8) | ( 7, 8) | ( 7, 8)
入力例2
3 2 999999999 0
出力例2
(999999999, 0) | (999999999, 0)
===============================================
(999999999, 0) | (999999999, 0)
===============================================
(999999999, 0) | (999999999, 0)

解答 (出力例2で解説します)

#1行目の入力値を数値として各変数に代入する 
h, w, a, b = gets.split.map(&:to_i)

#空の配列で初期化する 
answer = []

#(999999999,           0) ←のようにするために式展開を利用する 
#{"%9d" % a}, #{"%9d" % b}と書くことで9桁の半角スペース埋めを表現できる
strings = ["(#{"%9d" % a}, #{"%9d" % b})"]

#縦の回数分繰り返す
h.times do |i|

#(999999999,           0) | (999999999,          0)
#↑のようにするためstringsを横(w)の回数で掛けて.join(" | ")でつなぎanswerに挿入する 
  answer << ( strings * w).join(" | ")

#"="を間に挟む(ループの最後は"="を挟まないようにする) 
  answer << "=" * (25 * w - 3) if i + 1 != h
end

# 出力する
puts answer

paizaLvアップ問題と解答(標準出力24)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題4 ペアの数値の入った表を罫線入りで出力 (paizaランク C 相当)

自然数 H, W, A, B が与えられます。縦に H 行、横に W 行で計 H * W 個の (A, B) という形式の文字列を出力してください。ただし、横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。また、縦の文字列間で = を出力する際は、その上の行と文字数が等しくなるように出力します。

入力される値
H W A B

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの文字列を出力してください。

(A_{1,1}, B_{1,1}) | (A_{1,2}, B_{1,2}) ... (A_{1,W}, B_{1,W})
=================== ... ====================
(A_{2,1}, B_{2,1}) | (A_{2,2}, B_{2,2}) ... (A_{2,W}, B_{2,W})
=================== ... ====================
...
...
...
=================== ... ====================
(A_{H,1}, B_{H,1}) | (A_{H,2}, B_{H,2}) ... (A_{H,W}, B_{H,W})

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* H, W は 1 以上 100 以下
* A, B は 0 以上 9 以下
入力例1
2 3 7 8
出力例1
(7, 8) | (7, 8) | (7, 8)
========================
(7, 8) | (7, 8) | (7, 8)
入力例2
3 2 0 0
出力例2
(0, 0) | (0, 0)
===============
(0, 0) | (0, 0)
===============
(0, 0) | (0, 0)

解答  (入力例1で解説)

#1行目の入力値を数値として各変数に代入する
h, w, a, b = gets.split.map(&:to_i)

#空の配列で初期化する
answer = []
#(7, 8) ←ようにするために式展開を利用する
strings = ["(#{a}, #{b})"]

#縦の回数分繰り返す
h.to_i.times do |i|

#(7, 8) | (7, 8) | (7, 8)
#↑のようにするためstringsを横の回数で掛けて(" | ")でつなぎanswerに挿入する
  answer << (strings * w).join(" | ")

#ループの最後以外に"="を間に挟む
  answer << "=" * (9 * w - 3) if i + 1 != h
end

# 出力する
puts answer

paizaLvアップ問題と解答(標準出力23)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました

問題3 九九表を罫線入りで出力 (paizaランク C 相当)

九九表を、横の数値間では | (半角スペース 2 つとバーティカルライン)、縦の数値間では = で区切って出力してください。
ただし、数値を出力する際は 2 けたになるよう半角スペース埋めで出力します。また、縦の数値間で = を出力する際は、その上の行と文字数が等しくなるように出力します。

入力される値
なし

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの文字列を出力してください。

S1
S2
S3
...
S9

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
なし

解答

#九九の計算結果に" | "でつないで末尾に"\n"(改行コード)を追加する
line = 1.upto(9).map do |i|

# i 段の答えを" | "で連結し末尾に"\n"(改行コード)を追加
  1.upto(9).map { |j| "%2d" % (i * j) }.join(" | ") + "\n"
  end

# 配列 line を "=" * 42 + "\n"(改行コード)でつなぐ
answer = line.join("=" * 42 + "\n")

# 出力する
puts answer

または

#空の配列を作成
answer = []

#9回繰り返す
9.times do |i|

#9回繰り返す
  9.times do |j|

# 前後に半角スペース" "を配置して
# 1 * 1, 1 * 2, 1 * 3, 1 * 4, 1 * 5, 1 * 6, 1 * 7, 1 * 8, 1 * 9,
# 2 * 1, 2 * 2, 2 * 3・・・,と計算結果を配列に挿入していく。
    answer << " " + ((i + 1) * (j + 1)).to_s + " "

# ループの8回まで|(パイプ)を付加する 
    answer << ('|') if j <= 7

# ループの最後(9の倍数回)に"\n"(改行コード)を付加する
    answer << "\n" if j == 8

  end

# 1の段と2の段の間、2の段と3の段の間のように、段の間に=42個と改行コード"\n"を付加する
    answer << ("=" * 42) + "\n"
  end

# 繋げて出力する
puts answer.join