CodeIQ:マウンティングスカウター問題

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「マウンティングスカウター問題」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
新人に書籍をすすめる先輩。
しかし、書籍が難しすぎたり内容がいまいちだったり冊数が多すぎるという苦情が相次ぎました。
紹介が遅れましたが、ここは株式会社マウンティングシステム。

このような経緯から先輩の技術書紹介のマウンティング能力を測定するスカウター(計測器)を開発することになりました。
マウンティング能力のスコアリングは以下の基準で行います。

書籍には1-10の難易度があります。
難易度が3以下なら減点なしです。
難易度が4以上の場合、(難易度 - 3)減点します。
初心者に優しくない本を紹介すると減点対象になるということです。

難易度スコア
10
20
30
41
52
63
74
85
96
107

書籍には1-10のレビュー評価があります。
レビュー評価が5以上なら減点なしです。
レビュー評価が4以下の場合、(5 - レビュー評価)減点します。
初心者に評価の低い本を紹介すると減点対象になるということです。

レビュースコア
14
23
32
41
50
60
70
80
90
100

先輩は1冊から10冊まで書籍を紹介してきます。
紹介冊数が3冊以下の場合なら減点しません。
紹介冊数が4冊以上の場合、(紹介冊数 - 3)減点します。
初心者に過剰に本を紹介すると減点対象になるということです。

冊数スコア
10
20
30
41
52
63
74
85
96
107


標準入力
・難易度、レビュー評価がカンマ区切りで入力されます
・難易度は1-10の数値です
・レビュー評価は1-10の数値です
・データ数=冊数です。1-10行のデータが入力されます

例: 難易度4, レビュー評価4

4,4
4,4
4,4
4,4

標準出力
・入力データの難易度の減点数の合計、レビュー評価の減点数の合計、冊数の減点数。これらすべての合計を出力します

例(入力の例に対する出力の例)

9

その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)

Samples
Sample1
Input
3,5
3,5
3,5

0

Sample2
Input
4,4
4,4
4,4
4,4

9

Sample3
Input
3,5
5,3
3,5
5,3

9

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(arr)
	ret = (arr.size > 3 ? arr.size-3 : 0)

	for a in arr
		ret += (a[0] > 3 ? a[0]-3 : 0)
		ret += (a[1] < 5 ? 5-a[1] : 0)
	end

	return ret;
end

#main
inputs = []
while line = gets
	line.strip!
	next if line.empty?

	inputs << line.split(",").map{|a| a.to_i}
end

p solve(inputs)

解説

特に難しいところはありません。
単純に問題通り実装するだけです。

main

入力値を数値の配列の配列にしてsolve()に渡し、結果を印字します。

solve(arr)

引数は入力値の配列です。
4行目で冊数に対する点数を計算して返却値の初期値としています。
その後、配列の要素ごとに難易度とレビューの評価点を計算して加算します。
全項目の計算を終えたら評価点を返却します。

雑感

頑張ればワンライナーでかけるのかな?