From: Simon Tatham Date: Mon, 17 Mar 2014 18:30:23 +0000 (+0000) Subject: Read the full dissections and double-check them. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=810c83b263fae9142eb50ce5ef45db5ce876c189;p=matchsticks-search.git Read the full dissections and double-check them. tabulate.py is reading from several data sources (and perhaps in the future also manually input dissections), so it's as well to be sure everything it gets conforms to its own standards of sense. --- diff --git a/tabulate.py b/tabulate.py index b986384..d06e186 100755 --- a/tabulate.py +++ b/tabulate.py @@ -6,6 +6,40 @@ from fractions import Fraction import bounds header_re = re.compile(r'^(\d+) into (\d+).*:.* ([\d/]+)') +dissect_re = re.compile(r'\s+(\d+)\s+x\s+\((([\d/]+ \+ )*[\d/]+)\)') + +dissections = {} + +def find_min_frag(dissection): + ret = None + for side in dissection: + for count, pieces in side: + for piece in pieces: + if piece > 0: + if ret is None or ret > piece: + ret = piece + assert ret is not None + return ret + +def verify(n, m, dissection): + collections = [{}, {}] + total = 0 + for count, pieces in dissection[0]: + assert sum(pieces) == n + total += count + for piece in pieces: + collections[0].setdefault(piece, 0) + collections[0][piece] += count + assert total == m + total = 0 + for count, pieces in dissection[1]: + assert sum(pieces) == m + total += count + for piece in pieces: + collections[1].setdefault(piece, 0) + collections[1][piece] += count + assert total == n + assert collections[0] == collections[1] def read(n,m): best = 0 @@ -22,6 +56,25 @@ def read(n,m): assert int(match.group(1)) == n assert int(match.group(2)) == m this_best = Fraction(match.group(3)) + + # Now read the actual dissection. + dissection = [[],[]] + for line in f.readlines(): + match = dissect_re.match(line) + if match is not None: + count = int(match.group(1)) + pieces = map(Fraction, match.group(2).split(" + ")) + length = sum(pieces) + if length == n: + dissection[0].append((count, pieces)) + elif length == m: + dissection[1].append((count, pieces)) + else: + assert False, "wrong length" + verify(n, m, dissection) + assert find_min_frag(dissection) == this_best + dissections[(n,m)] = dissection + if this_best > best: best = this_best best_nature = nature