102 lines
1.7 KiB
Ruby
102 lines
1.7 KiB
Ruby
|
#!/usr/bin/env ruby
|
||
|
|
||
|
require_relative '../common'
|
||
|
|
||
|
class LightGrid
|
||
|
def initialize(brightness = false)
|
||
|
@brightness = brightness
|
||
|
@grid = Array.new(1000) { Array.new(1000, 0) }
|
||
|
end
|
||
|
|
||
|
def parse(instructions)
|
||
|
instructions.each do |string|
|
||
|
instruction, from_x, from_y, to_x, to_y = string.match(/\A(.*) ([0-9]+),([0-9]+) through ([0-9]+),([0-9]+)\z/).captures
|
||
|
klass = instruction_klass(instruction)
|
||
|
|
||
|
(from_x.to_i..to_x.to_i).each do |i|
|
||
|
(from_y.to_i..to_y.to_i).each do |j|
|
||
|
@grid[i][j] = klass.process(@grid[i][j])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
@grid.flatten.sum
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def instruction_klass(instruction)
|
||
|
if @brightness
|
||
|
case instruction
|
||
|
when "turn on"
|
||
|
Brightness::TurnOn
|
||
|
when "turn off"
|
||
|
Brightness::TurnOff
|
||
|
else
|
||
|
Brightness::Toggle
|
||
|
end
|
||
|
else
|
||
|
case instruction
|
||
|
when "turn on"
|
||
|
Simple::TurnOn
|
||
|
when "turn off"
|
||
|
Simple::TurnOff
|
||
|
else
|
||
|
Simple::Toggle
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Simple
|
||
|
class TurnOn
|
||
|
def self.process(value)
|
||
|
1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class TurnOff
|
||
|
def self.process(value)
|
||
|
0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Toggle
|
||
|
def self.process(value)
|
||
|
value == 1 ? 0 : 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Brightness
|
||
|
class TurnOn
|
||
|
def self.process(value)
|
||
|
value + 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class TurnOff
|
||
|
def self.process(value)
|
||
|
value > 0 ? value - 1 : 0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Toggle
|
||
|
def self.process(value)
|
||
|
value + 2
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Day6 < Day
|
||
|
def part1
|
||
|
LightGrid.new.parse input
|
||
|
end
|
||
|
|
||
|
def part2
|
||
|
LightGrid.new(true).parse input
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Day6.run
|