コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 081 A – Placing Marbles

INDEX

■はじめに

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

■問題

●出典

AtCoder Beginner Contest 081のA問題
https://atcoder.jp/contests/abc081/tasks/abc081_a

●問題文

すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。 各マスには 01 が書かれており、マス i には si が書かれています。

すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

●制約

  • s1,s2,s31 あるいは 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')

あーこれドンピシャのやつじゃないか、文字列の中から任意の文字が何回使われているかを探すメソッド。
これは思いつけるはずなので、思いつきたかった。

●出てきたメソッド等

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

■振り返りなど

久しぶりで何もかも忘れていたので、引き続きリハビリしていく。
ちょっとしたメソッドなどもまた色々調べて使って思い出していきたい。