Finish day 7 part 1
parent
1ee535b250
commit
b9fefff097
|
|
@ -0,0 +1,16 @@
|
|||
.......S.......
|
||||
...............
|
||||
.......^.......
|
||||
...............
|
||||
......^.^......
|
||||
...............
|
||||
.....^.^.^.....
|
||||
...............
|
||||
....^.^...^....
|
||||
...............
|
||||
...^.^...^.^...
|
||||
...............
|
||||
..^...^.....^..
|
||||
...............
|
||||
.^.^.^.^.^...^.
|
||||
...............
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
......................................................................S......................................................................
|
||||
.............................................................................................................................................
|
||||
......................................................................^......................................................................
|
||||
.............................................................................................................................................
|
||||
.....................................................................^.^.....................................................................
|
||||
.............................................................................................................................................
|
||||
....................................................................^.^.^....................................................................
|
||||
.............................................................................................................................................
|
||||
...................................................................^.^.^.^...................................................................
|
||||
.............................................................................................................................................
|
||||
..................................................................^.^.^.^.^..................................................................
|
||||
.............................................................................................................................................
|
||||
.................................................................^...^...^.^.................................................................
|
||||
.............................................................................................................................................
|
||||
................................................................^.^.^...^...^................................................................
|
||||
.............................................................................................................................................
|
||||
...............................................................^.....^...^...^...............................................................
|
||||
.............................................................................................................................................
|
||||
..............................................................^...^.^.....^.^.^..............................................................
|
||||
.............................................................................................................................................
|
||||
.............................................................^.^.^...^.......^.^.............................................................
|
||||
.............................................................................................................................................
|
||||
............................................................^...^.^.....^.^.^.^.^............................................................
|
||||
.............................................................................................................................................
|
||||
...........................................................^.^.....^.^.....^.^.^.^...........................................................
|
||||
.............................................................................................................................................
|
||||
..........................................................^.^...^.^...^.^.^.^.^...^..........................................................
|
||||
.............................................................................................................................................
|
||||
.........................................................^...^.^.....^.^.....^.^.^.^.........................................................
|
||||
.............................................................................................................................................
|
||||
........................................................^.^.^.......^.^.^.^.^.^.^.^.^........................................................
|
||||
.............................................................................................................................................
|
||||
.......................................................^.^.^.....^...^.....^.^.^...^.^.......................................................
|
||||
.............................................................................................................................................
|
||||
......................................................^...^.^.^.^.^.^.^.......^.^.^.^.^......................................................
|
||||
.............................................................................................................................................
|
||||
.....................................................^.^.^...^...^...^.....^.......^.^.^.....................................................
|
||||
.............................................................................................................................................
|
||||
....................................................^...^...^.^.^...^.^.^.^.^...^.^.^...^....................................................
|
||||
.............................................................................................................................................
|
||||
...................................................^...^...^.^...^.^...^...^...........^.^...................................................
|
||||
.............................................................................................................................................
|
||||
..................................................^.^.^.^.^.......^.^.^.^.^...^.^...^.^.^.^..................................................
|
||||
.............................................................................................................................................
|
||||
.................................................^.^.^.^.....^.^.^.......^.^.......^.^.^.^.^.................................................
|
||||
.............................................................................................................................................
|
||||
................................................^...^.^.^.^.^.^.^.^.^.^.^.....^...^.^.^...^.^................................................
|
||||
.............................................................................................................................................
|
||||
...............................................^.^...^...^.^.^.^...^.^.^.^...^.^.^...^.^.^...^...............................................
|
||||
.............................................................................................................................................
|
||||
..............................................^...^.^...^.^.^.....^.^.^.^...^.^.^.^.^...^.....^..............................................
|
||||
.............................................................................................................................................
|
||||
.............................................^.....^...^...^.^...^.....^.^.^.^...^.......^.^...^.............................................
|
||||
.............................................................................................................................................
|
||||
............................................^.^...^.^.^.^.^.^.^...^.^.^.^.^...^.....^.^.^.^...^.^............................................
|
||||
.............................................................................................................................................
|
||||
...........................................^.^.^.^.^.^.......^.^...^.^.^.....^.^.^.......^...^.^.^...........................................
|
||||
.............................................................................................................................................
|
||||
..........................................^...^.^.^.^.^.^.^...^.^.....^.^.^.^.....^.^.^.^...^.^.^.^..........................................
|
||||
.............................................................................................................................................
|
||||
.........................................^.^...^...^.....^.^...^.^.^.^...^.......^...^...^.^.....^.^.........................................
|
||||
.............................................................................................................................................
|
||||
........................................^.^...^.^.^.^...........^.^...^.^.....^...^.^.....^.^...^.^.^........................................
|
||||
.............................................................................................................................................
|
||||
.......................................^.^...^.^.^.^.^...^.^.^...^.^.....^.......^.^.^.^.....^.^.....^.......................................
|
||||
.............................................................................................................................................
|
||||
......................................^...^.^.^...^.......^...^.^.^...^...^.^.^...^...^.....^...^.^.^.^......................................
|
||||
.............................................................................................................................................
|
||||
.....................................^.^.^.^.......^.^...^.^.^.^.^...^.^.....^.^.^.^...^.^.^.^...^.^.^.^.....................................
|
||||
.............................................................................................................................................
|
||||
....................................^...^...^.^.^.^.^.....^.^.^.^...^...^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^....................................
|
||||
.............................................................................................................................................
|
||||
...................................^.....^.^...^...^.^...^.^...^.^.^.^.......^.^.^.^.^.^.^.^...^.^.^.^.^.^...................................
|
||||
.............................................................................................................................................
|
||||
..................................^.^.^...^.^.^...^.^.^...^.^.^.^.^.^.^.^.^.^.^...^.^.^...^...^...^.^.^.^.^..................................
|
||||
.............................................................................................................................................
|
||||
.................................^.^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.....^.^...^...^.^...^.^.^.^...^.................................
|
||||
.............................................................................................................................................
|
||||
................................^.^.^.....^.^.....^...^.^.^.^.^.^...^...^.^...^.....^.^.^.^.^.^.^.^.^...^.^.^................................
|
||||
.............................................................................................................................................
|
||||
...............................^.^.^.^.....^.^.....^.^.....^.^.....^.....^.^...^.^.....^.^.....^...^.^.^.^.^.^...............................
|
||||
.............................................................................................................................................
|
||||
..............................^.^.^.^...^.....^.^.^.........^.^.......^...^...^...^.^.^.^.......^.^.^.^.^.^.^.^..............................
|
||||
.............................................................................................................................................
|
||||
.............................^.^.^.....^.^.^.....^.^.^.^...^.....^.^.^.^.^...^.^.^.^.^.^.^...^.^.^.^.......^.^.^.............................
|
||||
.............................................................................................................................................
|
||||
............................^...^.^.^.^.^...^.^.....^.^...^...^.^.....^.^...^.^.^.^...^.^.^.^.^.^...^.^...^.^.^.^............................
|
||||
.............................................................................................................................................
|
||||
...........................^.....^.^.^.^.^...^.^.^.^.........^.^.^.^.^.^.^.^.^.^.^.^.^.^.....^.^.^.^.^.^.^.^.^.^.^...........................
|
||||
.............................................................................................................................................
|
||||
..........................^.^.......^.^.^...^.^.^.^.^...^.^.^...^.^...^.^.^.^...^...^...^.^...^...^.^.^.^.^.^.....^..........................
|
||||
.............................................................................................................................................
|
||||
.........................^.^.^...^.^.^...^.^...^.^.^.^.^.^.^.......^.^.^.^...^.^.....^.....^.^.^.^...^.....^.^.^...^.........................
|
||||
.............................................................................................................................................
|
||||
........................^.^.....^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^...^.....^...^.^.^.^.^.^.^.....^.^...^.^.^.^........................
|
||||
.............................................................................................................................................
|
||||
.......................^.^.^.^...^...^...^.^.^...^.^.^.^.^.....^.^.......^.^...^.^...^.^.^...^...^.^.^...^.^.....^...^.......................
|
||||
.............................................................................................................................................
|
||||
......................^.^.........^.....^.^.....^...^...^...^.^.^.^.^.......^.^...^...^.^.^.^.......^.^...^.^.^...^.^.^......................
|
||||
.............................................................................................................................................
|
||||
.....................^.^.^...^...^.^...^.^.^...^...^.^.^.^.^.^.^...^...^.^.^.^.....^.^.^...^.^.....^...^...^...^.^.^.^.^.....................
|
||||
.............................................................................................................................................
|
||||
....................^.^.^...^.^.^...^.^.^.....^.......^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.....^.^.^.^.^.^...^.^.^...^.^.^.^....................
|
||||
.............................................................................................................................................
|
||||
...................^.....^.^...^.^...^.^...^.^.....^...^.^.^.......^.^.^.^.^.^.^.^.^...^.^.^.^.^...^.^.^.^...^.^.^.^.^...^...................
|
||||
.............................................................................................................................................
|
||||
..................^.^.^.^.^.^.^...^.^.^.^.....^.^.^.^.^.^.^...^.^...^...^...^.^.^.^.......^.^.^.....^.^...^.^.^...^.^...^.^..................
|
||||
.............................................................................................................................................
|
||||
.................^...^.^.^.^.^...^.......^.^.^.....^.^...^...^.^.^...^.^...^...^...^...^.^.^...^...^.^...^.^.^.^.^.^.^.^.^.^.................
|
||||
.............................................................................................................................................
|
||||
................^.^...^...^.^...^.^.....^.^.^.^.^.^.......^.^.^...^.^.^.^.^.^.^.^.^...........^.^.^.....^.....^.^.^.^.^.^...^................
|
||||
.............................................................................................................................................
|
||||
...............^.^.^...^.^.^.^.^.^.........^.^.^.^.^.......^...^.....^...^.^...^.....^...^...^...^.^.^.^.^.^.^.^.^.^.^.^.^.^.^...............
|
||||
.............................................................................................................................................
|
||||
..............^.^.^.^.^.^.^.^.^.^.^.^...^.^...^.^.^.^.^...^.^...^.......^.^...^.^.^...^.....^.^.^...^.^.^.^.^...^.^.^.^.^...^.^..............
|
||||
.............................................................................................................................................
|
||||
.............^.^.^.^.^...^.^.^.......^.^.^...^.^.^.^...^.^.^.^...^.....^.^.......^.^.........^.^.^.^.^.....^.^.^.^.^.^.^...^.^.^.............
|
||||
.............................................................................................................................................
|
||||
............^...^.^...^.^.^.^.^.^...........^.^.^.^.^.^.^.^.^.^.....^.^.^.^...^.....^.^.......^...^.^...^.....^.^.^...^.^.^...^.^............
|
||||
.............................................................................................................................................
|
||||
...........^.^.^.^.^.^.^.....^.^...^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.....^.^.^.^.^.^...^...^.^.^.^...^.^.^.^...^.^.^.^...^.^.^.^.^.^...........
|
||||
.............................................................................................................................................
|
||||
..........^...^.^.^.^.^.^...^...^.^...^.^.^.^.^.^...^.^...^.^.^.^.^.^.^.^...^.^.^...^.^.^...^.^.^.^...^...^.^.^.^.^.^...^.^.^.^.^.^..........
|
||||
.............................................................................................................................................
|
||||
.........^...^.^...^.....^.^.^...^.......^.^.....^.......^...^...^...^.^.^.^.^.^.^.....^.^.^.....^.^.^.^.^...^.^.^.^.^.^.^.^.^.^.^.^.........
|
||||
.............................................................................................................................................
|
||||
........^.^...........^...^.......^.^...^.^.^...^.^.^.^...^.^...^.^.^.......^...^.^.^.^.^.^.^.^.^.^.....^...^...^.....^.^.^.^.^.^.^.^........
|
||||
.............................................................................................................................................
|
||||
.......^...^...^.^.^...^.^.^.....^.^...^.^.^...^...^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^...^.^...^...^.^.^...^.^.^.^.^.....^...^.^.....^.^.......
|
||||
.............................................................................................................................................
|
||||
......^...^.^...^...^...^.^.^...^.^.^.^...^...^.^.^...^.^.....^.^.^...^.....^...^.^...^.......^.^...^.^.....^...^.^.^.^.^.^.^.^.^.^...^......
|
||||
.............................................................................................................................................
|
||||
.....^.^.^.^...^.^.....^.^...^.^.......^.^.^.^.^.^.^.^.^.^...^...^.^.^.^.^...^.^.^.^.^.^.^...^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^...^...^.^.....
|
||||
.............................................................................................................................................
|
||||
....^...^...^.^.^.^...^.^.^...^.^.....^.^.^...^.^.^.^...^.^.^.^.^...^.^.^.^.^...^.^.^.^.^.^.......^.^.^.^.^.....^.^.^.^...^.^.^.^.^...^.^....
|
||||
.............................................................................................................................................
|
||||
...^.^...^...^.......^...^.^.^...^.^.^.^.^.^.^.^.^.^.^...^.^...^.^.^.^.^...^...^.^...^...^.^.^.^.^.^.^.^.^.....^...^.^...^.^...^.^.^.^...^...
|
||||
.............................................................................................................................................
|
||||
..^.^.........^.^.^.^.^.^.^.^.^.^...^.......^.^.^.^...^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^...........^.....^.^.^.^.^.^.^.^.^.^.^.^.^...^.^...^.^..
|
||||
.............................................................................................................................................
|
||||
.^.^.^.^.^.....^.^.^.^.^.^.^.^.^.^.....^.^...^.^.^.^.^.^...^.^...^.^.^.^.^...^...^...^...^.^.^.^.^.^...^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.....^.
|
||||
.............................................................................................................................................
|
||||
|
|
@ -43,9 +43,138 @@ class PuzzleSolver
|
|||
end
|
||||
end
|
||||
|
||||
# TODO: Puzzle-specific
|
||||
class Space
|
||||
# [Symbol] :empty (.), :beam (|), :splitter (^), :start (S)
|
||||
attr_reader :type
|
||||
|
||||
MAPPING = {
|
||||
start: 'S',
|
||||
splitter: '^',
|
||||
empty: '.',
|
||||
beam: '|'
|
||||
}
|
||||
|
||||
# @param [String] space either '.', '^', or 'S'
|
||||
def initialize(space)
|
||||
type = MAPPING.key(space)
|
||||
raise "Unknown type #{space.inspect}" if type.nil?
|
||||
|
||||
@type = type
|
||||
end
|
||||
|
||||
def is_empty?
|
||||
@type == :empty
|
||||
end
|
||||
|
||||
def is_splitter?
|
||||
@type == :splitter
|
||||
end
|
||||
|
||||
def is_start?
|
||||
@type == :start
|
||||
end
|
||||
|
||||
def is_beam?
|
||||
@type == :beam
|
||||
end
|
||||
|
||||
def make_beam
|
||||
raise "Type #{@type} cannot be converted to beam" unless is_empty? || is_beam?
|
||||
|
||||
@type = :beam
|
||||
end
|
||||
|
||||
def to_s
|
||||
MAPPING[@type]
|
||||
end
|
||||
end
|
||||
|
||||
class Manifold
|
||||
attr_reader :spaces, :num_rows, :num_columns
|
||||
|
||||
# @param [<<String>>] an array of arrays of of strings ('S', '.' or '^'), e.g. [['.', 'S', '.'], ['.', '.', '^']]
|
||||
def initialize(manifold)
|
||||
raise "Invalid manifold: 0 rows in #{manifold}" if manifold.length == 0
|
||||
raise "Invalid manifold: 0 columns in #{manifold}" if manifold[0].length == 0
|
||||
raise "Invalid manifold: inconsistent number of columns in #{manifold}" unless manifold.all? {|column| column.length == manifold[0].length}
|
||||
|
||||
@num_rows = manifold.length
|
||||
@num_columns = manifold[0].length
|
||||
@spaces = manifold.map {|row| row.map {|space| Space.new(space)}}
|
||||
end
|
||||
|
||||
# @return [Grid]
|
||||
def self.from_file(file_path)
|
||||
manifold = []
|
||||
FileHandler.new(file_path).read_lines do |line|
|
||||
next if line.nil? || line.empty?
|
||||
manifold << line.split('')
|
||||
end
|
||||
Manifold.new(manifold)
|
||||
end
|
||||
|
||||
# @return [x, y] coordinates of start space
|
||||
def start_coordinates
|
||||
@spaces.each_with_index do |row, x|
|
||||
row.each_with_index do |space, y|
|
||||
return [x, y] if space.is_start?
|
||||
end
|
||||
end
|
||||
|
||||
raise "No start found in #{@spaces}"
|
||||
end
|
||||
|
||||
# @retrun [Integer] num_splits
|
||||
# side effect: manifold contains beams
|
||||
def send_beam
|
||||
start_x, _ = start_coordinates
|
||||
num_splits = 0
|
||||
|
||||
# fill in the beams of the following rows
|
||||
(start_x + 1...@num_rows).each do |x|
|
||||
row = @spaces[x]
|
||||
row.each_with_index do |space, y|
|
||||
# we only need to do something with current space if the space above is a beam or start, and space is empty
|
||||
above_space = @spaces[x - 1][y]
|
||||
next if space.is_beam?
|
||||
next unless above_space.is_start? || above_space.is_beam?
|
||||
|
||||
if space.is_empty?
|
||||
# beam passes through
|
||||
space.make_beam
|
||||
next
|
||||
end
|
||||
|
||||
raise "Unexpected space #{space} at (#{x}, #{y})" unless space.is_splitter?
|
||||
|
||||
# split beam, so beam to the left and to the right become beams
|
||||
num_splits += 1
|
||||
@spaces[x][y - 1].make_beam unless y - 1 < 0
|
||||
@spaces[x][y + 1].make_beam unless y + 1 > @num_columns
|
||||
end
|
||||
end
|
||||
|
||||
num_splits
|
||||
end
|
||||
|
||||
def to_s
|
||||
@spaces.map {|row| row.map(&:to_s).join}.join("\n")
|
||||
end
|
||||
end
|
||||
|
||||
class ManifoldSolver < PuzzleSolver
|
||||
def initialize(file_path, debug: false)
|
||||
@file_path = file_path
|
||||
file_handler = FileHandler.new(@file_path)
|
||||
super(file_handler, debug:)
|
||||
end
|
||||
|
||||
|
||||
def solve
|
||||
manifold = Manifold.from_file(@file_path)
|
||||
manifold.send_beam
|
||||
end
|
||||
end
|
||||
|
||||
if ARGV[0].nil? || ARGV[0].empty?
|
||||
puts "Usage: ruby #{__FILE__} <file_name> [debug]"
|
||||
|
|
@ -53,10 +182,10 @@ if ARGV[0].nil? || ARGV[0].empty?
|
|||
end
|
||||
file_path = ARGV[0]
|
||||
debug = (ARGV[1] == "debug")
|
||||
file_handler = FileHandler.new(file_path)
|
||||
# file_handler = FileHandler.new(file_path)
|
||||
|
||||
## Puzzle-specific
|
||||
cls = PuzzleSolver
|
||||
cls = ManifoldSolver
|
||||
##
|
||||
|
||||
puts "The answer is: #{cls.new(file_handler, debug:).solve}"
|
||||
puts "The answer is: #{cls.new(file_path, debug:).solve}"
|
||||
|
|
|
|||
Loading…
Reference in New Issue