私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「できる人のおちんぎんあっぷ」(CodeIQ)を参照してください。
できる人のおちんぎんあっぷ 問題
ここは株式会社 人月査定。
人月査定では、開発者の離職が課題になっていました。
調査してみると、優秀な開発者から順に離職していることがわかりました。
その原因を調査すると、どうやら多くの成果物を生み出す優秀な開発者とほとんど成果物を生み出していない開発者の給与が全く同じであるためでした。
そこで人月査定では成果主義による評価制度を導入することを決定しました。
社名も株式会社 ステップ数見積もり に変更です。
こうして社内特命プロジェクト「おちんぎんあっぷ大作戦」が始動しました。
「ステップ数見積もり社」ではバージョン管理ツールKit(きっと)でプログラムの履歴管理をしています。
Kitの履歴をもとに「どの開発者が何%の成果物を仕上げているか?」を調べてください。
Kitの履歴は1ファイル1行単位で残ります。
1つの履歴を保存することをコミットと呼びます。
コミット履歴は20件しか残りません。仕様です。
標準入力
Kitの履歴が標準入力されます
例(サンプルのため入力が3件ですが、実際は20件入力されます)
- コミットした開発者名、ファイル名がカンマ区切りで入力されます
- コミットした開発者名は [a-z] の文字列で構成されます
- コミットした開発者名は 3-8 文字です
- 開発対象は「hoge.rb hige.rb hage.rb hoo.rb bar.rb」の5ファイルです
- 入力データは20件
horiuchi,hoge.rb
hironaka,hige.rb
kondo,hoo.rb
標準出力
- 出力形式は コミットした開発者名 + 半角コロン(:) + コミットしたファイルのパーセンテージ + 半角パーセント(%) です
- パーセンテージは小数点以下を切り捨ててください
例(標準入力の説明の入力が行われた場合の出力結果)
hironaka:33%
horiuchi:33%
kondo:33%
その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・同じファイルを複数の開発者が更新した場合、最後にファイルを更新した人がその成果物を仕上げた人としてください
例えば hoge.rb を tanaka さん、 suzuki さん、 sato さんの順番で更新していたらhoge.rb の開発者は sato さんとして集計します
・標準入力の後半の行に出たほうが後から更新しているものとします
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)
・出力は人名辞書順でソートしてください
・成果がない人は出力対象外としてください
・1度もコミットがないファイルがあった場合、%の母数には含まないものとします
Samples
Sample1
標準入力
horiuchi,hoge.rb
hironaka,hige.rb
kondo,hoo.rb
標準出力
hironaka:33%
horiuchi:33%
kondo:33%
Sample2
hoo.rb を二名が更新しているパターン
標準入力
horiuchi,hoge.rb
hironaka,hige.rb
kondo,hoo.rb
hironaka,hoo.rb
標準出力
hironaka:66%
horiuchi:33%
Rubyで解答しています。
#!/usr/bin/ruby # main input = {} while line = gets line.strip! if line.empty? then next end name, file = line.split(",") input[file] = name end count = Hash.new(0) sum = 0 input.each_value{|nm| count[nm] += 1 sum += 1 } count.sort.each{|arr| printf("%s:%d%\n", arr[0], 100*arr[1]/sum) }
難しいことは何もありませんがポイントはファイルを最後に更新した人をどうやって選ぶかでしょうか。
入力値をファイル名をキー、開発者を値にした連想配列に保持します。これで各ファイルは最後に更新した開発者と関連づけられます。
13〜18行目で開発者ごとに更新したファイル数を数えます。
sumは開発対象のファイル数の合計です。
最後に開発者を名前順でソートし、それぞれ何パーセント開発したかを計算して出力すれば終わりです。