■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 081のA問題 https://atcoder.jp/contests/abc081/tasks/abc081_a
●問題文
すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。 各マスには 0
か 1
が書かれており、マス i
には si
が書かれています。
すぬけ君は 1
が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。
●制約
s1
,s2
,s3
は1
あるいは0
●入力
入力は以下の形式で標準入力から与えられる。
s1s2s3
●出力
答えを出力せよ。
■回答
●愚直に書く
つまり1
がいくつあるかってことだよね?
標準入力の取り方など色々忘れてるな、、、
文字列として取得してcharsメソッドで配列に分解して、それを数字にして足し込めば答えは出そう。
a = gets.chomp.chars
puts a[0].to_i + a[1].to_i + a[2].to_i
通った! しかしこれはあまりに愚直すぎるな、、、
少し調べた。 digitsメソッドで数字を位ごとに分割した配列にできて、それをsumすれば良さそう。
a = gets.to_i.digits.sum
puts a
通った!上のよりはスマートになった、かな?
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。 久しぶりなのでやっておくか…!
メインメソッド、計算するメソッド、標準入力を取得するメソッドの3つを作成。
def main
a = read_num
puts calculate(a)
end
def calculate(a)
a.digits.sum
end
def read_num
gets.to_i
end
main
通った! いつも処理用のメソッドの命名にちょっと悩むな…。
●リファクタリング/別アプローチ
上の愚直に書くところで別アプローチを1つ書いていたのでここではスキップ
●他の方の回答例
p gets.sum-154
何これ😂 どうやら文字列をsumしており、unicodeとかそういうのの数値を利用しているのかな…?
p gets.count('1')
あーこれドンピシャのやつじゃないか、文字列の中から任意の文字が何回使われているかを探すメソッド。 これは思いつけるはずなので、思いつきたかった。
●出てきたメソッド等
公式リファレンスを見る訓練。
- String#chars https://docs.ruby-lang.org/ja/latest/method/String/i/chars.html
- Integer#digits https://docs.ruby-lang.org/ja/latest/method/Integer/i/digits.html
- String#count https://docs.ruby-lang.org/ja/latest/method/String/i/count.html
■振り返りなど
久しぶりで何もかも忘れていたので、引き続きリハビリしていく。 ちょっとしたメソッドなどもまた色々調べて使って思い出していきたい。