home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyth_os2.zip / python-1.0.2 / Demo / stoffel / Commuter.py < prev    next >
Text File  |  1993-12-17  |  4KB  |  157 lines

  1. #module Commuter
  2.  
  3. from string import ljust, center
  4.  
  5. lj = ljust
  6.  
  7. MaxQ = 5  # const
  8.  
  9. class Person:
  10.    def __init__(self):  # proc
  11.       self.name = None
  12.       self.surname = None
  13.       self.job = None
  14.       self.dest = None
  15.       self.sport = None
  16.  
  17.    def show(self):  # proc
  18.       if self.name: print lj(self.name, 12),
  19.       else: print center('-', 12),
  20.       if self.surname: print lj(self.surname, 12),
  21.       else: print center('-', 12),
  22.       if self.job: print lj(self.job, 12),
  23.       else: print center('-', 12),
  24.       if self.dest: print lj(self.dest, 12),
  25.       else: print center('-', 12),
  26.       if self.sport: print lj(self.sport, 12)
  27.       else: print center('-', 12)
  28.  
  29.  
  30.  
  31. # Introduce symbols:
  32. Bert = 'Bert'; Bill = 'Bill'; Fred = 'Fred'; John = 'John'; Sam = 'Sam'
  33. Alberts = 'Alberts'; Fredericks = 'Fredericks'; Johnson = 'Johnson'; Samson = 'Samson'; Williams = 'Williams'
  34. bricklayer = 'bricklayer'; carpenter = 'carpenter'; plumber = 'plumber'; printer = 'printer'; welder = 'welder'
  35. Heathfield = 'Heathfield'; Kalk_Bay = 'Kalk_Bay'; Lakeside = 'Lakeside'; Retreat = 'Retreat'; Wynberg = 'Wynberg'
  36. cycling = 'cycling'; darts = 'darts'; snooker = 'snooker'; soccer = 'soccer'; tennis = 'tennis'
  37.  
  38. Sym_dict = { \
  39.    'name':    ['Bert', 'Bill', 'Fred', 'John', 'Sam'], \
  40.    'surname': ['Alberts', 'Fredericks', 'Johnson', 'Samson', 'Williams'], \
  41.    'job':     ['bricklayer', 'carpenter', 'plumber', 'printer', 'welder'], \
  42.    'dest':    ['Heathfield', 'Kalk_Bay', 'Lakeside', 'Retreat', 'Wynberg'], \
  43.    'sport':   ['cycling', 'darts', 'snooker', 'soccer', 'tennis'] }
  44.  
  45. All_symbols = []
  46. for prop in Sym_dict.keys():
  47.    All_symbols = All_symbols + Sym_dict[prop]
  48.  
  49.  
  50. def NotePosition(symbol, p):  # proc
  51.   global Q, StillToBePlaced
  52.   if symbol in StillToBePlaced:
  53.      StillToBePlaced.remove(symbol)
  54.      setattr(Q[p], attrib(symbol), symbol)
  55.      print symbol,  # debug
  56.   #else:
  57.   #   print symbol, p, 'already removed'  # debug
  58.  
  59.  
  60. def attrib(v):  # func -> Sym_dict.keys()
  61.   global Sym_dict
  62.   for prop in Sym_dict.keys():
  63.      if v in Sym_dict[prop]:
  64.           return prop
  65.   return None
  66.  
  67. def Has(prop, p):  # func boolean
  68.   global Q
  69.   return getattr(Q[p], prop)
  70.  
  71.  
  72. def FindVacancies(Ty1, Ty2, r):  # proc
  73.   PositionSet = []
  74.   for p in range(1, 1+MaxQ - r):
  75.      if not Has(Ty1,p):
  76.         if not Has(Ty2,p+r):
  77.            PositionSet.append(p)  #(p,p+r) ?
  78.            if r > 0 : PositionSet.append(p+r)
  79.   #loop
  80.   return PositionSet
  81.  
  82.  
  83. def TryElimination(v1, v2, r):  # proc
  84.   global PossiblePositions, attrib
  85.   PossiblePositions = FindVacancies(attrib(v1), attrib(v2), r)
  86.   card = len(PossiblePositions)
  87.   if (r == 0) and (card == 1) or (r > 0) and (card == 2):
  88.      for p in range(1, 1+MaxQ-r):
  89.         if p in PossiblePositions:
  90.            NotePosition(v1, p)
  91.            NotePosition(v2, p+r)
  92.            return
  93.  
  94.  
  95. def NoteBehind(v1, v2, r):  # proc
  96.   global Q, StillToBePlaced
  97.   if (v1 in StillToBePlaced) and (v2 in StillToBePlaced):
  98.      TryElimination(v1, v2, r)
  99.   else:
  100.      for p in range(1, 1+MaxQ - r):
  101.         if v1 == getattr(Q[p], attrib(v1)):
  102.              NotePosition(v2, p+r)
  103.              return
  104.         if v2 == getattr(Q[p+r], attrib(v2)):
  105.              NotePosition(v1, p)
  106.              return
  107.      #loop
  108.  
  109.  
  110. def NoteThat(v1, v2):  # proc
  111.   NoteBehind(v1, v2, 0)
  112.  
  113.  
  114. Q = [None]  # Dummy person in position 0
  115. for p in range(1, MaxQ+1):
  116.    Q.append(Person())
  117.  
  118. StillToBePlaced = All_symbols
  119. count = len(StillToBePlaced)
  120.  
  121. while 1:
  122.    NoteThat(Fred, welder)
  123.    NotePosition(printer, 2)
  124.    NoteThat(Fredericks, Retreat)
  125.    NoteThat(Samson, Kalk_Bay)
  126.    NoteBehind(Bert, plumber, 3)
  127.    NoteThat(John, soccer)
  128.    NotePosition(snooker, 3)
  129.    NotePosition(Lakeside, 1)
  130.    NoteThat(Retreat, tennis)
  131.    NotePosition(Bill, 4)
  132.    NoteThat(carpenter, cycling)
  133.    NoteBehind(darts, Johnson, 1)
  134.    NotePosition(Williams, 5)
  135.    NoteThat(plumber, Wynberg)
  136.    NoteBehind(Alberts, Samson, 1)
  137.    NoteBehind(printer, Johnson, 1)
  138.    NoteBehind(Sam, Kalk_Bay, 1)
  139.    NoteBehind(Heathfield, bricklayer, 1)
  140.  
  141.    if len(StillToBePlaced) == count: break  # No further progress!
  142.    count = len(StillToBePlaced)
  143.  
  144.    print '\n', len(StillToBePlaced), 'symbols left\n'  # debug
  145.    #for p in range(1, MaxQ+1): Q[p].show()
  146.  
  147.    if StillToBePlaced == []: break
  148. #loop
  149.  
  150. print
  151. for p in range(1, MaxQ+1):
  152.    print `p`, ':',
  153.    Q[p].show()
  154. #loop
  155.  
  156.  
  157.