0
0

paizaラーニング解答: 二重ループメニュー[Ruby]

Posted at

二重ループメニュー

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"
0
0
0

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