[2017][ruby][3.1]
change noyrpltzrxtmvnqzkvqlrwsowqvwtknr
commit c48d2b329698e16cba831de1083ba2b741d0dbc1
author Alpha Chen <alpha.chen@gmail.com>
date
parent runxoopv
diff --git a/2017/ruby/day_03.rb b/2017/ruby/day_03.rb
index a4139af..7ca6ce3 100644
--- a/2017/ruby/day_03.rb
+++ b/2017/ruby/day_03.rb
@@ -59,12 +59,37 @@ class Spiral
   end
 end
 
+class Grid
+  def initialize
+    @grid = Hash.new {|h,(x,y)|
+      neighbors = [[-1, 1], [0, 1], [1, 1],
+                   [-1, 0],         [1, 0],
+                   [-1,-1], [0,-1], [1,-1]]
+      h[[x,y]] = neighbors
+        .map {|i,j| [x+i,y+j] }
+        .select {|i,j| h.has_key?([i,j]) }
+        .map {|i,j| h[[i,j]] }
+        .sum
+    }
+    @grid[[0,0]] = 1
+  end
+
+  def [](x,y)
+    @grid[[x,y]]
+  end
+end
+
 if $0 == __FILE__
-  if ARGV.shift == "test"
-    require "minitest/test"
-  else
+  case ARGV.shift
+  when "test"
+    require "minitest/autorun"
+  when "0"
     input = ARGF.read.to_i
     p Spiral.new.each.with_index.find {|_,i| i == input - 1 }.first.sum
+  when "1"
+    input = ARGF.read.to_i
+    grid = Grid.new
+    p Spiral.new.each.lazy.map {|x,y| grid[x,y] }.find {|value| value > input }
   end
 end
 
@@ -87,3 +112,15 @@ class TestSpiral < Minitest::Test
     assert_equal [0,-2], spiral.each.with_index.find {|_,i| i == 22 }.first
   end
 end
+
+class TestGrid < Minitest::Test
+  def test_grid
+    grid = Grid.new
+    assert_equal 1, grid[0,0]
+    assert_equal 1, grid[1,0]
+    assert_equal 2, grid[1,1]
+    assert_equal 4, grid[0,1]
+    assert_equal 5, grid[-1,1]
+    assert_equal 10, grid[-1,0]
+  end
+end