CodeIQ:【クリスマス問題】サンタの持ち場を計算しよう

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「【クリスマス問題】サンタの持ち場を計算しよう」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
問題
あなたはサンタさんです。
サンタさんは、プレゼントを配るべき家を割り当てられます。
配る家は複数あり、1~15の整数のX, Y座標で、位置が示されます。
全ての家を含む、X軸に平行な辺を持つ正方形(辺の長さは整数、家は線上でもよい)の面積を計算するプログラムを書いてください。


以下、入力の例です。
数字は標準入力から、カンマと改行で区切られた文字として渡されます。
改行で区切られた各行が家を表します。
カンマで区切られた値は順に、X座標、Y座標を表します。
6,3
2,5
4,7
8,6

以下、グラフによる図解と各種数値です。
Fig.1

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乗すれば良いだけです。

main

入力値を数値に変換して変数inputに保持し、solve()に渡します。
solve()が結果を返すのでそれを印字して終わります。

solve(n)

引数は入力値の配列です。
引数が[[x0,y0], [x1,y1], …]なのでArray#transpose()で[[x0,x1,…], [y0,y1,…]]に変換し、x座標の最大と最小の差、y座標の最大と最小の差を求めます。
これらのうち大きい方の2乗を返します。

雑感

特にありません。