Baby steps to migratory bird

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

【WIP】【振り返り】GCJ2019 Qualification Round: Foregone Solution

昨日の記事の1問目について少しずつ振り返りを進めていきます。

roo-ashi.hatenadiary.com

ちなみにGoogle Code Jamのサイトに行くと、今でもSubmitしたコードを採点してくれます。

まずはけんちょんさんの記事を参考にRubyで実装していきます。

GCJ 2019 Qual A - Foregone Solution - けんちょんの競プロ精進記録

競技プロerにならったコード

def separator(n)
  a = ''
  b = ''
  
  (0...n.size).each do |idx|
    if n[idx] != '4'
      a << '0'
      b << n[idx]
    else
      a << '1'
      b << '3'
    end
    
    a = '' if a == '0' # leading zero対策
  end

  return a, b
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
end

自分が本番でSubmitしたコードよりかなりシンプルです。

本番でSubmitしたコード

def include_digit_four?(num)
  /4/ =~ num.to_s
end

def find_index_of_four(num) # 中身が同じメソッドを書いてしまった 汗
  /4/ =~ num.to_s
end

def one_digit_separator(arr, num)
  index = find_index_of_four(arr[0])
  b = arr[1] + 10 ** (arr[0].to_s.size - index - 1)
  a = num - b
  return a, b
end

def separator(num)
  arr = [num, 0]
  while
    arr = one_digit_separator(arr, num)
    if !include_digit_four?(arr[0]) && !include_digit_four?(arr[1])
      break
    end
  end
  return arr[0], arr[1]
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp.to_i
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
end

ToDo

Webアプリの機能に導入したケースを想定して下記でも追記していく予定です。

  • Class/Module定義
  • 4以外のキーが壊れた場合