1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
input = ARGF.read
numbers, *cards = input.split("\n\n")
numbers = numbers.split(?,).map(&:to_i)
cards = cards.map {|c| c.split("\n").map {|r| r.split(/\s+/).reject(&:empty?).map(&:to_i) }}

def win?(card, drawn)
  return true if card.any? {|row| row.all? {|c| drawn.include?(c) }}
  return true if card.transpose.any? {|col| col.all? {|c| drawn.include?(c) }}
  # return true if (0..4).all? {|x| drawn.include?(card.fetch(x).fetch(x)) }
  # return true if (0..4).all? {|x| drawn.include?(card.fetch(x).fetch(4-x)) }
  return false
end

(0..numbers.length).each do |i|
  drawn = numbers[0..i]

  # winning_card = cards.find {|c| win?(c, drawn) }
  # if winning_card
  #   p winning_card.flatten.reject {|x| drawn.include?(x) }.sum * drawn.last
  #   exit
  # end

  if cards.length == 1 && winning_card = cards.find {|c| win?(c, drawn) }
    p winning_card.flatten.reject {|x| drawn.include?(x) }.sum * drawn.last
    exit
  else
    cards = cards.reject {|c| win?(c, drawn) }
  end
end