Rubyにおける入出力覚書

## 入力
基本は`gets`を利用。改行を削除する必要がある場合は`gets.chomp`を使う必要がある。基本文字列として扱われるので、数字の場合は`to_i`メソッドを使う必要あり。文字列として受け取りたい場合は`to_s`を利用。

```Ruby
# スペース区切りで与えられた数字をリストに格納
numbers = gets.chomp.split.map(&:to_i)
# 個別の変数に格納する場合も同様(入力数が確定している必要あり)
a, b = gets.chomp.split.map(&:to_i)
```

## その他必要に応じて調べたメソッドや処理方法
### 複数行に渡る入力を受け取る
先頭行に後に続く行数M、以下にM行の入力が与えられる場合。

```
# 例
3
1 2
2 3
3 4
```

```ruby
m = gets.chomp.to_i
m.times do
  numbers = gets.chomp.split.map(&:to_i)
  p numbers
end
```

### 計算や確認用メソッドなど
```ruby
2 ** 3 #=> 8 #累乗
0.zero? #=>true  #レシーバが0であるか
2.even? #=>true  #レシーバが偶数であるか
2.odd? #=>false  #レシーバが奇数であるか

```

### 四捨五入(丸め操作)
```ruby
# 四捨五入する(桁数指定可)
puts 1.6.round  #=>2
puts 1.4.round  #=>1
puts 150.round(-2) #=>200
puts 1500.round(-2) #=>1500
puts 1500.round(-3) #=>2000
puts -1.5.round #=>-2

# 自身と等しいか、自身より大きい整数のうち最小のものを返す
puts 56.5.ceil #=>57

# 自身と等しいか、自身より小さい整数のうち最大のものを返す
puts 56.5.floor  #=>56

# 自身から0までの整数で、自身に最も近いものを返す
puts 22.2.truncate #=>22
puts -1.5.truncate #=>-1
```

### 配列操作
```ruby
array.unshift("hoge")  #配列の先頭へ追加
array.push("hoge")  #配列の末尾へ追加
array.shift  #配列の先頭から削除
array.pop  #配列の末尾から削除
array1 += array2  #2つの配列の要素をつなげた配列を作る
array1 -= array2  #後ろの配列の要素を除いた配列を作る
array.uniq  #配列から重複した値を取り除く(新しい配列を返す)
array.uniq!  #破壊的に重複した値を取り除く(自分自身を変更)
array.sample  #配列内の要素をランダムに取得
array.shuffle  #配列内の要素をランダムに並び替え
array.sort  #配列内の要素を昇順に並び替え(小さい順、A→Z)
array.reverse  #配列内の要素を逆順にする
array.sort.reverse  #配列内の要素を降順に並び替え
```
#### 条件に合う要素を抽出する(合うものがない場合空の配列が返る)

```ruby
[1, 2, 3, 4, 5].select { |n| n % 2 == 0 } #=> [2, 4]
{:a => 1, :b => 2}.select { |k, v| v == 1 } #=> {:a => 1}
```
#### 条件に合わない要素を抽出する(合うものがない場合空の配列が返る)

```ruby
[1, 2, 3, 4, 5].reject { |n| n % 2 == 0 } #=> [1, 3, 5]
{:a => 1, :b => 2}.reject { |k, v| v == 1 } #=> {:b => 2}
```
#### 条件に合う最初の要素を返す(ない場合はnilが返る)

```ruby
[5, 4, 3, 2, 1].find{ |n| n % 2 == 0 } #=> 4
# 要素のインデックス番号を返す
[5, 4, 3, 2, 1].find_index{ |n| n % 2 == 0 } #=> 1
```

#### 条件に合う要素の数を返す
```ruby
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
puts numbers.count {|item| item % 2 == 0 } #=> 4
```

#### 便利なやつ

```ruby
array.each_slice(3).map.to_a  #配列の要素を指定数で分割する
"12345".chars.map(&:to_i)  #文字列を配列に分解
number.to_s.chars.map(&:to_i)  #数字を受け取って一桁ずつ配列に分解
# コメントでより良い方法を教えて頂きました
1024.digits #=> [4, 2, 0, 1]
1024.digits.reverse #=> [1, 0, 2, 4]
```

### スライス
```ruby
animals = ["dog", "cat", "mouse", "rabbit", "horse"]
p animals.slice(3)  #=> "rabbit"
p animals.slice(1, 3)  #=> ["cat", "mouse", "rabbit"]
p animals.slice(2..4)  #=> ["mouse", "rabbit", "horse"]
```
### ループ処理
インデックス番号付きのループ

```ruby
array.each_with_index do |a, i|
  puts "#{i}. #{a}"
end
```

### ハッシュ操作
配列と使えるメソッドが重複することが多い。ハッシュ独自の物について。

```ruby
hash.default = 0  #存在しないキーを取得しようとした際のnilを0に変更
hash3 = hash1.merge(hash2)  #hash1とhash2をまとめた新しいhash3を作る
hash.delete(:hoge)  #キーhogeと対の値を削除
```
繰り返し処理

```ruby
#通常の繰り返し
hash.each do |key, value|
  puts "#{key} #{value}"
end

#キーのみ取り出し
hash.each_key do |key|  #ブロック変数は1つでいい
  puts key
end

#バリューのみ取り出し
hash.each_value do |value|  #ブロック変数は1つでいい
  puts value
end
```

### mapの扱い
配列の各要素を変換するメソッド

```ruby
result = [1, 2, 3].map do |x|
  x * 2
end
p result #=> [2, 4, 6]
```

### 後置if, unlessで行数削減
単純な条件の場合、`if`,`unless`は処理の後に書くことで行数を削減できる。`else`等が必要な場合はちゃんと書く方がいい。

```ruby
m = 1
puts "even" if m.even? #=> falseなので実行されない
puts "odd" unless m.even? #=> trueなので実行される
```

### 出力の時に使いがちな`join`
```ruby
array.join  #リスト内の要素を連結
array.join("hoge")  #リスト内の要素に引数を挟んで連結
["hoge", "fuga", "piyo"].join(" ") #=> hoge fuga piyo
```