Add solution for 2015 day 18
This commit is contained in:
parent
4f585a3a4a
commit
0f53b455b6
@ -19,7 +19,7 @@
|
|||||||
| ✓ | 15 | Permutations | Ruby |
|
| ✓ | 15 | Permutations | Ruby |
|
||||||
| ✓ | 16 | Searching | Ruby |
|
| ✓ | 16 | Searching | Ruby |
|
||||||
| | 17 | Combinations | |
|
| | 17 | Combinations | |
|
||||||
| | 18 | | |
|
| ✓ | 18 | Game of Life | Ruby |
|
||||||
| | 19 | | |
|
| | 19 | | |
|
||||||
| | 20 | | |
|
| | 20 | | |
|
||||||
| | 21 | | |
|
| | 21 | | |
|
||||||
|
1
2015/day-18/.ruby-version
Normal file
1
2015/day-18/.ruby-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.0.0
|
100
2015/day-18/inputs/puzzle.txt
Normal file
100
2015/day-18/inputs/puzzle.txt
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
####.#.##.###.#.#.##.#..###.#..#.#.#..##....#.###...##..###.##.#.#.#.##...##..#..#....#.#.##..#...##
|
||||||
|
.##...##.##.######.#.#.##...#.#.#.#.#...#.##.#..#.#.####...#....#....###.#.#.#####....#.#.##.#.#.##.
|
||||||
|
###.##..#..#####.......#.########...#.####.###....###.###...#...####.######.#..#####.#.###....####..
|
||||||
|
....#..#..#....###.##.#.....##...#.###.#.#.#..#.#..##...#....#.##.###.#...######......#..#.#..####.#
|
||||||
|
..###.####..#.#.#..##.#.#....#......#.##.##..##.#.....##.###.#..###...###.#.##..#.#..###....####.#.#
|
||||||
|
#.#...#......####.#..##.####.#.#.#...##..###.##.#...#..#..###....#.#....#..##..#....##.....##.#...#.
|
||||||
|
....##.#.#.#.##..##...##..##..#....#....###...####.###...##.#...#..#....##.....#..#.#####.###.###.##
|
||||||
|
#...##..#.#..#....#..########.##....##..##.###..#.#..#..#.##.##.#..##..######....####..#####.#.###..
|
||||||
|
.####...######.#..#.##.#.#..####...####.##.#.#......#...##....##..#...###..#.####......###......#.##
|
||||||
|
.####.###..#..#####.##...###......#...###..#..##..#.#....##.##.#.##.###..#..#..###.#..#.#....####.##
|
||||||
|
#..#..##.##.##.###.#.##.##.#.#.#....#....#.####.#.##...#####...###.#####.#.#.#....####..###..###..##
|
||||||
|
#.##....#...########..##...#.#.##.......#.#..##...####...#.####.####..##...##.#....###.#.####...#.##
|
||||||
|
#.#...##..#.##.##..##....#.....##.##.....#...###...#..#...####.##.####..#...##..##.##.##.##..##...##
|
||||||
|
.#..###...#.#.....#######..##.###....##..#.##.#......###.##....#......###...#.##....#.....##......##
|
||||||
|
..##....#.###...###..####.##..#..##.##......##.#.....#...#..#..##...###..#.####...#...#..##.#..##..#
|
||||||
|
...#.#.#...#.#..#.##....##..#...#.##..#......#.#.....#####.##.#...#######.#.#..#.####..###.....###.#
|
||||||
|
.#....#.#.##..####.#####..#.#######..#.##.###...##.##....##..###..#.##.###.......#....#..######.####
|
||||||
|
#..#.##.##..#..#..##.####.#.#.#.#..#.##...#..######....#.##.#..##.##.######.###.###.###...#.....#.#.
|
||||||
|
.#.......#...#.####.##...#####..##..#.#....##..#.#.#.####.#.##....#..##.##..#.###.....#.##.##.#.##.#
|
||||||
|
#..##..##...#....#.##.#...#.#....#......####...##..#...##.##.#..#########..#..#.##.##..#.#.#######..
|
||||||
|
#.......#####..###..######.#..##.#.#####..##...###...#.####.##...###..#.#.#####....#...#.##...#.#..#
|
||||||
|
.##..#...#####.##.##......#...#.#.#.###.#.#.#...##.#..#....###.....#..#.#.###......#####.###.#..##.#
|
||||||
|
.....###.#.#.#..##...#...###..#...#.#.##..###.##.#####.##..#.#.#.#.#####....#.#.#####...##.#..#.#.#.
|
||||||
|
###...##.#..#.####..##.#..##.#.#.#...#.#..#..##..##..#.#.#.#.##...##..#..#.....#....#####.#.#.####.#
|
||||||
|
....##....#.#.....#...###.#...##..##.##..#..###..##.###..#####..#...#####.##.#..#.#.#.###...####.###
|
||||||
|
##.##.##.#...#..#...........##.##.###.#...###.####.#..#..#...#..#..####.#.###########..#.###.###.#.#
|
||||||
|
##.##..##.####..###...##...#....###.###.#..##..#..#.###.#..####.#..##.#.#...#..#.#.##.##...#...#....
|
||||||
|
..##...#.#.##....##...#.#.#......##.##.#.#.####.####....####.#.###.##.#.#..####..#..######..#..#.#..
|
||||||
|
####.#.##.......##.###....##.#..####.#.#######..#...###..##.##..#...#...####........#.#..##...#....#
|
||||||
|
#..#.#.....#..#.###..#.#...###..##...#.#..#.#.##..#...##.##.##.#.#.#..#.####.########....########..#
|
||||||
|
#...#..##.##..#.#.#.##.##.##.#..#..#.##....#....###.#.###.#.#..#....#...##..#.....####...##.#..#...#
|
||||||
|
.###...##...####....###.##.#..####...##.#.##.#..##..##....#....##.#...#..#..##..##..##.#...#...###..
|
||||||
|
.#..##.#..##..####..#.#.##..###.#...#....##.###...#.###....#.#.#........#..#.#.#..##..#####..#..#.#.
|
||||||
|
.#.##.....#..#...#.##.....#.##..#..#....#..#..#....#.##..##...#.##.##..##..#.#.#.##..####.##..#.#..#
|
||||||
|
...###.#.....#...#.##.#.###.#...##..#.###..#..#..#.#..#...###.#.##.##.##.#.##.#####.#..#.#..#.#...##
|
||||||
|
#.#.#.#.##.#.....##..#.###......##.#.##..#...#.########.##.###..#..#..##..##.#..##..###.#.###...#.#.
|
||||||
|
..##...##...#...###.#..##..#..#..#.#.##..##......##..##.....##.....####..#.##......#..####...###..##
|
||||||
|
##.......#..##....###...###......#.##.##....######..###.##...##.#...#...#.....#.###.#.#..#.##..#..#.
|
||||||
|
#.#..#..#.#####.##.##.###..#...###.....#..##..####...#.#.###....#..#.#.###.####..#.#........##.#....
|
||||||
|
..###.#...##.#.####.#.##.##.....##...#.##.#.###.#.#..##.#..##..#..##.##....#.#####.##..#######.....#
|
||||||
|
###.###..##.#..##...#####..##.####....#.##......##......#.#....##.####.#.#.#.###...#..####..#.######
|
||||||
|
#..###...#.#.......#..####.####...#....###.###...#.##..##..#..##.##.......####.##...#.#.#.##.#.#..#.
|
||||||
|
..#...#..###.##..#.#.#.##..#..#.#.......###..###..#####.#.#.#.#.#..#.#.#.#..###....#.####..###...#..
|
||||||
|
...######.###....#..####.####......#...#.###.#....#...####.##........##...##.#..##.###.#..#..##..###
|
||||||
|
.#..###.####.###.#.#..#..#..#.##.#.#.###.##..####.#####..##....##.#.##...###.####.#.#######.#..#..#.
|
||||||
|
.#..##.#..##..#...##...#..#..##.#.#....##.##...###.#.#...##..##..#.###.#.#.#.#...#....#.#..#.#.###.#
|
||||||
|
.###..#.#..####.#########...####....####.#.##...##.##..#.##.#........#.....###.###.######.##.....###
|
||||||
|
..##.##..##..#.####.#..#####.#....##.##.#####.....#.#......##...#####..####....###..#.#...#..####..#
|
||||||
|
.#..##..##.##.##.##.#.###.###.#..#..#...###.#.##..##...##...###...##.###..#.#.#####.#.#.##....#.##..
|
||||||
|
...#.#....##.#.....###.##...#..##....#...###....#..#.###...##.#...###.#....#...##..###.#.....##....#
|
||||||
|
.#######..#...##.#.###.##.#.###...##......#.###.#...#.###.#.#.#..#..#####..#########...##..##...#..#
|
||||||
|
.#..#.##...#.#..#.##..#.#.#.##.....####.#..#.###..##.#.#.#...#....#.#..##.######...#.#..##.##...#..#
|
||||||
|
#.#######.#####..#####.##.##.#.#.##.###..#....####.#..##.##.######..###...#.#..#.####.##.##....####.
|
||||||
|
...##..#...##..#..#.....#.##...#.....##.#####.###.########.######..#...###..#.##.#.#.##..#.#.##..##.
|
||||||
|
#..#..#.#....###.#...##..####.#.##..#.####.###..##.#...#.###.#..#.##..#######.#...#..#.#..##.#....##
|
||||||
|
..#.##.#.####..##.###.###..#.##.#.####..##....##.###.#..##.#.###.###.##.##.#####..#.#...########....
|
||||||
|
.#.#.###..###...#...#..##.##......#..#...#.#.#.######.#.#...##..##........#....###..##...#..##.##...
|
||||||
|
##..#....##.###...##.#.##.##.##..#....#.#.#..#..####.##..#...#...#..#..#####.###...#..###..#...#.#..
|
||||||
|
##.#.#.##.###.....######.#.....#...#.##....###.#.##.#.#.##..##.######.#####....#.#####...##.#..###.#
|
||||||
|
######.#...####..###..##..#..##...#.#....##.#...##...#.....#...##....#.##..###..###...###..#..######
|
||||||
|
.....##.........#####.#.##..#..#.#.#.#.##...#....#.....###.########...#..####..#...#...##..#.##.##.#
|
||||||
|
#..###...#.##.##.#.#..####.#.....##..###....##..#...#.#...##.##..###..####...#.####..##..#..##..#...
|
||||||
|
#.####.#..##.#..#.....#..#.#..###...######.#.........####....###..#.#.#.##.#..#...#..####.....##..#.
|
||||||
|
..##....#.###.......##.#...#.####..##....##.#..#....#######...####.##..#####.#.#.#.#.##..##..#.#.#..
|
||||||
|
#.#.#.###..#..#.#..#.#.###....#...#####.###...........#.#....#####...#..####....#...###.#..#..####..
|
||||||
|
.......#.####.##...#..#.##..###..#..#.#.#.#.###....#....#.#.#..#.#..##.#####.#.....#.##.#.###.###.##
|
||||||
|
..###...#..#...####.#..##..##.#.#..#...#.#..#....###.#..####..######...####.#.##..#.#..###...##.####
|
||||||
|
..#.###..#.#...##...#.#....#..#...#.#..##.######.######.#.##.....#..##.#..###..#..#.##.###...#..#.##
|
||||||
|
####..##.####.....#...#.#.###..#...####.###.#.#.#.......##...#....#..#....#.#......###...#####.#.##.
|
||||||
|
#..##..#..#.####...#####.#.###.##.#.##.....#.#..#.##........######.#.#.###....##.##..##..########.##
|
||||||
|
#.#....###.##....#######.#...#.#.#.#..##.#.##...#.###...#.#.#..#.#..####.#.#..#..#.##.####....#..##.
|
||||||
|
####.##....#.......###..#..##.#.#.##..#...#...##.###....##..###.#.#...#..#.....##.###.##...###....##
|
||||||
|
..##.#..#....######..#.##.#.#...##..####.#####...##.#..###.##...#..####..###.##..##.##.#####.#..#.#.
|
||||||
|
.#.##..#..##.#.###.###....#.#..#....#...###.##.#.#.####.....#....#...#.....#....#.#.###.#..#.##..###
|
||||||
|
..###.#.#.##...##.##.##.#...#####.#..##.#....##..####...###..#....#.##...#........#####.#.###.#..#..
|
||||||
|
....#..##..##....#.#....#.#..##...##.#...##.###.#.#..###..##.##.##..#.#.#..#.#.##.......#.##.###..#.
|
||||||
|
.#..##.##.####.##....##.##.....###..##.#.##...#..###....###.###....#.#....#....#.##.#.##.#.##.....##
|
||||||
|
#.#..#.##.###.#.######.....###.#..#...#.#.....##.###.#...#.#..###.#.....##.###.#.###.####..#####.#..
|
||||||
|
#.#.##......#.##.#.#..##....#..###.#.###...##...###.#..#.##...#..#.##..##.#...######.##.....#####.##
|
||||||
|
#.#..#####....###.###...#.......#....###.##...#..#.##..#...#####..#..#.##......###...#...###..#.#..#
|
||||||
|
#.##..##.##.#..#.##.##..#.###.##.........###.#.#..#.#.....#.#...#.#.##.#.##.#...#...####.#.......##.
|
||||||
|
.#...####.##..#..##....####..######...#.#..##.##.....#####.#...#..#.####.#######...#.#####..#.###...
|
||||||
|
.#..######.#.##..##...##.....###.#..##..#...####..###...###.###..#..######.#....########..#####...#.
|
||||||
|
#..##.......#####...###..#.#.##.#..###.#...##.#..#.##.###...###...##.#..##..########..#.#..##..#.###
|
||||||
|
.#.#..#...#.#..#..##...#.#.##...###..#..#....###.#....#.##....###.###..##..#.#.####..####.#######.##
|
||||||
|
...##..##.##.###.##.###...##.#.#.....##.####..#..##.#..#.####...##..#..#.##...##...###.##.#.......##
|
||||||
|
.#.....#.##..#.#.....#.##.##..###..#....###...#.#....##########.##.###.#...#.####..####.#..#.#..###.
|
||||||
|
.##.#.#.##..#..###.###.##.#########.#.#.#.#.##.###..##..#.##.####......#####...#..####.#.##..#####.#
|
||||||
|
..#....###...##....#.###..##..#..####.##..####.#..####.###.#....####.....#.###..##...##..####...##.#
|
||||||
|
.###.....###.##.##..###.###.....##..#.######.#.#..##..#.##.#..#.#.#....#...#.#.#...#...##....#..##.#
|
||||||
|
..##....#..#####....#..####.#.#...##.#....##..##.###.###....###......#...#.#####.......#...#.....###
|
||||||
|
###.#..#.#.##..#..#...#.#....###.##.#.###.#...#.##.#..#.#.......#.#.#.###.####.###....#..##..#####..
|
||||||
|
.#..#######.#..###.#.##.#####.#####...##..#.####.#.#.##..###...#..##.##..#.#.###..#....#..#...###.#.
|
||||||
|
..#####..#.##.....###..##.#...#.#.#..#######.#..#...#.##.##.#.#....####...###..##...#....####.#..#.#
|
||||||
|
.####..#.#.##.###.#.##.....#..##.#.....###.....#..##...#....###.###..#......###.#.#.#.##.#.##..#...#
|
||||||
|
##.#..##.#..##...#.#....##..######..#.....#..#...#####....##......####.##..#...##..#.##.#.#######..#
|
||||||
|
##..####.#...##...#.#####.#.#..#....#.#..##.####.#..######.#..#..#.......#####..#..#..###.##...##.##
|
||||||
|
#.####......#.###...#..####.#..##.##..#.#...##.###.#...#####..####.#..#.#.....#.##...###...#.#....##
|
||||||
|
###.#.#.##.######......#.#.#.#.#........#..#..###.#.#.#..#.........#..#....#.#..#..#..###.##......##
|
||||||
|
##.#########...#...###..#.###.....#.#.##.........###....#.####.#...###.#..##..#.###..#..##......#.##
|
6
2015/day-18/inputs/test.txt
Normal file
6
2015/day-18/inputs/test.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.#.#.#
|
||||||
|
...##.
|
||||||
|
#....#
|
||||||
|
..#...
|
||||||
|
#.#..#
|
||||||
|
####..
|
131
2015/day-18/main.rb
Executable file
131
2015/day-18/main.rb
Executable file
@ -0,0 +1,131 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "pathname"
|
||||||
|
require "set"
|
||||||
|
|
||||||
|
class Grid
|
||||||
|
NEIGHBOR = {
|
||||||
|
n: [0, -1],
|
||||||
|
s: [0, 1],
|
||||||
|
e: [1, 0],
|
||||||
|
w: [-1, 0],
|
||||||
|
ne: [1, -1],
|
||||||
|
se: [1, 1],
|
||||||
|
nw: [-1, -1],
|
||||||
|
sw: [-1, 1],
|
||||||
|
}.map(&:freeze).to_h.freeze
|
||||||
|
|
||||||
|
def add_row(row)
|
||||||
|
@area ||= []
|
||||||
|
row = row.map { |x| x == "#" ? 1 : 0 }
|
||||||
|
@width ||= row.size
|
||||||
|
@area.push(row[0..@height])
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s = @area.map(&:to_s).join("\n")
|
||||||
|
def row_count = @area.size
|
||||||
|
def col_count = @width
|
||||||
|
|
||||||
|
def dup
|
||||||
|
grid = self.class.new
|
||||||
|
grid.instance_variable_set(:@area, @area.map(&:dup).dup)
|
||||||
|
grid.instance_variable_set(:@width, @width.dup)
|
||||||
|
grid.instance_variable_set(:@sticky, @sticky&.dup)
|
||||||
|
grid
|
||||||
|
end
|
||||||
|
|
||||||
|
def []=(x, y, val)
|
||||||
|
return if @sticky&.include?([x, y])
|
||||||
|
@area[y][x] = val
|
||||||
|
end
|
||||||
|
|
||||||
|
def [](x, y)
|
||||||
|
@area[y][x]
|
||||||
|
end
|
||||||
|
|
||||||
|
def make_sticky(x, y, val = 1)
|
||||||
|
@sticky ||= Set.new
|
||||||
|
self[x, y] = val
|
||||||
|
@sticky.add([x, y])
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_on
|
||||||
|
@area.sum { |r| r.sum }
|
||||||
|
end
|
||||||
|
|
||||||
|
def advance(steps)
|
||||||
|
steps.times do |step|
|
||||||
|
change_count = advance_step()
|
||||||
|
return step if change_count.zero?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def advance_step
|
||||||
|
changes = []
|
||||||
|
|
||||||
|
@area.each_with_index do |row, y|
|
||||||
|
row.each_with_index do |_, x|
|
||||||
|
nb_on_count = neighbors_that_are_on(x, y)
|
||||||
|
|
||||||
|
if self[x, y] == 1 && (nb_on_count < 2 || nb_on_count > 3)
|
||||||
|
changes.push([x, y, 0])
|
||||||
|
elsif self[x, y] == 0 && nb_on_count == 3
|
||||||
|
changes.push([x, y, 1])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
changes.each do |(x, y, val)|
|
||||||
|
self[x, y] = val
|
||||||
|
end
|
||||||
|
|
||||||
|
changes.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def neighbors_that_are_on(x, y)
|
||||||
|
NEIGHBOR.keys.sum { |d| neighbor_on?(x, y, d) ? 1 : 0 }
|
||||||
|
end
|
||||||
|
|
||||||
|
def neighbor_on?(x, y, direction)
|
||||||
|
nb_x, nb_y = NEIGHBOR[direction].then { |(nx, ny)| [x + nx, y + ny] }
|
||||||
|
return false if nb_x < 0 || nb_y < 0
|
||||||
|
|
||||||
|
neighbor = @area.dig(nb_y, nb_x)
|
||||||
|
return false unless neighbor
|
||||||
|
|
||||||
|
neighbor == 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_file(file)
|
||||||
|
file.each_line.each_with_object(Grid.new) do |line, grid|
|
||||||
|
grid.add_row(line.chomp.chars)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def main(file_paths)
|
||||||
|
file_paths.each do |file_path|
|
||||||
|
puts "File: #{file_path}"
|
||||||
|
|
||||||
|
grid1 = parse_file(file_path)
|
||||||
|
grid2 = grid1.dup
|
||||||
|
|
||||||
|
grid1.advance(100)
|
||||||
|
solution1 = grid1.count_on
|
||||||
|
puts " Solution 1: #{solution1}"
|
||||||
|
|
||||||
|
grid2.make_sticky(0, 0)
|
||||||
|
grid2.make_sticky(0, grid2.col_count - 1)
|
||||||
|
grid2.make_sticky(grid2.row_count - 1, 0)
|
||||||
|
grid2.make_sticky(grid2.row_count - 1, grid2.col_count - 1)
|
||||||
|
grid2.advance(100)
|
||||||
|
|
||||||
|
solution2 = grid2.count_on
|
||||||
|
puts " Solution 2: #{solution2}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
main(ARGV.map { |x| Pathname(x) })
|
Loading…
Reference in New Issue
Block a user