prisoner_puzzle 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|