You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
advent-of-code/2018/ruby/day_17.rb

76 lines
1.4 KiB

require "set"
require "minitest"
require "minitest/pride"
class Slice
def self.parse(s)
clay = Set.new
s.scan(/^(x|y)=(\d+), (?:x|y)=(\d+)..(\d+)$/m).each do |xy, i, min, max|
i, min, max = [i, min, max].map(&:to_i)
clay.merge((min..max).map {|j| xy == ?x ? [j, i] : [i, j] })
end
new(clay)
end
def initialize(clay)
@clay = clay
end
def to_s
min_x, max_x = @clay.map(&:last).minmax
min_y, max_y = @clay.map(&:first).minmax
min_y = [0, min_y].min
(min_y..max_y).map {|y|
(min_x-1..max_x+1).map {|x|
if [x, y] == [500, 0]
?+
else
@clay.include?([y, x]) ? ?# : ?.
end
}.join
}.join(?\n)
end
end
class TestSlice < Minitest::Test
def test_parse_to_s
slice = Slice.parse(<<~SLICE)
x=495, y=2..7
y=7, x=495..501
x=501, y=3..7
x=498, y=2..4
x=506, y=1..2
x=498, y=10..13
x=504, y=10..13
y=13, x=498..504
SLICE
assert_equal <<~SLICE.chomp, slice.to_s
......+.......
............#.
.#..#.......#.
.#..#..#......
.#..#..#......
.#.....#......
.#.....#......
.#######......
..............
..............
....#.....#...
....#.....#...
....#.....#...
....#######...
SLICE
end
end
def solve(input)
end
if __FILE__ == $0
require "minitest/autorun" and exit if ENV["TEST"]
puts solve(ARGF.read)
end