# coffee-can problem from "Science of Programming" by David Gries
class Bean(object):
"""
bean class
- has colorattribute. valid colors - BLACK or WHITE
"""
def __init__(self, color):
assert color == "WHITE" or color =="BLACK"
self.color = color
def __str__(self):
return self.color
class Container(object):
"""
container for beans
"""
def __init__(self, l):
self.beans = {}
self.length =l
self.currentIndex = 0
def initialize(self):
import random
for x inxrange(self.length):
t = random.randint(0, self.length)
if t % 2 == 0: # even - create black bean
b= Bean("BLACK")
self.beans[self.currentIndex] = b
else: # create white bean
b =Bean("WHITE")
self.beans[self.currentIndex] = b
self.currentIndex = self.currentIndex + 1
def__str__(self):
return '\n'.join(str(k) + ': ' + str(self.beans[k])
for k in self.beans)
def addBlackBean(self):
b = Bean("BLACK")
self.beans[self.currentIndex] = b
self.currentIndex =self.currentIndex + 1
def coffeeCan(self):
"""
pull out 2 beans in random
- ifthey are of same color, remove them and add a black bean
- if they are of different color, throw black bean out and return
white bean to the container
"""
import random
first, second = -1, -1
while True:
if(len(self.beans) == 1):
print 'remaining coffee-can: ', self
return
## while True: # to make sure we pull out bean in container
## first = random.randint(0, self.currentIndex)
## if firstinself.beans: break
first = random.choice(self.beans.keys())
whileTrue:
# to make sure we pull 2 different beans and
# a bean from container
## second =random.randint(0, self.currentIndex)
second = random.choice(self.beans.keys())
if second != first and second inself.beans: break
print 'pulling out ', first, ' and ', second
if self.beans[first].color ==self.beans[second].color:
print 'same color, removing them and adding a black bean'
delself.beans[first]
del self.beans[second]
self.addBlackBean()
else:
print 'different colors. removing black bean'
if self.beans[first].color == "BLACK":
delself.beans[first]
else:
del self.beans[second]
print self
c =Container(4)
c.initialize()
print c
c.coffeeCan()
Yet another blog from yet another software engineer - a collection of my thoughts and some snippets of code I write (mainly for my later reference). If you find this useful, lets discuss in comments.
November 26, 2012
coffee-can problem
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment