83 lines
1.8 KiB
Ruby
83 lines
1.8 KiB
Ruby
#prepare the input which is a string containing new lines
|
|
def parse(input)
|
|
data = []
|
|
row = 0
|
|
symbols = {}
|
|
numbers = []
|
|
input.each_line do |line|
|
|
start_num = false
|
|
num = ""
|
|
num_cols = []
|
|
|
|
line.chomp.chars.each_with_index do |c,col|
|
|
if c == "."
|
|
if start_num
|
|
# finish a number
|
|
numbers << [num.to_i, row, num_cols]
|
|
start_num = false
|
|
num = ""
|
|
num_cols = []
|
|
end
|
|
elsif /\d/.match?(c)
|
|
# a digit
|
|
start_num = true
|
|
num += c
|
|
num_cols << col
|
|
else
|
|
# symbol
|
|
if start_num
|
|
# finish a number
|
|
numbers << [num.to_i, row, num_cols]
|
|
start_num = false
|
|
num = ""
|
|
num_cols = []
|
|
end
|
|
# fill adjacents
|
|
symbols[row] = {} if symbols[row].nil?
|
|
symbols[row][col-1] = true
|
|
symbols[row][col+1] = true
|
|
symbols[row-1] = {} if symbols[row-1].nil?
|
|
symbols[row-1][col] = true
|
|
symbols[row-1][col-1] = true
|
|
symbols[row-1][col+1] = true
|
|
symbols[row+1] = {}if symbols[row+1].nil?
|
|
symbols[row+1][col] = true
|
|
symbols[row+1][col-1] = true
|
|
symbols[row+1][col+1] = true
|
|
end
|
|
end
|
|
|
|
if start_num
|
|
# finish a number
|
|
numbers << [num.to_i, row, num_cols]
|
|
start_num = false
|
|
num = ""
|
|
num_cols = []
|
|
end
|
|
row += 1
|
|
end
|
|
data = [symbols,numbers]
|
|
data
|
|
end
|
|
|
|
# result should a single string or integer
|
|
def calculate(data)
|
|
result = ""
|
|
symbols, numbers = data
|
|
selected_numbers = []
|
|
numbers.each do |number_set|
|
|
number, row, cols = number_set
|
|
cols.each do |col|
|
|
if symbols.dig(row,col)
|
|
selected_numbers << number
|
|
puts "selected: #{selected_numbers}"
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
result = selected_numbers.reduce(&:+)
|
|
|
|
result
|
|
end
|