#!/usr/bin/env python # -*- coding: utf-8 -*- # This file is part of ROBOTGAME # # ROBOTGAME is free software: you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # ROBOTGAME is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # ROBOTGAME. If not, see . # # ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' # # colourboxes.py # -------------------- # date created : Wed Aug 8 2012 # copyright : (C) 2012 Niels G. W. Serup # maintained by : Niels G. W. Serup """ Colour boxes. """ import random def generate_colour_boxes(nwells, nboxes): """ Generate colour boxes that can be used to make all wells white. Arguments: nwells -- number of wells nboxes -- maximum number of boxes needed to make all wells white. Return [[(r, g, b)]] where r : 0|1, g : 0|1, b : 0|1 """ nbits = nwells * 3 data = [[0 for _ in range(nboxes)] for _ in range(nbits)] def insert_1(): t = random.randrange(0, nboxes) for y in range(t, nboxes) + range(0, t): if data[x][y] == 0: data[x][y] = 1 break for x in range(len(data)): insert_1() for _ in range(random.randrange(0, (nboxes + 1) / 2)): insert_1() insert_1() boxes = [] for y in range(nboxes): box = [] boxes.append(box) for x in range(0, nbits, 3): r = data[x][y] g = data[x + 1][y] b = data[x + 2][y] box.append((r, g, b)) return boxes def generate_random_box(nwells): r = lambda: random.choice((0, 1)) return [(r(), r(), r()) for _ in range(nwells)] def get_colours(boxes): colours = [] for i in range(len(boxes[0])): r, g, b = boxes[0][i] for j in range(1, len(boxes)): r1, g1, b1 = boxes[j][i] r ^= r1 g ^= g1 b ^= b1 colours.append((r, g, b)) return colours def makes_all_wells_white(boxes): """ Determine if the boxes make all wells white when XOR'ed together. """ return all(c == 1 for c in itertools.chain(*get_colours(boxes)))