コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 013 A – A

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

■問題

●出典

AtCoder Beginner Contest 013のA問題
https://atcoder.jp/contests/abc013/tasks/abc013_1

●問題文

高橋君はとても英語が苦手で、アルファベットもまだ覚えきれていません。
そこで、高橋君のために、入力として与えられたアルファベットが A から数えて何番目のアルファベットかを求めるプログラムを作成してください。
ただし、高橋君は 5 より大きい数を知らないので、与えられるアルファベットは A, B, C, D, E のいずれかです。また、A 自身は A から数えて 1 番目であるとします(0 番目ではありません)。

●入力

入力は以下の形式で標準入力から与えられる。

X

1 行目には、英大文字のアルファベット X が与えられる。X は A, B, C, D, E のいずれかである。

●出力

X が A から数えて何番目のアルファベットであるかを 1 行に出力せよ。
出力の末尾には改行をいれること。

■回答

●愚直に書く

これぞ愚直という感じだけど、5つならcaseで行けるか。

x = gets.chomp
case x
when 'A' then
  puts 1
when 'B' then
  puts 2
when 'C' then
  puts 3
when 'D' then
  puts 4
when 'E' then
  puts 5
end

通った!

●リファクタリング/別アプローチ

もうちょっとスマートにしたい。なんか色々調べて遠回りしてしまったけど、indexメソッドという今回の問題に合ったメソッドを見つけた。インデックスだと1番目で0が返ってくるから1を足す必要がある。

x = gets.chomp
s = "ABCDE"
puts s.index(x) + 1

通った!

●他の方の回答例

上位の方々のコード、短っっ!

p gets.ord-64

↑これは一体なんなんだ汗。
なるほど、ordメソッドで文字コードの数字が返ってくるから、Aが1になるように辻褄合わせで64を引いていると。ordメソッドというのを初めて見た。

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

ザ・愚直な答えからindexメソッドを使う答えにできたのは良かった。ordメソッドは知らなかったので、こうやって1つずつ覚えていくしかない。
なんか他にも方法はありそう。正規表現とかrangeとか…?