advent-of-code/2015/day-06/main.rb

76 lines
1.5 KiB
Ruby
Executable File

#!/usr/bin/env ruby
require "pathname"
INPUTS = [
Pathname("inputs/test.txt"),
Pathname("inputs/puzzle.txt"),
].freeze
class Grid
def initialize = @area = Array.new(1000) { Array.new(1000) { 0 } }
def apply(cmd, coords)
coords => [[x, y], [w, h]]
(y..h).each do |i|
(x..w).each do |j|
@area[i][j] = send(cmd, @area[i][j])
end
end
end
def lights_on = @area.sum { |r| r.count { |x| x != 0 }}
def brightness = @area.sum { |r| r.sum }
private
def turn_on(area) = 1
def toggle(area) = area ^ 0x1
def turn_off(area) = 0
def turn_on2(area) = area + 1
def turn_off2(area) = [area - 1, 0].max()
def toggle2(area) = area + 2
end
def parse_instruction(input)
input = input.chomp
left, right = input.split("through")
cmd, _, start_coords = left.strip.rpartition(" ").map(&:strip)
start_coords = start_coords.split(",").map(&:to_i)
end_coords = right.strip.split(",").map(&:to_i)
[cmd.tr(" ", "_"), [start_coords, end_coords]]
end
def solve_part_1(file)
grid = Grid.new()
file.each_line do |line|
grid.apply(*parse_instruction(line))
end
puts "\tLights on: #{grid.lights_on}"
end
def solve_part_2(file)
grid = Grid.new()
file.each_line do |line|
parse_instruction(line) => [cmd, coords]
grid.apply("#{cmd}2", coords)
end
puts "\tBrightness: #{grid.brightness}"
end
def main(files)
files.each do |file|
puts "File: #{file}"
solve_part_1(file)
solve_part_2(file)
end
end
main(INPUTS)