Baby steps to migratory bird

元半導体系エンジニア、今Webエンジニアの雑記

【WIP】【振り返り】GCJ2019 Qualification Round: You Can Go Your Own Way

今日は下記記事の2問目について少しずつ振り返りを進めていきます。

roo-ashi.hatenadiary.com

ちなみに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問分の振り返りを通じて、一見数字や経路など情報量が多そうな対象をそのまま鵜呑みにせず、ただの文字列とみなすことで計算量を減らすのがコツなのだなぁと思いました。