#! /usr/bin/python import sre as R import os as OS from popen2 import Popen3 from sys import argv import catacomb as C r_score = R.compile(r'^Solved in ([\d]+) guesses$') r_time = R.compile(r'^time:([\d.]+),([\d.]+)$') def run(prog): proc = Popen3(['time', '-f', 'time:%U,%S'] + prog, capturestderr = True) guesses = -1 time = -1 proc.tochild.close() for l in proc.fromchild: m = r_score.match(l) if m: guesses = int(m.group(1)) for l in proc.childerr: m = r_time.match(l) if m: u, s = map(float, m.groups([1, 2])) time = u + s return guesses, time impl = argv[1:] def compare(h, c, scores): code = [C.rand.range(c) for i in xrange(h)] perf = {} best, bestperf = [None, None], [-1, -1] for i in impl: p = perf[i] = run(i + map(str, [h, c] + code)) for j in [0, 1]: if bestperf[j] == -1 or p[j] < bestperf[j]: bestperf[j] = p[j] best[j] = i scores[i][j] += p[j] st = '' for i in [0, 1]: st += '%s:' % ['G', 'T'][i] for j in impl: if best[i] == j: st += '+' else: st += '.' st += ' ' print '%s%s' % (st, code) ind = (len(impl) + 3) * len(best) for i in impl: ##print '%s%s: %s' % (' ' * ind, i, ' '.join(map(str, perf[i]))) pass ##print for n, h, c in [(100, 4, 6), (50, 4, 10), (20, 5, 6), (20, 5, 8), (20, 5, 10)]: print '************************** %d %d' % (h, c) scores = {} for i in impl: scores[i] = [0, 0] for i in xrange(n): compare(h, c, scores) print 'Summary, %d %d' % (h, c) for i in impl: print ' %s: %s' % (i, ' '.join(['%s:%s' % (['G', 'T'][j], scores[i][j]) for j in [0, 1]])) print