CodeIQ:KPTE(けぷて)問題

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

問題の概要

問題を引用します。
PPSP問題
仕様
標準入力

  • ユーザー名,絵文字1,絵文字2,・・・,絵文字N というフォーマットのデータが複数行入力されます
  • ユーザー名は [a-z] から構成される文字列です
  • 絵文字は [a-z] から構成される文字列からなります
【例】
usera,emojia,emojib,emojic
userb,emojia,emojib,emojib

標準出力
  • ユーザー名,その人が利用している絵文字の種類 というのデータが複数行出力されます
  • 利用文字種が多い順に出力する(利用文字種が同じ入力データは存在しないものとする)
【例】
usera,3
userb,2

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

Samples
Sample1
標準入力
tanaka,question,smoking,oden,wedding,metal,cl,three,sparkle,new
suzuki,mushroom,anchor,pizza,notes
sato,grapes,watermelon,jp,tennis,hammer
honda,ox,watch,euro
takahashi,cupid

標準出力
tanaka,9
sato,5
suzuki,4
honda,3
takahashi,1

Sample2
標準入力
tanaka,bear,shipit,iphone,innocent,rowboat
suzuki,paperclip,rainbow,iphone,football,tennis,lollipop,bangbang,baby
sato,snowboarder,dollar
honda,airplane
takahashi,purse,peach,shit,sparkle,elephant,running

標準出力
suzuki,8
takahashi,6
tanaka,5
sato,2
honda,1

Sample3
標準入力
tanaka,busstop,pray
suzuki,on,crocodile,hotsprings,hushed,diamonds,station,confused,fire
sato,pouch,eyeglasses,train,ok
honda,cupid,pineapple,clubs,eight,scroll
takahashi,bulb,zero,busstop

標準出力
suzuki,8
honda,5
sato,4
takahashi,3
tanaka,2

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def getCount(line)
	s = line.split(",")
	user = s[0]
	cnt = s[1..-1].uniq.size
	return [user, cnt]
end

def printResult(results)
	s = results.sort{|a, b| b[1]<=>>[1]}
	for r in s
		puts r.join(",")
	end
end

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

	results << getCount(line)
end

printResult(results)

解説

問題は簡単です。
こういう処理は実際の業務でも結構書きますよね。

main

入力値をgetCount()で[ユーザ名,カウント]にしてresultsに保持します。
全入力値を保持したらprintResult()で仕様通りに印字します。

getCount(line)

引数は入力値です。
コンマで分割し、0番目をユーザ名、それ以外は重複を削除して数を数えます。
RubyはArray#uniq()で簡単に重複を削除できるので楽チンです。

getCount(line)

カウントで降順にソートして印字します。

雑感

わざわざ関数化しないでそれぞれ1行で書けますがどうでしょう。
#!/usr/bin/ruby
results = []
while line = gets
	line.strip!
	if line.empty? then next end

	results << [line.split(",")[0], line.split(",")[1..-1].uniq.size]
end

results.sort{|a, b| b[1]<=>a[1]}.each{|s| puts s.join(",")}
あまり良いとは思えないんですよね。