+class StandingsTable:
+ def __init__(self, use_puzzles=puzzles):
+ self._puzzles = use_puzzles
+ self.s = ''
+
+ def _pline(self, pirate, puzstrs):
+ self.s += '%-*s' % (max_pirate_namelen, pirate)
+ for v in puzstrs:
+ self.s += ' %-*.*s' % (5,5, v)
+ self.s += '\n'
+
+ def _puzstr(self, pi, puzzle):
+ if not isinstance(puzzle,list): puzzle = [puzzle]
+ try: standing = max([pi.standings[p] for p in puzzle])
+ except KeyError: return '?'
+ c1 = standingvals[standing][0]
+ if standing < 3: c1 = c1.lower() # 3 = Master
+ hashes = '*' * (standing / 2)
+ equals = '+' * (standing % 2)
+ return c1 + hashes + equals
+
+ def headings(self):
+ def puzn_redact(name):
+ if isinstance(name,list):
+ return '/'.join(
+ ["%.2s" % puzn_redact(n)
+ for n in name])
+ spc = name.find(' ')
+ if spc < 0: return name
+ return name[0:min(4,spc)] + name[spc+1:]
+ self._pline('', map(puzn_redact, self._puzzles))
+ def literalline(self, line):
+ self.s += line + '\n'
+ def pirate(self, pirate):
+ pi = PirateInfo(pirate, 600)
+ puzstrs = [self._puzstr(pi,puz) for puz in self._puzzles]
+ self._pline(pirate, puzstrs)
+
+ def results(self):
+ return self.s
+