[2017][ruby][3.x] refactor spiral enumerator

sorbet
Alpha Chen 7 years ago
parent be421a9943
commit 9ff29145e6

@ -2,61 +2,35 @@ require "minitest"
class Spiral class Spiral
def initialize def initialize
@square = [0,0] @state = [0,0]
@dir = [1,0]
@steps = [1, 1]
end end
def each def each
return enum_for(__method__) unless block_given? return enum_for(__method__) unless block_given?
loop do (1..Float::INFINITY).lazy
yield @square .flat_map {|i| [i, i] }
step! .zip(%i[r u l d].cycle)
end .flat_map {|n,d| Array.new(n, d) }
end .each do |dir|
private
def step!
@steps[0] -= 1
@square = @square.zip(@dir).map {|i,j| i+j }
if @steps[0] == 0
change_dir!
@steps << next_steps
@steps.shift
end
end
def change_dir! yield @state
@dir = case @dir @state = @state.zip(
when [1,0] case dir
when :r
[1, 0]
when :u
[0, 1] [0, 1]
when [0,1] when :l
[-1, 0] [-1, 0]
when [-1,0] when :d
[0, -1] [0, -1]
when [0,-1]
[1,0]
else
raise "invalid dir: #@dir"
end
end end
).map {|a,b| a + b }
def next_steps
case @dir
when [1,0]
@steps[1]
when [0,1]
@steps[1] + 1
when [-1,0]
@steps[1]
when [0,-1]
@steps[1] + 1
else
raise "invalid dir: #@dir"
end end
end end
end end
class Grid class Grid

Loading…
Cancel
Save