[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! yield @state
@steps[0] -= 1 @state = @state.zip(
@square = @square.zip(@dir).map {|i,j| i+j } case dir
if @steps[0] == 0 when :r
change_dir! [1, 0]
@steps << next_steps when :u
@steps.shift [0, 1]
end when :l
[-1, 0]
when :d
[0, -1]
end end
).map {|a,b| a + b }
def change_dir!
@dir = case @dir
when [1,0]
[0,1]
when [0,1]
[-1,0]
when [-1,0]
[0,-1]
when [0,-1]
[1,0]
else
raise "invalid dir: #@dir"
end end
end end
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
class Grid class Grid

Loading…
Cancel
Save