LoginSignup
0
0

More than 5 years have passed since last update.

オフラインリアルタイムどう書く F08 を Rubyで解いた

Last updated at Posted at 2017-11-24

問題:http://nabetani.sakura.ne.jp/hena/ordf07chairs/
実装リンク集:https://qiita.com/Nabetani/items/de5b9d3230603033ed74

問題の理解に時間がかかりました。最終的に出題者に確認する嵌めに・・・。

def availables(status)
  seats = status.keys
  seats.each.with_object(0 => [], 1 => [], 2 => []) do |n, o|
    next unless status[n] == '-'
    i = seats.index { |s| s == n }
    left, right = [-1, 1].map { |a| status[seats[(i + a) % seats.size]] == '-' ? 0 : 1 }
    o[left + right].push(n)
  end
end

def push(status, c)
  a = availables(status)
  (0..2).each do |n|
    next unless a[n].size.positive?
    a[n].sort!
    seat = c <= 'M' ? a[n].first : a[n].last
    status[seat] = c
    break
  end
end

def calc(src)
  status = '135798642'.chars.each.with_object({}) { |n, o| o[n] = '-' }
  src.chars.each do |c|
    if c.upcase == c
      push(status, c)
    else
      seat = status.select { |_k, v| v == c.upcase }
      status[seat.keys[0]] = '-' unless seat.empty?
    end
  end
  status.map { |_k, v| v.to_s }.join
end

DATA.each do |d|
  n, src, exp = d.split
  act = calc(src)
  puts %(#{n} #{act} != #{exp} (#{src})) unless act == exp
end

__END__
0   NABETanI    I-E--T-B-
1   A   A--------
2   Aa  ---------
3   Z   ----Z----
4   Zz  ---------
5   AaB     B--------
6   ABa     -------B-
0
0
1

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