-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_3.rb
75 lines (61 loc) · 1.14 KB
/
day_3.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class SpiralNode
attr_reader :num, :x, :y, :dir
def initialize(num, x, y, dir)
@num = num
@x = x
@y = y
@dir = dir
end
def to_s
"SpiralNode:\n num: #{num}\n dir: #{dir}\n x: #{x}\n y: #{y}\n Steps to origin: #{x.abs + y.abs}"
end
end
class Spiral
attr_reader :last_node, :max_x, :min_x, :max_y, :min_y
def initialize(num)
@last_node = SpiralNode.new(1, 0, 0, :r)
@max_x = 0
@min_x = 0
@max_y = 0
@min_y = 0
while last_node.num < num
next_node
end
end
def next_node
num = last_node.num + 1
x = last_node.x
y = last_node.y
dir = last_node.dir
case dir
when :r
x += 1
if x > max_x
dir = :u
@max_x = x
end
when :u
y += 1
if y > max_y
dir = :l
@max_y = y
end
when :l
x -= 1
if x < min_x
dir = :d
@min_x = x
end
when :d
y -= 1
if y < min_y
dir = :r
@min_y = y
end
else
raise "Cannot compute!"
end
@last_node = SpiralNode.new(num, x, y, dir)
end
end
puts Spiral.new(ARGV[0].to_i).last_node.to_s