prisoner_puzzle 0.0.3 → 0.0.4
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/prisoner.rb +15 -4
- data/lib/prisoner_puzzle.rb +29 -4
- data/lib/warden.rb +7 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b83b9436d9e8882da9bb631bcf978644916c4798
|
4
|
+
data.tar.gz: 7aea9cd1e465cb99b803fec311b63d5602bcb00a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04a650f289690a7dd96a2e367c3c2f07f807f2ccf590d94ed99063961ce117664ad508b49b98cb01fcca6e5cde61a5c1cfb3f8c601c2005b4ade1e3f25ccc56f
|
7
|
+
data.tar.gz: 3a16603c0f151e7d72850ba741cab18e507d4a488ab9c4756f3c5066c332f3167117bfe967ed99a7c0da3226a0c669a4bb7f8085066b45811980bbf95f7378e9
|
data/lib/prisoner.rb
CHANGED
@@ -1,17 +1,24 @@
|
|
1
1
|
class Prisoner
|
2
|
-
|
3
|
-
|
2
|
+
attr_writer :warden
|
3
|
+
attr_accessor :have_flipped, :leader, :id, :fool
|
4
|
+
def initialize switchbox=nil, prisoner_count=0, leader = false, fool = false, foolishness = 0
|
4
5
|
@have_flipped = false
|
5
6
|
@switchbox = switchbox
|
6
7
|
@leader = leader
|
7
8
|
@warden = nil
|
8
9
|
@prisoner_count = prisoner_count
|
9
10
|
@count = 0
|
11
|
+
@fool = fool
|
12
|
+
@foolishness = foolishness
|
13
|
+
@id = nil
|
10
14
|
end
|
11
15
|
|
12
16
|
def visit
|
13
17
|
if @leader
|
14
|
-
if @
|
18
|
+
if @fool and rand(100)+1 < @foolishness
|
19
|
+
@count += 1
|
20
|
+
end
|
21
|
+
if @count >= @prisoner_count + 1
|
15
22
|
puts "I am the leader of this prison gang, and I say we are free."
|
16
23
|
self.declare_finished(@warden)
|
17
24
|
elsif @switchbox.left == :OFF
|
@@ -30,12 +37,16 @@ class Prisoner
|
|
30
37
|
puts "New room!"
|
31
38
|
else
|
32
39
|
@switchbox.right_flip
|
33
|
-
|
40
|
+
print "."
|
41
|
+
end
|
42
|
+
if @fool and rand(100)+1 < @foolishness
|
43
|
+
have_flipped = false
|
34
44
|
end
|
35
45
|
end
|
36
46
|
end
|
37
47
|
|
38
48
|
def declare_finished warden
|
39
49
|
warden.finish
|
50
|
+
@count = 0
|
40
51
|
end
|
41
52
|
end
|
data/lib/prisoner_puzzle.rb
CHANGED
@@ -3,13 +3,35 @@ require './warden.rb'
|
|
3
3
|
require './switchbox.rb'
|
4
4
|
|
5
5
|
class PrisonerPuzzle
|
6
|
-
|
6
|
+
attr_accessor :warden_gentles
|
7
|
+
def initialize num_of_prisoners=23, time=72, fools=0, foolishness=0
|
7
8
|
box = Switchbox.new
|
8
9
|
prisoners = []
|
9
|
-
|
10
|
+
(num_of_prisoners-fools).times { prisoners.push(Prisoner.new(box, num_of_prisoners))}
|
11
|
+
fools.times { prisoners.push(Prisoner.new(box, num_of_prisoners, false, true, foolishness))}
|
12
|
+
n = 0
|
13
|
+
prisoners.each do |p|
|
14
|
+
p.id = n
|
15
|
+
n += 1
|
16
|
+
end
|
10
17
|
@warden_gentles = Warden.new(prisoners)
|
11
|
-
|
12
|
-
prisoners.
|
18
|
+
@warden_gentles.period = time
|
19
|
+
prisoners.sample.leader = true
|
20
|
+
|
21
|
+
prisoners.each do |p|
|
22
|
+
p.warden = @warden_gentles
|
23
|
+
end
|
24
|
+
|
25
|
+
prisoners.each do |p|
|
26
|
+
if p.leader
|
27
|
+
if p.fool
|
28
|
+
puts "Durr, I'm the leader"
|
29
|
+
else
|
30
|
+
puts "I am Prisoner ##{p.id}, and I am the leader."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
13
35
|
end
|
14
36
|
|
15
37
|
def run
|
@@ -17,5 +39,8 @@ class PrisonerPuzzle
|
|
17
39
|
@warden_gentles.take_into_room
|
18
40
|
end
|
19
41
|
puts "That took a total of #{@warden_gentles.hours_elapsed/24} days."
|
42
|
+
@warden_gentles.done = false
|
43
|
+
@warden_gentles.hours_elapsed = 0
|
44
|
+
@warden_gentles.visited.fill(false)
|
20
45
|
end
|
21
46
|
end
|
data/lib/warden.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
class Warden
|
2
|
-
attr_accessor :roster, :visited, :done, :hours_elapsed
|
2
|
+
attr_accessor :roster, :prisoners, :visited, :done, :hours_elapsed, :period, :done
|
3
3
|
def initialize *prisoners
|
4
4
|
@roster = []
|
5
|
-
@visited =
|
6
|
-
prisoners.each do |p|
|
5
|
+
@visited = []
|
6
|
+
prisoners.flatten.each do |p|
|
7
7
|
@roster.push(p)
|
8
|
-
@visited[p] = false
|
8
|
+
@visited[p.id] = false
|
9
9
|
end
|
10
10
|
@done = false
|
11
11
|
@hours_elapsed = 0
|
12
|
+
@period = 0
|
12
13
|
end
|
13
14
|
|
14
15
|
def take_into_room
|
15
16
|
selectee = @roster.flatten.sample
|
16
17
|
selectee.visit
|
17
|
-
@
|
18
|
+
@visited[selectee.id.to_i] = true
|
19
|
+
@hours_elapsed += rand(@period+1)
|
18
20
|
end
|
19
21
|
|
20
22
|
def finish
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prisoner_puzzle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Whitehead
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: "Simulation of the 100 prisoners and a light switch logic puzzle. \n
|
14
14
|
\ \t\t\t\t This gem simulates that experiment with 23 prisoners implementing the
|