paizaラーニング解答: 文字列処理メニュー[Ruby]

# 文字列処理メニュー
https://paiza.jp/works/mondai/string_primer/problem_index?language_uid=ruby

paizaのスキルチェックや他の問題集でもよく使うメソッドが登場しますので、初心者向けのメニューでした（一部問題を除く）。
## 文字列の出力
```ruby
puts "paiza"
```

## 文字列の受け取り
```ruby
s = gets.chomp
puts s
```

## i 文字目の出力
```ruby
s = gets.chomp
i = gets.to_i
puts s[i-1]
```

## 文字列の条件判定
```ruby
s = gets.chomp
puts s == "paiza" ? "YES" : "NO"
```

## 文字列の文字数
```ruby
s = gets.chomp
puts s.length
```

## 文字の検索
```ruby
s = gets.chomp
c = gets.chomp
puts s.index(c) + 1
```
indexメソッドは左端から見て最初に見つかった部分文字列のインデックスを返します。
## 文字列の連結
```ruby
n = gets.to_i
s = ""
n.times { s += gets.chomp }
puts s
```

## 部分文字列
```ruby
s = gets.chomp
i, j = gets.split.map(&:to_i)
puts s[(i - 1)..(j - 1)]
```

## 文字列の挿入
```ruby
s = gets.chomp
t = gets.chomp
n = gets.to_i
puts s.insert(n, t)
```
insertメソッドでn番目の文字の直前にtを挿入します。
## 文字列の書き換え
```ruby
s = gets.chomp
i, c = gets.chomp.split
s[i.to_i - 1] = c
puts s
```

## 文字列から数値への変換
```ruby
s = gets.chomp
s = s.to_i
puts s - 813
```

## 数値から文字列への変換
```ruby
x = gets.to_i
y = gets.to_i
n = gets.to_i
puts (x + y).to_s[n-1]
```

## 大文字から小文字への変換
```ruby
s = gets.chomp
puts s.downcase
```

## 小文字から大文字への変換
```ruby
s = gets.chomp
puts s.upcase
```

## 大文字小文字の反転
```ruby
s = gets.chomp
puts s.swapcase
```

## 文字列の検索
```ruby
s = gets.chomp
t = gets.chomp
puts s.include?(t) ? "YES" : "NO"
```

## 文字列の反転
```ruby
s = gets.chomp
puts s.reverse
```

## 回文判定
```ruby
s = gets.chomp
puts s == s.reverse ? "YES" : "NO"
```

## 文字列の分割
```ruby
s = gets.chomp.split(',')
puts s
```

## 日時データの変換その１
```ruby
s = gets.chomp.split(/[\/:]/)
puts s
```
splitメソッドは正規表現も利用可能。
端にある/は正規表現の開始と終わり
[]内にあるどれかにマッチ
\はメタ文字/のエスケープ

## 日時データの変換その２
```ruby
s = gets.chomp.split(/[\/: ]/)
puts s
```

## 数値判定
```ruby
s = gets.chomp
puts s.match?(/^\d+$/) ? "YES" : "NO"
```
^は文字列の行頭から
\dは10進数の数字[0-9]
+は1回以上のメタ文字
$は文字列の行末まで
## 重複の削除
```ruby
s = gets.chomp.split('')
puts s.uniq.join('')
```

## パスワード作成
```ruby
n = gets.to_i
q = gets.to_i
array = []
q.times do
    a, b = gets.chomp.split
    a = a.to_i
    array << [a, b]
end
c = gets.chomp
c *= n
q.times do |i|
    c[array[i][0] - 1] = array[i][1] 
end
puts c
```
既定の文字数をcで埋め、その後q個の文字を代入してみました。
もっときれいな書き方があると思いますが、思いついたのはこちら。
## 表記の訂正
```ruby
s = gets.chomp
if s.index(".") == nil
    # 整数の場合
    i = 0
    while i < s.length
        break if s[i] != "0"
        i += 1
    end
    
    if i == s.length
        # 全ての数字が0であるときには0を出力する
        puts 0
    else
        puts s[i..-1]
    end
else
    # 小数の場合
    ans = ""
    start = 0
    s.each_char.with_index do |char, i|
        if char != "0"
            if char == "."
                ans += "0"
            end
            start = i
            break
        end
    end
    
    last = 0
    s.each_char.with_index do |char, i|
        if char != "0"
            last = i
        end
    end
    
    first_dot = s.index(".")
    (start..last).each do |i|
        if s[i] != "." || i == first_dot
            ans += s[i]
        end
    end
    puts ans
end
```
paizaの模範解答と方針を読みながら取り組むといいですね。
## 数式の計算（ 1 桁）
```ruby
s = gets.chomp
puts eval(s)
```
evalメソッドは引数として与えた文字列をプログラムとして実行します。
## 数式の計算
```ruby
s = gets.chomp
puts eval(s)
```

## 巨大な数の足し算(繰り上がりなし)
```ruby
s = gets.chomp
t = gets.chomp
(s.length).times do |i|
    print s[i].to_i + t[i].to_i
end
```
単にs + tでもオーバーフローしませんでしたが、問題の意図的には愚直に文字列 → 数値の変換を求められています。
## 巨大な数の足し算
```ruby
s = gets.chomp
t = gets.chomp
ans = ""
up = 0

(s.length - 1).downto(0) do |i|
    add = s[i].to_i + t[i].to_i + up
    up = add / 10
    ans += (add % 10).to_s
end
ans += up.to_s if up > 0
ans = ans.reverse
puts ans
```
繰り上がりを考慮する必要があり、downtoメソッドで逆から添え字を数えていきます。

## 巨大な数のかけ算
```ruby
s = gets.chomp
t = gets.to_i
if t == 0
    puts 0
    exit
end
ans = ""
up = 0

(s.length - 1).downto(0) do |i|
    add = s[i].to_i * t + up
    up = add / 10
    ans += (add % 10).to_s
end
ans += up.to_s if up > 0
ans = ans.reverse
puts ans
```
tが0の場合は0と出力して終了する例外処理を加える。