- 問題 : http://d.hatena.ne.jp/torazuka/20140509/yhpg
- 他の実装へのリンク : http://qiita.com/torazuka/items/cbdb6b581a57e4754dd4
- イベント : http://yhpg.doorkeeper.jp/events/10503
当日その場で書いた ruby。これでだいたい1時間。
def solve_impl( src )
fixed={}
5.times.each_with_object(Hash.new{ |h,k| h[k]=[] }) do |pri, r|
src.each do |num, w|
next if fixed[num] || 4<=r[w[pri]].size
r[w[pri]].push num
fixed[num]=true
end
end
end
def format( r )
r.keys.select{ |k| ! r[k].empty? }.sort.map{ |k|
[k, r[k].sort.join(":")].join("_")
}.join("|")
end
def parse( src )
src.split("|").map{ |i|
a,b=i.split("_")
[a.to_i, b.chars ]
}
end
def solve(src)
format solve_impl( parse( src ) )
end
$stdout.sync=true
DATA.map do |line|
num, src, exp = line.split(/\s+/)
actual = solve( src )
ok = actual==exp
puts( "%d %s\n A:%s\n E:%s\n" % [ num, src, actual.inspect, exp.inspect ] ) unless ok
ok
end.all?{ |x| x }.tap{ |x| puts( x ? "Okay!" : "**NG**" ) }
__END__
0 1_12345 1_1
1 30_32451 3_30
19 55_13524|64_41523|40_23451|99_25314|65_21453|69_31524|77_45231|62_51432|21_13542|81_13452|66_21534|33_41352|5_52314|90_31452|6_42135|93_42351|84_43125|54_45213|76_21453|19_52134|50_21435|61_13542|30_35421|43_25431|24_25341|31_15234|39_15243|20_51423|67_13524 1_21:55:61:81|2_40:65:66:99|3_30:69:84:90|4_6:33:64:77|5_5:19:20:62
いつも通り、テストデータの大半は省略。
初めての非出題者での参加でどきどきしたけど、時間内に書けた。ほ。
しかし。
制限時間内に groovy も書こうという野望はついえた。残念。
実装戦略はたぶん順当な感じだと思う。
上記の実装は、parse 計算 整形 に分かれているけど、最初は 計算と整形が一緒になってた。あと、each_with_object
が好き。