二重ループメニュー
STEP: 1 指定された数字までの出力
n = gets.to_i
puts (1..n).to_a.join(' ')
STEP: 2 指定された数字までの出力
n = gets.to_i
puts (1..n).to_a
STEP: 3 指定された行数の数字の出力
n = gets.to_i
n.times { puts "1 2 3 4 5" }
STEP: 4 指定された範囲・行数の数字の出力
n, k = gets.split.map(&:to_i)
k.times { puts (1..n).to_a.join(' ') }
STEP: 5 二次元配列の出力
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.chomp.split }
n.times { |i| puts a[i].join(' ') }
STEP: 6 二次元配列での要素の検索
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.split.map(&:to_i) }
(0...n).each do |i|
(0...k).each do |j|
if a[i][j] == 1
puts "#{i + 1} #{j + 1}"
exit
end
end
end
1を検索出来たらexitで処理を終わらせていますが、なくても動作します。
STEP: 7 二次元配列の最大の要素
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.split.map(&:to_i) }
ans = 0
(0...n).each do |i|
(0...k).each do |j|
ans = [a[i][j], ans].max
end
end
puts ans
STEP: 8 二次元配列の行ごとの和
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.split.map(&:to_i) }
(0...n).each do |i|
puts a[i].sum
end
STEP: 9 さまざまな長さの配列の和
n = gets.to_i
a = Array.new(n) { gets.split.map(&:to_i) }
(0...n).each do |i|
a[i].shift
puts a[i].sum
end
STEP: 10 階段の出力
n = gets.to_i
(1..n).each do |i|
puts (1..i).to_a.join(' ')
end
FINAL問題 二重ループ:基本編 積の最大
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
ans = -1000000000
a.each do |i|
b.each do |j|
ans = [i * j, ans].max
end
end
puts ans
STEP: 1 行列の転置
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.split.map(&:to_i) }
a = a.transpose
a.each { |i| puts i.join(' ') }
transposeで行列の転置ができます。
STEP: 2 かけ算表
n = gets.to_i
a = gets.split.map(&:to_i)
b = Array.new(n) { [0] * n }
(0...n).each do |i|
(0...n).each do |j|
b[i][j] = a[i] * a[j]
end
end
b.each { |i| puts i.join(' ') }
STEP: 3 素数の個数
n = gets.to_i
ans = 0
(2..n).each do |i|
is_prime = true
(2..Math.sqrt(i).to_i).each do |j|
if i % j == 0
is_prime = false
break
end
end
ans += 1 if is_prime
end
puts ans
paizaラーニングの講座で詳しく取り上げられています。
STEP: 4 log2
n = gets.to_i
ans = 0
(1..n).each do |i|
int = i
while int.even?
int /= 2
ans += 1
end
end
puts ans
paizaの解説をよく読まないと難しいかも。
STEP: 5 スーパー鳩時計
(0..23).each do |i|
(0..59).each do |j|
if (i + j) % 15 == 0
puts "FIZZBUZZ"
elsif (i + j) % 3 == 0
puts "FIZZ"
elsif (i + j) % 5 == 0
puts "BUZZ"
else
puts ""
end
end
end
つまづきやすいポイントとして、該当の倍数でない場合の処理があると思います。
問題文に「いずれにも当てはまらなかった場合は鳴きません。」とありますが、期待する出力には1分ごとの鳴き声を出力するように書かれています。
そのため該当の倍数でない場合puts ""等で改行する必要があります。
STEP: 6 格子点
ans = 0
(1..98).each do |i|
(1..98 - i).each do |j|
if i ** 3 + j ** 3 < 100000
ans = [i * j, ans].max
end
end
end
puts ans
STEP: 7 お金の支払い
x, y, z = gets.chomp.split.map(&:to_i)
ans = z
(0..z / x).each do |num_x|
(0..z / y).each do |num_y|
if num_x * x + num_y * y <= z
one_yen = z - num_x * x - num_y * y
ans = [num_x + num_y + one_yen, ans].min
end
end
end
puts ans
FINAL問題 二重ループ:活用編 三角形の探索
n = gets.to_i
ans = false
(1..n).each do |b|
(1..n - b).each do |c|
if (n - b - c) ** 2 == b ** 2 + c **2
ans = true
break
end
end
end
puts ans ? "YES" : "NO"