文字列処理メニュー
paizaのスキルチェックや他の問題集でもよく使うメソッドが登場しますので、初心者向けのメニューでした(一部問題を除く)。
文字列の出力
puts "paiza"
文字列の受け取り
s = gets.chomp
puts s
i 文字目の出力
s = gets.chomp
i = gets.to_i
puts s[i-1]
文字列の条件判定
s = gets.chomp
puts s == "paiza" ? "YES" : "NO"
文字列の文字数
s = gets.chomp
puts s.length
文字の検索
s = gets.chomp
c = gets.chomp
puts s.index(c) + 1
indexメソッドは左端から見て最初に見つかった部分文字列のインデックスを返します。
文字列の連結
n = gets.to_i
s = ""
n.times { s += gets.chomp }
puts s
部分文字列
s = gets.chomp
i, j = gets.split.map(&:to_i)
puts s[(i - 1)..(j - 1)]
文字列の挿入
s = gets.chomp
t = gets.chomp
n = gets.to_i
puts s.insert(n, t)
insertメソッドでn番目の文字の直前にtを挿入します。
文字列の書き換え
s = gets.chomp
i, c = gets.chomp.split
s[i.to_i - 1] = c
puts s
文字列から数値への変換
s = gets.chomp
s = s.to_i
puts s - 813
数値から文字列への変換
x = gets.to_i
y = gets.to_i
n = gets.to_i
puts (x + y).to_s[n-1]
大文字から小文字への変換
s = gets.chomp
puts s.downcase
小文字から大文字への変換
s = gets.chomp
puts s.upcase
大文字小文字の反転
s = gets.chomp
puts s.swapcase
文字列の検索
s = gets.chomp
t = gets.chomp
puts s.include?(t) ? "YES" : "NO"
文字列の反転
s = gets.chomp
puts s.reverse
回文判定
s = gets.chomp
puts s == s.reverse ? "YES" : "NO"
文字列の分割
s = gets.chomp.split(',')
puts s
日時データの変換その1
s = gets.chomp.split(/[\/:]/)
puts s
splitメソッドは正規表現も利用可能。
端にある/は正規表現の開始と終わり
[]内にあるどれかにマッチ
\はメタ文字/のエスケープ
日時データの変換その2
s = gets.chomp.split(/[\/: ]/)
puts s
数値判定
s = gets.chomp
puts s.match?(/^\d+$/) ? "YES" : "NO"
^は文字列の行頭から
\dは10進数の数字[0-9]
+は1回以上のメタ文字
$は文字列の行末まで
重複の削除
s = gets.chomp.split('')
puts s.uniq.join('')
パスワード作成
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個の文字を代入してみました。
もっときれいな書き方があると思いますが、思いついたのはこちら。
表記の訂正
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 桁)
s = gets.chomp
puts eval(s)
evalメソッドは引数として与えた文字列をプログラムとして実行します。
数式の計算
s = gets.chomp
puts eval(s)
巨大な数の足し算(繰り上がりなし)
s = gets.chomp
t = gets.chomp
(s.length).times do |i|
print s[i].to_i + t[i].to_i
end
単にs + tでもオーバーフローしませんでしたが、問題の意図的には愚直に文字列 → 数値の変換を求められています。
巨大な数の足し算
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メソッドで逆から添え字を数えていきます。
巨大な数のかけ算
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と出力して終了する例外処理を加える。