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

メモ

今回もオブジェクト指向を少し意識しながら書いてみたけど、途中で中途半端になってしまった。プロットの場合分けを綺麗にまとめることが出来なかった。