[2016][ruby][18.0] Row#next
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