[2016][ruby][11.0] make a Floor object
change wkwszkwnmvysxqlzsmmsysutuvxzrput
commit 4f05cf9dfb1365667013425d40a2fa83d07f3a40
author Alpha Chen <alpha.chen@gmail.com>
date
parent yvyzrtvm
diff --git a/2016/ruby/day_11.rb b/2016/ruby/day_11.rb
index 7fe53fd..4572403 100644
--- a/2016/ruby/day_11.rb
+++ b/2016/ruby/day_11.rb
@@ -1,3 +1,5 @@
+require 'delegate'
+
 class State
   attr_reader :floors, :elevator
 
@@ -5,27 +7,48 @@ class State
     @floors = input.lines.reverse.map.with_index {|line, index|
       _, e, *items = line.split(/\s+/)
       @elevator = index if e == ?E
-      items.reject {|item| item == ?. }
+      Floor.new(items.reject {|item| item == ?. })
     }
   end
 end
 
+class Floor < SimpleDelegator
+  attr_reader :source
+
+  def initialize(items)
+    @source = super(items)
+  end
+
+  def microchips
+    source.select {|item| item.end_with?(?M) }.map {|item| item.chomp(?M) }
+  end
+
+  def generators
+    source.select {|item| item.end_with?(?G) }.map {|item| item.chomp(?G) }
+  end
+end
+
 require 'minitest/autorun'
 
 class TestDay11 < Minitest::Test
-  def test_initialize
-    input = <<-INPUT
+  INPUT = <<-INPUT
 F4 .  .  .  .  .
 F3 .  .  .  LG .
 F2 .  HG .  .  .
 F1 E  .  HM .  LM
-    INPUT
+  INPUT
 
-    state = State.new(input)
-    assert_equal 4, state.floors.size
-    assert_equal 0, state.elevator
+  def setup
+    @state = State.new(INPUT)
+  end
+
+  def test_initialize
+    assert_equal 4, @state.floors.size
+    assert_equal 0, @state.elevator
 
-    floor = state.floors[0]
+    floor = @state.floors[0]
     assert_equal 2, floor.size
+    assert_equal %w[ H L ], floor.microchips
+    assert_empty floor.generators
   end
 end