[2016][ruby][18.0] Row#next
change yqmzystnnyutloklrqkmpkxmwuqwknvl
commit 63c71f2258c37d31dd5816cbdee70faf096ff718
author Alpha Chen <alpha.chen@gmail.com>
date
parent uzmlrroo
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