diff --git a/2016/ruby/day_18.rb b/2016/ruby/day_18.rb index 9e13bcb..6f77297 100644 --- a/2016/ruby/day_18.rb +++ b/2016/ruby/day_18.rb @@ -1,10 +1,26 @@ -class Row +Row = Struct.new(:tiles) do INPUT_MAP = { ?. => :safe, ?^ => :trap } - attr_reader :tiles + def self.from_s(input) + new(input.chars.map {|char| INPUT_MAP.fetch(char) }) + end - def initialize(input) - @tiles = input.chars.map {|char| INPUT_MAP.fetch(char) } + def next + self.class.new( + %i[ safe safe ].insert(1, *tiles).each_cons(3).map {|l,c,r| + if l == :trap && c == :trap && r == :safe + :trap + elsif l == :safe && c == :trap && r == :trap + :trap + elsif l == :trap && c == :safe && r == :safe + :trap + elsif l == :safe && c == :safe && r == :trap + :trap + else + :safe + end + } + ) end end @@ -12,7 +28,9 @@ require 'minitest/autorun' class TestRow < Minitest::Test def test_row - row = Row.new('..^^.') + row = Row.from_s('..^^.') assert_equal %i[ safe safe trap trap safe ], row.tiles + + assert_equal Row.from_s('.^^^^'), row.next end end