私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「【クリスマス問題】サンタの持ち場を計算しよう」(CodeIQ)を参照してください。
問題
あなたはサンタさんです。
サンタさんは、プレゼントを配るべき家を割り当てられます。
配る家は複数あり、1~15の整数のX, Y座標で、位置が示されます。
全ての家を含む、X軸に平行な辺を持つ正方形(辺の長さは整数、家は線上でもよい)の面積を計算するプログラムを書いてください。
例
以下、入力の例です。
数字は標準入力から、カンマと改行で区切られた文字として渡されます。
改行で区切られた各行が家を表します。
カンマで区切られた値は順に、X座標、Y座標を表します。
6,3
2,5
4,7
8,6
以下、グラフによる図解と各種数値です。
X最小値 : 2
Y最小値 : 3
正方形の辺の長さ : 6
正方形の面積 : 36
正方形の左下の座標 : (2, 3)
正方形の右上の座標 : (8, 9)
正方形の辺の長さは「6」なので、正方形の面積は「36」になります。
答えは、以下のように標準出力に出力してください。
36
Rubyで解答しています。
#!/usr/bin/ruby def solve(inputs) xy = inputs.transpose x = xy[0].max - xy[0].min y = xy[1].max - xy[1].min sz = (x >= y ? x : y) return sz ** 2 end # main inputs = [] while line = gets line.strip! if line.empty? then next end inputs << line.split(",").map{|a| a.to_i} end p solve(inputs)
特に難しいところはありません。
x座標の最大値と最小値の差かy座標の最大値と最小値の差の大きい方が正方形の1辺の長さになります。あとはそれを2乗すれば良いだけです。
入力値を数値に変換して変数inputに保持し、solve()に渡します。
solve()が結果を返すのでそれを印字して終わります。
引数は入力値の配列です。
引数が[[x0,y0], [x1,y1], …]なのでArray#transpose()で[[x0,x1,…], [y0,y1,…]]に変換し、x座標の最大と最小の差、y座標の最大と最小の差を求めます。
これらのうち大きい方の2乗を返します。
特にありません。