Day 4: Giant Squid 1

# --- Day 4: Giant Squid 1---


numbers ="83,69,34,46,30,23,19,75,22,37,89,78,32,39,11,44,95,43,26,48,84,53,94,88,18,40,62,35,27,42,15,2,91,20,4,64,99,71,54,97,52,36,28,7,74,45,70,86,98,1,61,50,68,6,77,8,57,47,51,72,65,3,49,24,79,13,17,92,41,80,63,67,82,90,55,0,10,93,38,21,59,73,33,31,9,76,5,66,16,58,85,87,12,29,25,14,96,56,60,81"
called_numbers = numbers.split(',')
input = [];
File.foreach("4_input.dat").with_index do |line, line_num|
  input.push(line)
end

class Card
  def initialize(l1,l2,l3,l4,l5)
    @l1 = l1
    @l2 = l2
    @l3 = l3
    @l4 = l4
    @l5 = l5
  end
  def out_put
    puts "=========="
    p @l1
    p @l2
    p @l3
    p @l4
    p @l5
    puts "=========="
  end

  def check_mark(n)
    @l1.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l1[index] = "check"
      end
    end
    @l2.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l2[index] = "check"
      end
    end
    @l3.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l3[index] = "check"
      end
    end
    @l4.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l4[index] = "check"
      end
    end
    @l5.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l5[index] = "check"
      end
    end
  end

  def check_bing()
    #tate

    if @l1[0] == "check" && @l1[1] == "check" && @l1[2] == "check" && @l1[3] == "check" && @l1[4] == "check" then
      return true
    end
    if @l2[0] == "check" && @l2[1] == "check" && @l2[2] == "check" && @l2[3] == "check" && @l2[4] == "check" then
      return true
    end
    if @l3[0] == "check" && @l3[1] == "check" && @l3[2] == "check" && @l3[3] == "check" && @l3[4] == "check" then
      return true
    end
    if @l4[0] == "check" && @l4[1] == "check" && @l4[2] == "check" && @l4[3] == "check" && @l4[4] == "check" then
      return true
    end
    if @l5[0] == "check" && @l5[1] == "check" && @l5[2] == "check" && @l5[3] == "check" && @l5[4] == "check" then
      return true
    end
    #yoko

    if @l1[0] == "check" && @l2[0] == "check" && @l3[0] == "check" && @l4[0] == "check" && @l5[0] == "check" then
      return true
    end
    if @l1[1] == "check" && @l2[1] == "check" && @l3[1] == "check" && @l4[1] == "check" && @l5[1] == "check" then
      return true
    end
    if @l1[2] == "check" && @l2[2] == "check" && @l3[2] == "check" && @l4[2] == "check" && @l5[2] == "check" then
      return true
    end
    if @l1[3] == "check" && @l2[3] == "check" && @l3[3] == "check" && @l4[3] == "check" && @l5[3] == "check" then
      return true
    end
    if @l1[4] == "check" && @l2[4] == "check" && @l3[4] == "check" && @l4[4] == "check" && @l5[4] == "check" then
      return true
    end
    #naname

    if @l1[0] == "check" && @l2[1] == "check" && @l3[2] == "check" && @l4[3] == "check" && @l5[4] == "check" then
      return true
    end
    if @l1[4] == "check" && @l2[3] == "check" && @l3[2] == "check" && @l4[1] == "check" && @l5[0] == "check" then
      return true
    end
    return false
  end
  def out_sum()
    a = 0
    @l1.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l2.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l3.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l4.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l5.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    puts a
  end
end

i = 0
card_array = []
while i != 600
  t1 = input[i].split(' ')
  t2 = input[i+1].split(' ')
  t3 = input[i+2].split(' ')
  t4 = input[i+3].split(' ')
  t5 = input[i+4].split(' ')
  a = Card.new(t1,t2,t3,t4,t5)
  card_array.push(a);
  i = i + 6
end

flag = false
called_numbers.each do |n|
  card_array.each do |obj|
    obj.check_mark(n)
    if obj.check_bing
      obj.out_put
      obj.out_sum
      flag = true
      break
    end
  end
  puts n
  if flag then
    break
  end
end
# --- Day 4: Giant Squid 2---


