示例#1
0
def find_solution_for_size(size, dicts):
    """
        Finds a solution for a given size
        :param size: a tuple of required size
        :param dicts: dictionary of lists of all available words, per word_length
        :returns: a solution (Rectangle object) or None
    """

    rectangle_width = size[0]
    rectangle_height = size[1]

    words = dicts[rectangle_width]
    trie = get_trie(rectangle_width, dicts)

    r = Rectangle(rectangle_width, words)

    try:
        while True:
            r.get_next()

            #if the rectangle is valid so far, exit or go lower
            if all(trie.has_keys_with_prefix(col) for col in r.get_cols()):

                if rectangle_height == r.curr_height:
                    logging.info('Found a solution: %s - %s', size, r)
                    return r
                else:
                    r.lower()

    except StopIteration:
        return None

    raise Exception('This should not happend')
示例#2
0
	def test_one(self):

		r = Rectangle(1, ['a'])
		r.get_next()

		final = r.get_final_string()

		self.assertEquals(
			final,
			"1x1\na"
		)
示例#3
0
	def test_two(self):
		"""
			Just to make sure that if I actually find something,
			it will be printed out
		"""

		r = Rectangle(4, ['abcd', 'bafg'])
		r.get_next()
		r.lower()
		r.get_next()
		r.get_next()

		final = r.get_final_string()

		self.assertEquals(
			final,
			"4x2\na b c d\nb a f g"
		)
示例#4
0
	def test_one_level(self):

		r = Rectangle(1, ['1', '2', '3'])

		self.assertEquals(
			r.get_next(),
			'1',
		)

		self.assertEquals(
			r.get_next(),
			'2',
		)

		self.assertEquals(
			r.get_next(),
			'3',
		)

		with self.assertRaises(StopIteration):
			r.get_next()
示例#5
0
	def test_more_levels(self):

		r = Rectangle(1, ['1', '2', '3'])

		self.assertEquals(
			r.get_next(),
			'1',
		)

		r.lower()
		self.assertEquals(
			r.get_next(),
			'1',
		)

		r.lower()
		self.assertEquals(
			r.get_next(),
			'1',
		)

		for item in ['2', '3', '2', '3', '2', '3']:
			self.assertEquals(
				r.get_next(),
				item,
			)

		with self.assertRaises(StopIteration):
			r.get_next()
示例#6
0
	def test_columns_one_level(self):
		
		r = Rectangle(3, ['123'])
		
		self.assertEquals(
			r.get_next(),
			'123',
		)

		self.assertEquals(
			list(r.get_cols()),
			[u'1', u'2', '3'],
		)
示例#7
0
	def test_columns_more_levels(self):

		r = Rectangle(3, ['123', '456', '789'])

		r.get_next()
		r.lower()
		r.get_next()
		r.lower()
		r.get_next()

		self.assertEquals(
			list(r.get_cols()),
			[u'111', u'222', u'333'],
		)

		r.get_next()

		self.assertEquals(
			list(r.get_cols()),
			[u'114', u'225', u'336'],
		)
示例#8
0
	def test_empty(self):

		r = Rectangle(1, [])

		with self.assertRaises(StopIteration):
			r.get_next()