コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 072 A – Sandglass2

  • by

■はじめに

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

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

(2022/10/17時点の方針)
しばらくはB問題を小さい番号の方からやっていく。たまにA問題もやるかも。

■問題

●出典

AtCoder Beginner Contest 072のA問題
https://atcoder.jp/contests/abc072/tasks/abc072_a

●問題文

X 秒を測れる砂時計があります。はじめ上のパーツに砂が X [g] あり、1 秒間に 1 [g] 砂が落ちます。なお、上のパーツにもう砂が残っていない場合は砂は落ちません。

t 秒後に上のパーツに残っている砂は何gでしょう。

●制約

  • 1≤X≤10^9
  • 1≤t≤10^9
  • X,t は整数

●入力

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

X t

●出力

t 秒後に上のパーツに残っている砂は何gかを出力せよ。

■回答

●愚直に書く

Xからtを引いて、0以上ならその数値、0より小さければ0、という感じか。

x, t = gets.split.map(&:to_i)
puts x - t >= 0 ? x - t : 0

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

メインメソッド、砂の残りの重さを計算するメソッド、標準入力を取るメソッドの3つ。

def main
  x, t = read_nums
  puts sand_weight(x, t)
end

def sand_weight(x, t)
  x - t >= 0 ? x - t : 0
end

def read_nums
  gets.split.map(&:to_i)
end

main

通った!

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

minメソッドとか使えそうな気がする

x, t = gets.split.map(&:to_i)
puts [x - t, 0].max

勘違いしてた、maxメソッドの方だった汗。
x-t0の大きい方を表示、とすれば求める回答になる。

●他の方の回答例

みなさんほとんどmaxメソッドを使っていた。
あと上位の方はevalを使って標準入力を取る時点でx-tを済ませている感じだった。

●出てきたメソッド等

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

■振り返りなど

maxメソッドに気づくことができて良かった。