numbers ="83,69,34,46,30,23,19,75,22,37,89,78,32,39,11,44,95,43,26,48,84,53,94,88,18,40,62,35,27,42,15,2,91,20,4,64,99,71,54,97,52,36,28,7,74,45,70,86,98,1,61,50,68,6,77,8,57,47,51,72,65,3,49,24,79,13,17,92,41,80,63,67,82,90,55,0,10,93,38,21,59,73,33,31,9,76,5,66,16,58,85,87,12,29,25,14,96,56,60,81"
called_numbers = numbers.split(',')
input = [];
File.foreach("4_input.dat").with_index do |line, line_num|
  input.push(line)
end

class Card
  def initialize(l1,l2,l3,l4,l5)
    @l1 = l1
    @l2 = l2
    @l3 = l3
    @l4 = l4
    @l5 = l5
  end
  def set_win_index(n,d_n)
    @win_index = n
    @d_number = d_n
  end
  def out_win_index
    return @win_index.to_i
  end
  def out_drown_number
    return @d_number.to_i
  end
  def out_put
    puts "=========="
    p @l1
    p @l2
    p @l3
    p @l4
    p @l5
    puts "index:#{@win_index}"
    puts @d_number
    puts "=========="
  end

  def check_mark(n)
    @l1.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l1[index] = "check"
      end
    end
    @l2.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l2[index] = "check"
      end
    end
    @l3.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l3[index] = "check"
      end
    end
    @l4.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l4[index] = "check"
      end
    end
    @l5.each_with_index do |number,index|
      if number.to_i == n.to_i
        @l5[index] = "check"
      end
    end
  end

  def check_bing()
    #tate

    if @l1[0] == "check" && @l1[1] == "check" && @l1[2] == "check" && @l1[3] == "check" && @l1[4] == "check" then
      return true
    end
    if @l2[0] == "check" && @l2[1] == "check" && @l2[2] == "check" && @l2[3] == "check" && @l2[4] == "check" then
      return true
    end
    if @l3[0] == "check" && @l3[1] == "check" && @l3[2] == "check" && @l3[3] == "check" && @l3[4] == "check" then
      return true
    end
    if @l4[0] == "check" && @l4[1] == "check" && @l4[2] == "check" && @l4[3] == "check" && @l4[4] == "check" then
      return true
    end
    if @l5[0] == "check" && @l5[1] == "check" && @l5[2] == "check" && @l5[3] == "check" && @l5[4] == "check" then
      return true
    end
    #yoko

    if @l1[0] == "check" && @l2[0] == "check" && @l3[0] == "check" && @l4[0] == "check" && @l5[0] == "check" then
      return true
    end
    if @l1[1] == "check" && @l2[1] == "check" && @l3[1] == "check" && @l4[1] == "check" && @l5[1] == "check" then
      return true
    end
    if @l1[2] == "check" && @l2[2] == "check" && @l3[2] == "check" && @l4[2] == "check" && @l5[2] == "check" then
      return true
    end
    if @l1[3] == "check" && @l2[3] == "check" && @l3[3] == "check" && @l4[3] == "check" && @l5[3] == "check" then
      return true
    end
    if @l1[4] == "check" && @l2[4] == "check" && @l3[4] == "check" && @l4[4] == "check" && @l5[4] == "check" then
      return true
    end
    #naname

    if @l1[0] == "check" && @l2[1] == "check" && @l3[2] == "check" && @l4[3] == "check" && @l5[4] == "check" then
      return true
    end
    if @l1[4] == "check" && @l2[3] == "check" && @l3[2] == "check" && @l4[1] == "check" && @l5[0] == "check" then
      return true
    end
    return false
  end
  def out_sum()
    a = 0
    @l1.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l2.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l3.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l4.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    @l5.each_with_index do |number,index|
      if number != "check"
        a = a + number.to_i
      end
    end
    return a.to_i
  end
end

i = 0
card_array = []
while i != 600
  t1 = input[i].split(' ')
  t2 = input[i+1].split(' ')
  t3 = input[i+2].split(' ')
  t4 = input[i+3].split(' ')
  t5 = input[i+4].split(' ')
  a = Card.new(t1,t2,t3,t4,t5)
  card_array.push(a);
  i = i + 6
end

index = 1;
called_numbers.each do |n|
  card_array.each do |obj|
    if(obj.check_bing) then
      next
    end
    obj.check_mark(n)
    if obj.check_bing then
      obj.set_win_index(index,n)
      index = index + 1
    end
  end
end

card_array.each do |obj|
  if obj.out_win_index == 100
    puts obj.out_sum
    puts obj.out_drown_number
    puts "ans: #{obj.out_sum * obj.out_drown_number}"
  end
end

メモ