hanoi-jane 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/hanoi/jane.rb +1 -0
- data/lib/hanoi/jane/animation.rb +79 -0
- data/lib/hanoi/jane/cli.rb +26 -1
- data/lib/hanoi/jane/formatters/console.rb +5 -5
- data/lib/hanoi/jane/formatters/matrix.rb +16 -5
- data/lib/hanoi/jane/towers.rb +20 -8
- data/lib/hanoi/jane/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d7f114e32d1a1e8f3a9f59cf07c86c0d68c9a17
|
4
|
+
data.tar.gz: b78e6dbd9b7deffc063e60049e22888183742a7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 695210a096216a3c91bdf43e8ff86cc3130cf8657bf5a6ef66c6f1da2ce17ca0bc26cb9f1420ba02c3e5d1c21ee03610afa9f9140a0919529ae64959b42111d4
|
7
|
+
data.tar.gz: bc72d1599263f725be624fb56c4d7ee6e488d44658f6627a2620a40b1e1eb062b14ce0048ababc968439abbd329c0c9e5a0c7b298a49db5a3c7cee693e703ee7
|
data/lib/hanoi/jane.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
module Hanoi
|
2
|
+
module Jane
|
3
|
+
class Animation
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_reader :stacks
|
7
|
+
|
8
|
+
def initialize towers
|
9
|
+
@towers = towers
|
10
|
+
@height = towers.discs
|
11
|
+
@stacks = Animation.pad towers.old_stacks, @height
|
12
|
+
@disc = towers.disc
|
13
|
+
@source = towers.source
|
14
|
+
@destination = towers.sink
|
15
|
+
@fancy = towers.fancy
|
16
|
+
|
17
|
+
@lift = true
|
18
|
+
@drop = false
|
19
|
+
@done = false
|
20
|
+
end
|
21
|
+
|
22
|
+
def animate
|
23
|
+
@drop = true unless @lift
|
24
|
+
if @lift
|
25
|
+
stack = @stacks[@source]
|
26
|
+
@position = stack.index @disc
|
27
|
+
stack[@position] = nil
|
28
|
+
|
29
|
+
if @position + 1 >= @height
|
30
|
+
@lift = false
|
31
|
+
else
|
32
|
+
stack[@position + 1] = @disc
|
33
|
+
end
|
34
|
+
|
35
|
+
@stacks[@source] = stack
|
36
|
+
end
|
37
|
+
|
38
|
+
if @drop
|
39
|
+
stack = @stacks[@destination]
|
40
|
+
@position = -1 unless @position
|
41
|
+
|
42
|
+
stack[@position] = @disc
|
43
|
+
stack[(stack.index @disc) + 1] = nil
|
44
|
+
|
45
|
+
@position -= 1
|
46
|
+
|
47
|
+
@stacks[@destination] = stack.take @height
|
48
|
+
|
49
|
+
if stack[@position] || @position == 0
|
50
|
+
@drop = false
|
51
|
+
@done = true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
(Formatters::Console.new @height, @stacks, @fancy).to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
def matrix
|
61
|
+
m = Formatters::Matrix.new @towers
|
62
|
+
m.stacks = @stacks
|
63
|
+
|
64
|
+
m
|
65
|
+
end
|
66
|
+
|
67
|
+
def each
|
68
|
+
until @done
|
69
|
+
animate
|
70
|
+
yield self
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def Animation.pad stacks, height
|
75
|
+
stacks.map { |stack| stack + Array.new(height - stack.length) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/hanoi/jane/cli.rb
CHANGED
@@ -13,6 +13,7 @@ module Hanoi
|
|
13
13
|
option :phat, type: :string, required: true
|
14
14
|
option :constrained, type: :boolean
|
15
15
|
option :interval, type: :numeric, default: 0.3
|
16
|
+
option :animated, type: :boolean, default: false
|
16
17
|
|
17
18
|
def phat
|
18
19
|
towers = Towers.new 5
|
@@ -20,7 +21,16 @@ module Hanoi
|
|
20
21
|
towers = ConstrainedTowers.new 5
|
21
22
|
end
|
22
23
|
|
24
|
+
towers.animated = options[:animated]
|
25
|
+
|
23
26
|
towers.each do |state|
|
27
|
+
if state.animation
|
28
|
+
state.animation.each do |frame|
|
29
|
+
Hanoi::Jane.hit_phat frame, options[:phat]
|
30
|
+
sleep options[:interval] * 0.1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
24
34
|
Hanoi::Jane.hit_phat towers, options[:phat]
|
25
35
|
sleep options[:interval]
|
26
36
|
end
|
@@ -30,6 +40,9 @@ module Hanoi
|
|
30
40
|
option :discs, type: :numeric, default: 3, minimum: 1
|
31
41
|
option :constrained, type: :boolean
|
32
42
|
option :fancy, type: :boolean, default: false
|
43
|
+
option :animated, type: :boolean, default: false
|
44
|
+
option :delay, type: :numeric, default: 0.2
|
45
|
+
|
33
46
|
def console
|
34
47
|
if options[:discs] < 1
|
35
48
|
puts "Solving for %d discs makes no sense" % options[:discs]
|
@@ -43,14 +56,26 @@ module Hanoi
|
|
43
56
|
end
|
44
57
|
|
45
58
|
towers.fancy = options[:fancy]
|
59
|
+
towers.animated = options[:animated]
|
46
60
|
|
47
61
|
towers.each do |state|
|
62
|
+
if state.animation
|
63
|
+
state.animation.each do |frame|
|
64
|
+
system('clear')
|
65
|
+
s = options[:fancy] ? (Formatters::Console.fancify state.rebased) : state.rebased
|
66
|
+
puts s
|
67
|
+
puts
|
68
|
+
puts frame
|
69
|
+
sleep options[:delay] * 0.2
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
48
73
|
system('clear')
|
49
74
|
s = options[:fancy] ? (Formatters::Console.fancify state.rebased) : state.rebased
|
50
75
|
puts s
|
51
76
|
puts
|
52
77
|
puts state.console
|
53
|
-
sleep
|
78
|
+
sleep options[:delay]
|
54
79
|
end
|
55
80
|
|
56
81
|
puts '%d moves to solve for %d discs' % [towers.total, options[:discs]]
|
@@ -18,10 +18,10 @@ module Hanoi
|
|
18
18
|
horiz_divider: '🔻'
|
19
19
|
}
|
20
20
|
|
21
|
-
def initialize
|
22
|
-
@discs =
|
23
|
-
@stacks =
|
24
|
-
@@chars =
|
21
|
+
def initialize discs, stacks, fancy = false
|
22
|
+
@discs = discs
|
23
|
+
@stacks = stacks.clone.map { |s| s.clone }
|
24
|
+
@@chars = fancy ? FANCY_CHARS : CHARS
|
25
25
|
end
|
26
26
|
|
27
27
|
def to_s
|
@@ -43,7 +43,7 @@ module Hanoi
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def Console.pad array, length
|
46
|
-
Array.new(length
|
46
|
+
Array.new(length - array.length) + array.reverse
|
47
47
|
end
|
48
48
|
|
49
49
|
def Console.make_disc width, space
|
@@ -6,17 +6,28 @@ module Hanoi
|
|
6
6
|
@stacks = towers.stacks
|
7
7
|
@digits = towers.rebased
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
populate
|
10
|
+
end
|
11
|
+
|
12
|
+
def stacks= stacks
|
13
|
+
@stacks = stacks
|
14
|
+
populate
|
15
|
+
end
|
16
|
+
|
17
|
+
def populate
|
18
|
+
7.times do |i|
|
19
|
+
self[i] = [0] * 45
|
11
20
|
end
|
12
21
|
|
13
22
|
offset = 0
|
14
23
|
@stacks.each do |stack|
|
15
24
|
total = 0
|
16
25
|
stack.each do |disc|
|
17
|
-
|
18
|
-
|
19
|
-
|
26
|
+
if disc
|
27
|
+
shim = ((5 - (disc + 1)) / 2).round
|
28
|
+
(disc + 1).times do |i|
|
29
|
+
self[6 - total][i + offset + shim] = 1
|
30
|
+
end
|
20
31
|
end
|
21
32
|
total += 1
|
22
33
|
end
|
data/lib/hanoi/jane/towers.rb
CHANGED
@@ -3,8 +3,8 @@ module Hanoi
|
|
3
3
|
class Towers
|
4
4
|
include Enumerable
|
5
5
|
|
6
|
-
attr_reader :total, :stacks, :discs
|
7
|
-
attr_accessor :fancy
|
6
|
+
attr_reader :total, :stacks, :discs, :old_stacks, :disc, :source, :sink
|
7
|
+
attr_accessor :fancy, :animated, :animation
|
8
8
|
|
9
9
|
def initialize discs
|
10
10
|
@discs = discs
|
@@ -12,12 +12,20 @@ module Hanoi
|
|
12
12
|
@base = 2
|
13
13
|
@stacks = [(0...discs).to_a.reverse, [], []]
|
14
14
|
@fancy = false
|
15
|
+
@animated = false
|
15
16
|
end
|
16
17
|
|
17
18
|
def move
|
19
|
+
@old_stacks = @stacks.clone.map { |s| s.clone }
|
20
|
+
|
18
21
|
diff
|
19
|
-
find_disc
|
20
|
-
@
|
22
|
+
@source = find_disc
|
23
|
+
@sink = find_stack
|
24
|
+
@stacks[@sink].push @stacks[@source].pop
|
25
|
+
|
26
|
+
if @animated
|
27
|
+
@animation = Animation.new self
|
28
|
+
end
|
21
29
|
end
|
22
30
|
|
23
31
|
def solved
|
@@ -29,7 +37,7 @@ module Hanoi
|
|
29
37
|
end
|
30
38
|
|
31
39
|
def console
|
32
|
-
(Formatters::Console.new
|
40
|
+
(Formatters::Console.new @discs, @stacks, @fancy).to_s
|
33
41
|
end
|
34
42
|
|
35
43
|
def inspect
|
@@ -37,7 +45,11 @@ module Hanoi
|
|
37
45
|
stacks: @stacks,
|
38
46
|
moves: @total,
|
39
47
|
binary: rebased,
|
40
|
-
moved:
|
48
|
+
moved: {
|
49
|
+
disc: @disc,
|
50
|
+
from: @source,
|
51
|
+
to: @sink
|
52
|
+
}
|
41
53
|
}
|
42
54
|
end
|
43
55
|
|
@@ -72,11 +84,11 @@ module Hanoi
|
|
72
84
|
|
73
85
|
def find_disc
|
74
86
|
@stacks.each_with_index do |stack, index|
|
75
|
-
|
87
|
+
return index if stack.index @disc
|
76
88
|
end
|
77
89
|
end
|
78
90
|
|
79
|
-
def find_stack
|
91
|
+
def find_stack
|
80
92
|
# if the next stack is empty, move there
|
81
93
|
if @stacks[(@source + 1) % 3] == []
|
82
94
|
return (@source + 1) % 3
|
data/lib/hanoi/jane/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanoi-jane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pikesley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- bin/setup
|
147
147
|
- hanoi-jane.gemspec
|
148
148
|
- lib/hanoi/jane.rb
|
149
|
+
- lib/hanoi/jane/animation.rb
|
149
150
|
- lib/hanoi/jane/cli.rb
|
150
151
|
- lib/hanoi/jane/constrained_towers.rb
|
151
152
|
- lib/hanoi/jane/formatters/console.rb
|