CodeIQ:転職先スコアリング

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「転職先スコアリング」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
転職活動をはじめたソフトウェア開発者のAさん。
大量のオファーによって転職先の選定に困ってしまいました。
まずは自分が大切にする基準を明確にしてスコアリングすることで絞込む時間を節約することにしました。
時間は有限。
※この出題のスコアリング基準はあくまで仮想のものであり特に深い意味はありません

仕様
必須
・リモートワーク可能であること
・業務中のOSSへの貢献が可能であること
・残業が月30時間未満であること
※これらの条件を満たしていない場合は他の項目がどうであれスコアは0点にする

加点
・私服通勤可能の場合 10点 加点
・スペシャリストとしてのキャリアパス・評価制度がある場合 10点 加点
・残業時間月20時間から29時間の場合 10点 加点
・残業時間月1時間から19時間の場合 20点 加点
・残業時間月0時間の場合 30点 加点

標準入力
・以下のフォーマットで入力されます
リモートワークの可否,OSS貢献の可否,私服通勤の可否,スペシャリスト評価の有無,残業時間

・リモートワークの可否は true (可能) or false (不可能)が入力される
・OSS貢献の可否 true (可能) or false (不可能)が入力される
・私服通勤の可否 true (可能) or false (不可能)が入力される
・スペシャリスト評価の有無 true (有) or false (無)が入力される
・残業時間は 0 - 30 の整数値で入力される

例:
true,true,false,false,15

標準出力
・スコアリング結果を数値で出力してください

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

20

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

Samples
Sample1
Input
true,true,true,true,0

50

Sample2
Input
true,true,true,true,30

0

Sample3
Input
true,true,false,false,20

10

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(ipt)
	remote = ipt[0]		# リモート
	oss = ipt[1]		# OSS
	ware = ipt[2]		# 私服
	sp = ipt[3]			# スペシャリスト
	over = 0		# 残業が30未満1、それ以外0
	over_p = 0			# 残業時間加点

	if ipt[4] == 0 then over = 1; over_p = 30
	elsif ipt[4] <= 19 then over = 1; over_p = 20
	elsif ipt[4] <= 29 then over = 1; over_p = 10
	end

	return remote * oss * over * (10*ware + 10*sp + over_p)
end

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

	ipt = line.split(",").map{|a|
		if a == "true" then next 1
		elsif a == "false" then next 0
		else next a.to_i
		end
	}

	p solve(ipt)
end

解説

特に難しいところはありません。

main

入力値をパースして配列にします。
計算を楽にするためtrue=1, false=0に変換しています。

solve(arr)

計算式は です。
リモートワーク可否、OSS、私服、スペシャリストについてはtrue=1,false=0としているのでそれぞれの値を当てはめれば大丈夫です。
残業時間だけは条件で加点を評価し、30時間未満かどうかは0か1で別途評価しています。

雑感

true=1,false=0とすることでこれらを条件文で判断せず一気に計算できるというのがちょっとしたポイントかなぁ、と思います。