【WIP】【振り返り】GCJ2019 Qualification Round: You Can Go Your Own Way
今日は下記記事の2問目について少しずつ振り返りを進めていきます。
ちなみにGoogle Code Jamのサイトに行くと、今でもSubmitしたコードを採点してくれます。
今回もけんちょんさんの記事を参考にRubyで実装していきます。
GCJ 2019 Qual B - You Can Go Your Own Way - けんちょんの競プロ精進記録
本番でSubmitしたコード
def route_choice(str) route = '' rival_route = str while if check_last_motion(rival_route) == 'S' route.insert(0, 'E') else route.insert(0, 'S') end rival_route.chop! if rival_route == '' break end end route end def check_last_motion(str) str[-1] end def add_motion(route, motion) route.insert(0, motion) end t = gets.chomp.to_i t.times do |i| n = gets.chomp.to_i str = gets.chomp route = route_choice(str) puts "Case ##{i + 1}: #{route}" end
考え方がわかるとシンプルな実装になりますね↓
競技プロerにならったコード
def route_choice(str) route = '' (0...str.size).each do |letter| if str[letter] == 'E' route << 'S' else route << 'E' end end route end t = gets.chomp.to_i t.times do |i| n = gets.chomp.to_i str = gets.chomp route = route_choice(str) puts "Case ##{i + 1}: #{route}" end
ちょっと味気ないのでワンライナーにしてみました。 (もしかしてgetsするところも含めてワンライナーできるんでしょうか:eyes:)
ワンライナー
def route_choice(rival_route) (0...rival_route.size).inject('') {|route, idx| rival_route[idx] == 'E' ? route << 'S' : route << 'E'} end t = gets.chomp.to_i t.times do |i| n = gets.chomp.to_i str = gets.chomp route = route_choice(str) puts "Case ##{i + 1}: #{route}" end
まとめ
2問分の振り返りを通じて、一見数字や経路など情報量が多そうな対象をそのまま鵜呑みにせず、ただの文字列とみなすことで計算量を減らすのがコツなのだなぁと思いました。