INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 013のB問題
https://atcoder.jp/contests/abc013/tasks/abc013_2
●問題文
セキュリティ意識の高い高橋君はこの度、自分の家に新しい錠をつけることにしました。
この錠はダイヤルロック式で、1 桁の数字が表示されるディスプレイと、赤色と青色の 2 種類のボタンがついています。赤いボタンを押すとディスプレイに表示されている数が 1 増え、青いボタンを押すと 1 減ります。
ただし、ディスプレイの表示が 9 のときに赤いボタンを押すと 0 になり、ディスプレイの表示が 0 のときに青いボタンを押すと 9 になります。
いま、ディスプレイに表示されている数字は a で、この数字が b になった瞬間に錠が開きます。さて、錠を開けるためには最低何回はボタンを押す必要があるでしょうか?
●入力
入力は以下の形式で標準入力から与えられる。
a
b
- 1 行目には、現在ディスプレイに表示されている数字を表す整数 a (0≦a≦9) が与えられる。
- 2 行目には、解錠するために表示させる必要のある数字を表す整数 b (0≦b≦9) が与えられる。
- a と b が同じ値になることはない。
●出力
錠を開けるために必要な、ボタンを押す回数の最小値を 1 行に出力せよ。
出力の末尾には改行をいれること。
■回答
●愚直に書く
まずは2つの数字の差を出す。
差が5以下の場合にはそのまま出力すればよくて、5より大きい場合には「逆回りしたほうが少ない回数で済む」ということなので10からその差を引いた数が答え、ということになるかな?
a = gets.to_i
b = gets.to_i
gap = (a - b).abs
puts gap > 5 ? 10 - gap : gap
通った!
●リファクタリング/別アプローチ
う〜ん全然思い浮かばない…。
9→0や0→9になるから10個の数字が円環してるような状態で、2つの数字の距離を出す、みたいなことができれば良いかもだけど、書き方が思いつかない。
●他の方の回答例
標準入力の取り方や変数に入れる/入れないの違いはあれど、考え方はほとんど同じ方が多かった。
min
メソッドを使った方法が面白かったので自分の回答に当てはめる形でメモしておく。
a = gets.to_i
b = gets.to_i
gap = (a - b).abs
puts [gap, 10-gap].min
「aとbの差」と「10からaとbの差を引いた数」を両方出しておいて、min
メソッドで小さい方を出力する。これだとif式を使わなくて済むようになる。なるほど〜!
●出てきたメソッド等
公式リファレンスを見る訓練。
-
abs
https://docs.ruby-lang.org/ja/latest/method/Integer/i/abs.html -
min
https://docs.ruby-lang.org/ja/latest/method/Array/i/min.html
■振り返りなど
- 三項演算子も徐々に慣れてきた。