私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「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)
問題は簡単です。
こういう処理は実際の業務でも結構書きますよね。
入力値をgetCount()で[ユーザ名,カウント]にしてresultsに保持します。
全入力値を保持したらprintResult()で仕様通りに印字します。
引数は入力値です。
コンマで分割し、0番目をユーザ名、それ以外は重複を削除して数を数えます。
RubyはArray#uniq()で簡単に重複を削除できるので楽チンです。
カウントで降順にソートして印字します。
#!/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(",")}あまり良いとは思えないんですよね。