INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 033のA問題
https://atcoder.jp/contests/abc033/tasks/abc033_a
●問題文
あなたはゲーム開発メンバーの一員です。 現在、あなたはプレイヤーがゲームをプレイするために必要な暗証番号を決めさせる部分を実装しています。
この暗証番号は 4 桁 であり、それぞれの桁は 0 以上 9 以下の数字のいずれかです。暗証番号が 0 で始まる可能性もあります。
安全上の関係で、 4 桁とも同じ数字である暗証番号は認めないことにしました。プレイヤーが入力した 4 桁の数 N が与えられるので、 これが 4 桁とも全て同じ数字であるかどうかを判定してください。
●入力
入力は以下の形式で標準入力から与えられる。
N
- 1 行目には、N が与えられる。N は 4 文字の 0 から 9 の数字からなる。
- N が 0 で始まることもある。
●出力
N が 4 桁とも全て同じ数字であるなら SAME を、そうでないなら DIFFERENT を 1 行に出力せよ。
出力の末尾にも改行を入れること。
■回答
●愚直に書く
4桁の数字をまず1文字ずつ配列にして、uniqeメソッドみたいなのがあった気がするので、それを使って要素が1つになればsame
という感じかな?
→uniq
メソッドでした。
あと、配列の要素の数を調べるのはsize
。
n = gets.chomp.split('').map(&:to_i)
puts n.uniq.size == 1 ? 'SAME' : 'DIFFERENT'
通った!!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、
・メインメソッド
・ジャッジするメソッド
・標準入力を取得するメソッド
という構成で書いてみる。
def main
puts judge_result
end
def judge_result
read_num.uniq.size == 1 ? 'SAME' : 'DIFFERENT'
end
def read_num
gets.chomp.split('').map(&:to_i)
end
main
通った!!
●リファクタリング/別アプローチ
整数のままなんかできないかなと思ったけど時間がなかったので断念。
●他の方の回答例
上位の方々はやはり整数のまま処理していた。
puts gets.to_i%1111>0?"DIFFERENT":"SAME"
puts gets.to_i%1111==0?"SAME":"DIFFERENT"
1111で割ってあまりが出たらDIFFERENT
、余りが出なかったらSAME
か、なるほど!
●出てきたメソッド等
公式リファレンスを見る訓練。
-
Array#uniq
https://docs.ruby-lang.org/ja/latest/method/Array/i/uniq.html -
Array#length(
size
のエイリアス)
https://docs.ruby-lang.org/ja/latest/method/Array/i/length.html
■振り返りなど
整数のまま処理する方法をパッと思いつきたかった。