From 8f4555992010ae23cdccb6f9eb3ead6b366f5794 Mon Sep 17 00:00:00 2001 From: Niels Serup Date: Thu, 9 Aug 2012 13:50:13 +0200 Subject: [PATCH] No colour boxes are white. --- robotgame/logic/colourboxes.py | 44 +++++++++++++++++++++++++++------- tests/colourboxes_tests.py | 3 +-- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/robotgame/logic/colourboxes.py b/robotgame/logic/colourboxes.py index 7f22418..bf8c3fb 100644 --- a/robotgame/logic/colourboxes.py +++ b/robotgame/logic/colourboxes.py @@ -27,11 +27,14 @@ Colour boxes. """ +from __future__ import print_function import random +import itertools def generate_colour_boxes(nwells, nboxes): """ - Generate colour boxes that can be used to make all wells white. + Generate colour boxes that can be used to make all wells white. None of the + generated colour boxes are white. Arguments: nwells -- number of wells @@ -44,18 +47,33 @@ def generate_colour_boxes(nwells, nboxes): nbits = nwells * 3 data = [[0 for _ in range(nboxes)] for _ in range(nbits)] - def insert_1(): + def insert_1(x): t = random.randrange(0, nboxes) + x0, x1 = _get_oxs(x) for y in range(t, nboxes) + range(0, t): - if data[x][y] == 0: + if data[x][y] == 0 and not (data[x0][y] == 1 and data[x1][y] == 1): data[x][y] = 1 break + else: + raise Exception("Cannot maintain no 111s invariant.") + + def insert_two_1(x): + t = random.randrange(0, nboxes) + x0, x1 = _get_oxs(x) + if len(list(filter(lambda y: data[x][y] == 0 and not (data[x0][y] == 1 and data[x1][y] == 1), + range(nboxes)))) < 2: + return + for _ in range(2): + for y in range(t, nboxes) + range(0, t): + if data[x][y] == 0 and not (data[x0][y] == 1 and data[x1][y] == 1): + data[x][y] = 1 + break for x in range(len(data)): - insert_1() + insert_1(x) + for x in range(len(data)): for _ in range(random.randrange(0, (nboxes + 1) / 2)): - insert_1() - insert_1() + insert_two_1(x) boxes = [] for y in range(nboxes): @@ -68,9 +86,19 @@ def generate_colour_boxes(nwells, nboxes): box.append((r, g, b)) return boxes +def _get_oxs(x): + return (x + 1, x + 2) if x % 3 == 0 \ + else (x - 1, x + 1) if x % 3 == 1 \ + else (x - 2, x - 1) + def generate_random_box(nwells): - r = lambda: random.choice((0, 1)) - return [(r(), r(), r()) for _ in range(nwells)] + """Generate a box with random colors except white (111).""" + def gen_wc(): + wc = [random.choice((0, 1)) for i in range(3)] + if all(b == 1 for b in wc): + wc[random.randrange(3)] = 0 + return wc + return [tuple(gen_wc()) for _ in range(nwells)] def get_colours(boxes): colours = [] diff --git a/tests/colourboxes_tests.py b/tests/colourboxes_tests.py index fa621c6..7c3608d 100644 --- a/tests/colourboxes_tests.py +++ b/tests/colourboxes_tests.py @@ -6,8 +6,7 @@ from robotgame.logic.colourboxes import * class ColourboxesTest(unittest.TestCase): def test_generation(self): - for args in ((1, 1), - (2, 2), + for args in ((1, 2), (3, 3), (4, 6)): boxes = generate_colour_boxes(*args)