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

列と並んでる人をハッシュで管理して、x君は別のハッシュで管理。
Classを使っていこうと決めたのですが、非常に中途半端な導入になってしまいました。
とりあえず、全テストパターンは通ったので、もう少しスマートに修正したい。

あと、毎回冒頭にテストパターンを丸ごと書きますが、
いい加減不細工なので今度からは工夫したい。末尾に書く方法を学ばねば。

```ruby:no_fork.rb
# 入力値と正解値
input2result = {
  "42873x.3."=>"0,4,2,0,0",
  "1"=>"1,0,0,0,0",
  "."=>"0,0,0,0,0",
  "x"=>"1,0,0,0,0",
  "31."=>"1,0,0,0,0",
  "3x."=>"1,1,0,0,0",
  "99569x"=>"9,9,6,6,9",
  "99569x33"=>"9,9,9,9,9",
  "99569x33."=>"7,2,6,4,7",
  "99569x33.."=>"5,0,4,0,5",
  "12345x3333."=>"4,0,3,2,3",
  "54321x3333."=>"3,0,3,0,4",
  "51423x3333."=>"3,4,4,0,4",
  "12x34x."=>"1,0,1,0,2",
  "987x654x.32"=>"7,6,4,10,5",
  "99999999999x99999999.......9."=>"20,10,12,5,20",
  "997"=>"9,9,7,0,0",
  ".3.9"=>"1,9,0,0,0",
  "832.6"=>"6,6,0,0,0",
  ".5.568"=>"3,5,6,8,0",
  "475..48"=>"4,8,0,0,0",
  "7.2..469"=>"1,4,6,9,0",
  "574x315.3"=>"3,3,1,7,1",
  "5.2893.x98"=>"10,9,5,4,1",
  "279.6xxx..4"=>"2,1,4,1,1",
  "1.1.39..93.x"=>"7,1,0,0,0",
  "7677749325927"=>"16,12,17,18,12",
  "x6235.87.56.9."=>"7,2,0,0,0",
  "4.1168.6.197.6."=>"0,0,3,0,0",
  "2.8.547.25..19.6"=>"6,2,0,0,0",
  ".5.3x82x32.1829.."=>"5,0,5,0,7",
  "x.1816..36.24.429."=>"1,0,0,0,7",
  "79.2.6.81x..26x31.1"=>"1,0,2,1,1",
  "574296x6538984..5974"=>"14,13,10,15,14",
  "99.6244.4376636..72.6"=>"5,6,0,0,3",
  "1659.486x5637168278123"=>"17,16,16,18,17",
  ".5.17797.x626x5x9457.3."=>"14,0,3,5,8",
  "..58624.85623..4.7..23.x"=>"1,1,0,0,0",
  "716.463.9.x.8..4.15.738x4"=>"7,3,5,8,1",
  "22xx.191.96469472.7232377."=>"10,11,18,12,9",
  "24..4...343......4.41.6...2"=>"2,0,0,0,0",
  "32732.474x153.866..4x29.2573"=>"7,5,7,8,5",
  "786.1267x9937.17.15448.1x33.4"=>"4,4,8,4,10",
  "671714849.149.686852.178.895x3"=>"13,16,13,10,12",
  "86x.47.517..29621.61x937..xx935"=>"7,11,8,8,10",
  ".2233.78x.94.x59511.5.86x3.x714."=>"4,6,10,8,8",
  ".793...218.687x415x13.1...x58576x"=>"8,11,8,6,9",
  "6.6x37.3x51x932.72x4x33.9363.x7761"=>"15,13,15,12,15",
  "6..4.x187..681.2x.2.713276.669x.252"=>"6,7,8,6,5",
  ".6.xx64..5146x897231.x.21265392x9775"=>"19,17,19,20,17",
  "334.85413.263314.x.6293921x3.6357647x"=>"14,14,12,16,10",
  "4.1..9..513.266..5999769852.2.38x79.x7"=>"12,10,13,6,10",
}

# レジクラス
class CashRegister
  def initialize(a, b, c, d, e)
    @checker_ability = [a, b, c, d, e]
    @line = {'0'=>0, '1'=>0, '2'=>0, '3'=>0, '4'=>0,}
    @line_x = {'0'=>0, '1'=>0, '2'=>0, '3'=>0, '4'=>0,}
  end
    
  attr_accessor :line, :line_x, :checker_ability
end

total_result = "ALL Test Pattern OK"

# 入力と正解を分離
input2result.each { |input, answer|
  # レジクラス作成、各レジの能力を設定
  register = CashRegister.new(2, 7, 3, 5, 2)
#  p register.line
  
  # 入力解釈開始 客数や処理に応じて処理する
  input.split("").each{ |customer_set|
    case customer_set
    when "1".."9"
      key, val = register.line.shift
 #     puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + customer_set
      val += customer_set.to_i
      register.line[key] = val
      register.line = Hash[register.line.sort{ |a, b| (a[1] <=> b[1]) * 2 + (a[0] <=> b[0]) }]
 #     p register.line
      
    when "x"
 #     puts "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      key, val = register.line.shift
      val = val + 1
      register.line[key] = val
      if register.line_x[key] == 0
        register.line_x[key] = val
      end
      register.line = Hash[register.line.sort{ |a, b| (a[1] <=> b[1]) * 2 + (a[0] <=> b[0]) }]
 #     p register.line
      
    when "."
 #     puts "................................."
      register.line.each_key{ |key|
        if register.line_x[key] == 0
          # xおらへん
          register.line[key] -= register.checker_ability[key.to_i]
          if register.line[key] < 0
            register.line[key] = 0
          end
        else
          # x現る
          if register.line_x[key] <= register.checker_ability[key.to_i]
            to_x_ability = register.line_x[key] - 1
            register.line[key] -= to_x_ability
            register.line_x[key] -= to_x_ability
          else
            register.line_x[key] -= register.checker_ability[key.to_i]
            register.line[key] -= register.checker_ability[key.to_i]
            if register.line_x[key] < 1
              register.line_x[key] = 1
              register.line[key] = 1
            end
          end
        end
      }

      register.line = Hash[register.line.sort{ |a, b| (a[1] <=> b[1]) * 2 + (a[0] <=> b[0]) }]
           
    else
      puts "ERROR!! 入力が不正です"
      exit(1) 
    end
  #  puts "========="
  #  p Hash[register.line.sort]
  #  p Hash[register.line_x.sort]
  }
  
  # puts "==================================================="
  # 最後に書式を整える
  output=""
  Hash[register.line.sort].each_value{ |val|
    output += val.to_s + ","
  }
  output = output[0...-1]
  
  # 出力と正解があっているか確認する
  if output == answer
    res = 'OK'
  else
    total_result = "mistake"
    res = 'mismath!!!!!!!!!!!'
  end
  puts input + " => " + output + " " + res
}

puts total_result
```