CodeIQ:周期表

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「周期表」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
【概要】
図のような表があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 1                                 2
2 3 4                     5 6 7 8 9 10
3 11 12                     13 14 15 16 17 18
4 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
5 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
6 55 56 L 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
7 87 88 A 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
8 119 120                                
L 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71      
A 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103      

Y座標(1〜8, L, A)とX座標(1〜18)を与えるので、対応するマスに入る文字列を返すプログラムを書いてください。

【入出力】
入力は
5,6
のように、Y座標とX座標がコンマ区切りで来ます。

出力は、
42
のような感じです。

ただし:
6,3あるいは7,3が入力の場合、表にある通り、LあるいはAを出力してください。
1,8のように、表に文字が書かれていない領域が指定された場合、-を出力してください。

【例】
入力出力
5,642
1,8-
L,157

【補足】
不正な入力に対処する必要はありません。
X座標は 1〜18、Y座標は1〜8, L, A のいずれかです。

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

PeriodicTable = {
	#         1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
	 1  => [  1,"-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-",  2],
	 2  => [  3,  4,"-","-","-","-","-","-","-","-","-","-",  5,  6,  7,  8,  9, 10],
	 3  => [ 11, 12,"-","-","-","-","-","-","-","-","-","-", 13, 14, 15, 16, 17, 18],
	 4  => [ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36],
	 5  => [ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
	 6  => [ 55, 56,"L", 72, 73 ,74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86],
	 7  => [ 87, 88,"A",104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],
	 8  => [119,120,"-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"],
	"L" => [ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,"-","-","-"],
	"A" => [ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,"-","-","-"],
}

# main
while line = gets
	line.strip!
	if line.empty? then next end

	y,x = line.split(",")
	if y =~ /[0-9]+/ then y = y.to_i end
	x = x.to_i-1

	puts PeriodicTable[y][x].to_s
end

解説

☆1個の問題です。

考え方

考え方も何も周期表をそのまま連想配列にし、該当する場所の値を引くだけです。
ちなみに連想配列にしているのはLとAに対応するためです。

main

入力値のyの値が数値なら数値に変換し、そうでなければそのままの値をキーとして連想配列からその行を取得し、x-1番目の値を表示するだけです。

雑感

最初、表をそのままハードコードするのもかっこ悪いかと思って境界の値ごとに計算するようにしようかとも思ったのですが、条件文が鬱陶しいので何も考えず表引きにしました。
もし実際の仕事で周期表を使ったプログラムを書かなければならないとしたらやはり周期表をハードコードすると思います。新しい元素が発見されて増えることがあるかもしれませんが、それ以外に変更はないのでハードコードで何の問題もないし、むしろ変な計算をするよりパッと見て周期表と言うことがわかるのでこっちの方が良いでしょう。