— Day 5: Hydrothermal Venture — —
# --- Day 5: Hydrothermal Venture ---
input = []
File.foreach('d5_input.dat').with_index do |line, _line_num|
input.push(line)
end
class Grid
def initialize
@tbl = Array.new(1000) { Array.new(1000) { 0 } }
end
def plot_cordinate(x1, y1, x2, y2, flag)
if x1 == x2
if y1 > y2
@tbl[y1][x1] = @tbl[y1][x1] + 1
yt = y2
while yt != y1
@tbl[yt][x1] = @tbl[yt][x1] + 1
yt += 1
end
elsif y2 > y1
@tbl[y2][x1] = @tbl[y2][x1] + 1
yt = y1
while yt != y2
@tbl[yt][x1] = @tbl[yt][x1] + 1
yt += 1
end
end
end
if y1 == y2
if x2 > x1
@tbl[y1][x2] = @tbl[y1][x2] + 1
xt = x1
while xt != x2
@tbl[y1][xt] = @tbl[y1][xt] + 1
xt += 1
end
elsif x1 > x2
@tbl[y1][x1] = @tbl[y1][x1] + 1
xt = x2
while xt != x1
@tbl[y1][xt] = @tbl[y1][xt] + 1
xt += 1
end
end
end
check_diag(x1, y1, x2, y2) if flag
end
def check_diag(x1, y1, x2, y2)
slope = 0
slope = (y1 - y2).abs / (x1 - x2).abs if (x1 - x2).abs != 0 && (y1 - y2).abs != 0
return if slope != 1
if x2 > x1 && y2 > y1
xt = x1
yt = y1
xmax = x2
ymax = y2
@tbl[y2][x2] = @tbl[y2][x2] + 1
while xt != xmax
@tbl[yt][xt] = @tbl[yt][xt] + 1
xt += 1
yt += 1
end
elsif x1 > x2 && y1 > y2
xt = x2
yt = y2
xmax = x1
ymax = y1
@tbl[y1][x1] = @tbl[y1][x1] + 1
while xt != xmax
@tbl[yt][xt] = @tbl[yt][xt] + 1
xt += 1
yt += 1
end
elsif x1 < x2 && y1 > y2
xt = x1
yt = y1
xmax = x2
ymax = y2
@tbl[y2][x2] = @tbl[y2][x2] + 1
while xt != xmax
@tbl[yt][xt] = @tbl[yt][xt] + 1
xt += 1
yt -= 1
end
elsif x1 > x2 && y1 < y2
xt = x1
yt = y1
xmax = x2
ymax = y2
@tbl[y2][x2] = @tbl[y2][x2] + 1
while xt != xmax
@tbl[yt][xt] = @tbl[yt][xt] + 1
xt -= 1
yt += 1
end
end
end
def output
puts '----------------'
@tbl.each do |line|
p line
end
puts '----------------'
end
def check
i = 0
@tbl.each do |line|
line.each do |n|
i += 1 if n > 1
end
end
i
end
end
array = []
l = []
q1 = Grid.new
q2 = Grid.new
input.each do |line|
l = line.split('->')
l[1].strip!
x1 = l[0].split(',')[0].to_i
y1 = l[0].split(',')[1].to_i
x2 = l[1].split(',')[0].to_i
y2 = l[1].split(',')[1].to_i
q1.plot_cordinate(x1, y1, x2, y2, false)
end
input.each do |line|
l = line.split('->')
l[1].strip!
x1 = l[0].split(',')[0].to_i
y1 = l[0].split(',')[1].to_i
x2 = l[1].split(',')[0].to_i
y2 = l[1].split(',')[1].to_i
q2.plot_cordinate(x1, y1, x2, y2, true)
end
puts q1.check
puts q2.checkメモ
今回もオブジェクト指向を少し意識しながら書いてみたけど、途中で中途半端になってしまった。プロットの場合分けを綺麗にまとめることが出来なかった。