Ruby 練習問題 随時追加予定 (Range, Arrayとか)

# はじめに
みなさん、こんにちは **torihazi**です

最近、ReactとかRailsばっか触っていて

純粋なRubyに触れることを忘れていました。

初心者だからすぐに忘れるし、ひたすら爆速でやり続けるしかないと思うので

練習問題作ってやってみました！

解説とかは自分で色々調べてやってみてください

別解とかあれば是非是非！！

では行ってみましょう！！

# 環境について
Docker使っています!
ローカルでやるか Dockerでやるかはお任せします！
Rubyの単純な実行環境をDockerで作るにはどうしたらいいのか？も
含めて色々勉強になったのであえて隠しちゃってます！
各自自分で最初から作るかコピーなりしちゃってください！
めんどくさい人はPaiza.ioとかでもいいかと。

<details><summary>Dockerfile</summary>

```Dockerfile:Dockerfile
FROM ruby:3.2.0
WORKDIR /app
COPY . .
```

</details>

<details><summary>docker-compose.yml</summary>

```yaml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    volumes:
      - .:/app
    tty: true
    stdin_open: true
```

</details>

<details><summary>コンテナ立ち上げ方</summary>

```
docker compose build
docker compose run --rm app bash
```

</details>

:::note info
お知らせ
下記コード、もっといいのあるとか
山のようにあると思います！
コメント欄に指摘いただいているのでそちらもぜひ参照してください！！
自分のはあえて残してます！
:::

# 初級
## 1問目

1から10までの数字を含む配列を作成し、その中の偶数のみを新しい配列として取り出してください。

<details><summary>解答&結果</summary>

```rb
nums = (1..10).to_a.filter { |num| num.even?}
p nums

[2, 4, 6, 8, 10]
```

</details>

## 2問目
'a'から'z'までのアルファベットを含む範囲オブジェクトを作成し、その中から母音（a, e, i, o, u）のみを抽出して配列にしてください。

<details><summary>解答&結果</summary>

```rb
vowel = ("a".."z").grep(/[aeiou]/)
p vowel

["a", "e", "i", "o", "u"]
```

</details>

## 3問目
1から20までの数字を含む配列を作成し、その中から3の倍数と5の倍数を除いた新しい配列を作成してください。

<details><summary>解答&結果</summary>

```rb
numbers = (1..20).to_a.filter { |num| !(num % 3 == 0 || num % 5 == 0 ) }
p numbers

[1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19]
```

</details>

## 4問目
次の配列 [1, 2, 3, 4, 5] の各要素を2倍にした新しい配列を作成してください。

<details><summary>解答&結果</summary>

```rb
doubles = (1..5).map { |num| num * 2}
p doubles

[2, 4, 6, 8, 10]
```

</details>

## 5問目
1から100までの範囲から、10個のランダムな数字を重複なく選んで配列にしてください。

<details><summary>解答&結果</summary>

```rb
hundreds = (1..100).to_a.sample(10)
p hundreds

[49, 6, 32, 20, 85, 31, 61, 30, 47, 58]
```

</details>

# 中級
## 1問目
1から100までの数字の配列から、素数のみを抽出し、その素数を逆順にソートした新しい配列を作成してください。

<details><summary>解答&結果</summary>

```rb
require 'prime'
reverse_prime_numbers = (1..100).filter { |num| num.prime?}.reverse
p reverse_prime_numbers

[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]
```

</details>

## 2問目
次の文字列配列 ["apple", "banana", "cherry", "date", "elderberry"] から、各単語の先頭の文字を使って新しい文字列を作成し、それを逆順にしてください。

<details><summary>解答&結果</summary>

```rb
chars = ["apple", "banana", "cherry", "date", "elderberry"]
reverse_new_chars = chars.map { |char| char.split("").first }.reverse.join
p reverse_new_chars

"edcba"
```

</details>

## 3問目
1から50までの数字の配列を作成し、3の倍数の場合は "Fizz"、5の倍数の場合は "Buzz"、3と5の両方の倍数の場合は "FizzBuzz"、それ以外の場合は数字そのものを要素とする新しい配列を作成してください。

<details><summary>解答&結果</summary>

```rb
nums = (1..50).to_a.map do |num|
  if num % 15 == 0
    "FizzBuzz"
  elsif num % 3 == 0
    "Fizz"
  elsif num % 5 == 0
    "Buzz"
  else
    num
  end
end
p nums

[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29, "FizzBuzz", 31, 32, "Fizz", 34, "Buzz", "Fizz", 37, 38, "Fizz", "Buzz", 41, "Fizz", 43, 44, "FizzBuzz", 46, 47, "Fizz", 49, "Buzz"]
```

</details>

## 4問目
次の2次元配列 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] を転置（行と列を入れ替え）した新しい2次元配列を作成してください。

<details><summary>解答&結果</summary>

```rb
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
p "before"
matrix.map {|x| p x}
transposed_matrix = matrix.transpose
p "after"
transposed_matrix.map { |x| p x}

"before"
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
"after"
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
```

</details>

## 5問目
1から1000までの数字の中から、各桁の数字の3乗の和が元の数字と等しいものを全て見つけ、配列として返してください。（例：153 = 1^3 + 5^3 + 3^3）

<details><summary>解答&結果</summary>

```rb
def break_down_num num
  num.to_s.split("").map(&:to_i)
end

def cube_elements_of_array num
  digits = break_down_num(num)
  digits.sum { |result| result**3}
end

numbers = (1..1000).filter { |num| num == cube_elements_of_array(num) }
p numbers

[1, 153, 370, 371, 407]
```

</details>

# 終わりに
これ以上やると競技プログラミングの世界に入り込みそうだったのでやめておきます。

最後の問題はアームストロング数とかナルシシスト数とかいうらしいですね。

あと中級レベルまでは知っておいた方が良いと思ったので

今後も色々作っていこうかと思います。

もし、出力違うよ、なんてことがあったら

ぜひ教えてください！

一応確認したのであっているとは思いますが。

あと別解もあったらお願いします！

あとこのgithubです。
まぁ使わないとは思います。
https://github.com/torihazi/ruby_practice