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

# 二重ループメニュー
https://paiza.jp/works/mondai/double_roop_problems/problem_index?language_uid=ruby
## STEP: 1 指定された数字までの出力
```ruby
n = gets.to_i
puts (1..n).to_a.join(' ')
```

## STEP: 2 指定された数字までの出力
```ruby
n = gets.to_i
puts (1..n).to_a
```

## STEP: 3 指定された行数の数字の出力
```ruby
n = gets.to_i
n.times { puts "1 2 3 4 5" } 
```

## STEP: 4 指定された範囲・行数の数字の出力
```ruby
n, k = gets.split.map(&:to_i)
k.times { puts (1..n).to_a.join(' ') } 
```

## STEP: 5 二次元配列の出力
```ruby
n, k = gets.split.map(&:to_i)
a = Array.new(n) { gets.chomp.split }
n.times { |i| puts a[i].join(' ') }
```

## STEP: 6 二次元配列での要素の検索
```ruby
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 二次元配列の最大の要素
```ruby
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 二次元配列の行ごとの和
```ruby
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 さまざまな長さの配列の和
```ruby
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 階段の出力
```ruby
n = gets.to_i
(1..n).each do |i|
    puts (1..i).to_a.join(' ')
end
```

## FINAL問題 二重ループ：基本編　積の最大
```ruby
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 行列の転置
```ruby
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 かけ算表
```ruby
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 素数の個数
```ruby
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ラーニングの講座で詳しく取り上げられています。

https://paiza.jp/works/algorithm-java/new-primer/algorithm-java-new-primer-6
## STEP: 4 log2
```ruby
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 スーパー鳩時計
```ruby
(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 格子点
```ruby
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 お金の支払い

```ruby
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問題 二重ループ：活用編 三角形の探索
```ruby
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"
```