LoginSignup
0
0

More than 5 years have passed since last update.

第21回オフラインリアルタイムどう書く ruby で

Last updated at Posted at 2014-05-09

当日その場で書いた 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 が好き。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0