コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 011 B – 名前の確認

■はじめに

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

●B問題も始めた

少し難易度を上げてB問題にも取り組んでみることにした。その結果、昨日までつけていたブログタイトル冒頭の【Ruby基礎000】とタイトル後半の「000 A」の部分で数字のズレが発生してしまう涙。なので、冒頭の方は【Ruby基礎】だけに変更する。

■問題

●出典

AtCoder Beginner Contest 011のB問題
https://atcoder.jp/contests/abc011/tasks/abc011_2

●問題文

新米プログラマーであるあなたは、簡単な文字列操作を行うプログラムを作成する仕事を任されました。 名前が入力として与えられるので、正しいフォーマットに直すプログラムです。
正しい名前のフォーマットは、以下の通りです。

  • 1 文字目は大文字アルファベット
  • 2 文字目以降は小文字アルファベット

要件を満たすプログラムを作成してください。

●入力

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

S
  • 1 行目には、名前 S(1≦∣S∣≦12) が与えられる。
  • S に含まれる文字は、全て小文字、もしくは大文字のアルファベットであることが保障されている。

●出力

正しいフォーマットに変換した文字列を 1 行で出力せよ。

■回答

●愚直に書く

これは、前に june29 さんとペアプロしてもらった時に教えていただいたcapitalizeメソッドをそのまま使えるのでは…!

s = gets.chomp
puts s.capitalize

通った!

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

例の如く、変数を使わないくらいしか思いつかない。
今回はcapitalizeメソッドのおかげで即できたけど、capitalizeメソッドを知らなかったら、おそらく

  • 「小文字にする」「大文字にする」メソッドはあるだろうと推測し、探す
  • 1文字目だけ大文字にして残りを小文字にする、みたいなロジックを考える

みたいな手順を踏んでいたと思う。
(というかjune29さんとペアプロしてた時にそういうコードを僕が書いたのちにcapitalizeメソッドを教えてもらったような気がする)
書いてみた。

s = gets.chomp
puts s[0].upcase + s[1..s.length].downcase

これも通った!capitalizeメソッドのが明快だけど、こういう愚直な手段もできておいて損はない、かな?

●他の方の回答例

上位はやはりcapitalizeメソッドを使っていて、少し下の方に行くと上述の別解の方もいた。

●出てきたメソッド等

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

■振り返りなど

過去の経験が役に立った。普通に本で読んだくらいだと忘れてしまうことも多いので、ペアプロをするとか「何らかのイベントで覚えたことは忘れにくい」と感じた。
もっというと、「記憶が呼び覚ましやすいようにイベント(ペアプロに限らず、例えばブログで取り上げるとかTwitterでつぶやくとか?)などと紐付けて覚えるようにする」のが大切なのかもと思った。