— 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
メモ