INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 039のA問題
https://atcoder.jp/contests/abc039/tasks/abc039_a
●問題文
高橋君は高さが Acm、幅が Bcm、奥行きが Ccm の直方体を持っています。この直方体の表面積は何平方cmでしょうか?
●制約
- 1≦A,B,C≦100
- 与えられる数は全て整数である。
●入力
入力は以下の形式で標準入力から与えられる。
A B C
●出力
1 行にこの直方体の表面積を整数で出力せよ。
■回答
●愚直に書く
表面積なので、
A*B
が2面、B*C
が2面、C*A
が2面あるので足していけば良いか?
a, b, c = gets.split.map(&:to_i)
puts (a * b) * 2 + (b * c) * 2 + (c * a) * 2
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、メインメソッド、面積を出すメソッド、標準入力を取ってくるメソッドの3つを作成。
def main
a, b, c = read_nums
puts area(a, b, c)
end
def area(a, b, c)
(a * b) * 2 + (b * c) * 2 + (c * a) * 2
end
def read_nums
gets.split.map(&:to_i)
end
main
通った!
●リファクタリング/別アプローチ
計算式をちょっとだけまとめるとこうなる
a, b, c = gets.split.map(&:to_i)
puts 2 * (a * b + b * c + c * a)
通った!
●他の方の回答例
大体同じ考え方だった。
最上位の方で何人かa*b+b*c+c*a<<1
のような書き方をしていた、何コレ…?
調べてみると、ビット左シフトのことか…? 左に1ビットシフトすると、10進数では2倍の結果になるってことか…?言われてみればそうなるような気もするが、自信無い。
●出てきたメソッド等
公式リファレンスを見る訓練。
■振り返りなど
シフト演算子はまだ全然慣れていないので、慣れたい。