示例#1
0
    def test_text_0_init(self):
        """Test vault object creation with text"""

        # 1. Create default donut object
        mydonut = donut.Donut(text=from_text(EXAMPLES[0]))

        # 2. Make sure it has the expected values
        self.assertEqual(len(mydonut.text), 19)
        self.assertEqual(mydonut.rows, 19)
        self.assertEqual(mydonut.cols, 19)
        self.assertEqual(
            mydonut.portals, {
                'AA': {(9, 2)},
                'BC': {(2, 8), (9, 6)},
                'DE': {(2, 13), (6, 10)},
                'FG': {(2, 15), (11, 12)},
                'ZZ': {(13, 16)}
            })
        self.assertEqual(mydonut.finish, donut.FINISH)
        self.assertEqual(
            mydonut.portals_at, {
                (2, 8): 'BC',
                (2, 13): 'DE',
                (2, 15): 'FG',
                (6, 10): 'DE',
                (9, 2): 'AA',
                (9, 6): 'BC',
                (11, 12): 'FG',
                (13, 16): 'ZZ'
            })
        self.assertEqual(mydonut.part2, False)
        self.assertEqual(len(mydonut.locs), 47)

        # 3. Check methods (not used by init)
        self.assertEqual(mydonut.exit_dirs(9, 2), ['S'])
        self.assertEqual(mydonut.exit_dirs(9, 3), ['N', 'S', 'E'])
        self.assertEqual(mydonut.exit_dirs(9, 4), ['N', 'S'])
        self.assertEqual(mydonut.exit_dirs(9, 5), ['N', 'S'])
        self.assertEqual(mydonut.exit_dirs(9, 6), ['N', 'S'])
        self.assertEqual(mydonut.non_portals(9, 2), ['S'])
        self.assertEqual(mydonut.non_portals(9, 3), ['S', 'E'])
        self.assertEqual(mydonut.non_portals(9, 4), ['N', 'S'])
        self.assertEqual(mydonut.non_portals(9, 5), ['N'])
        self.assertEqual(mydonut.non_portals(9, 6), ['N', 'S'])
        self.assertEqual(mydonut.exit_locs(9, 2), [(9, 3)])
        self.assertEqual(mydonut.exit_locs(9, 3), [(9, 2), (9, 4), (10, 3)])
        self.assertEqual(mydonut.exit_locs(9, 4), [(9, 3), (9, 5)])
        self.assertEqual(mydonut.exit_locs(9, 5), [(9, 4), (9, 6)])
        self.assertEqual(mydonut.exit_locs(9, 6), [(9, 5)])

        self.assertEqual(mydonut.inner_portal((2, 8)), False)
        self.assertEqual(mydonut.inner_portal((2, 13)), False)
        self.assertEqual(mydonut.inner_portal((2, 15)), False)
        self.assertEqual(mydonut.inner_portal((6, 10)), True)
        self.assertEqual(mydonut.inner_portal((9, 2)), False)
        self.assertEqual(mydonut.inner_portal((9, 6)), True)
        self.assertEqual(mydonut.inner_portal((11, 12)), True)
        self.assertEqual(mydonut.inner_portal((13, 16)), False)
示例#2
0
    def test_methods(self):
        "Test exploration between portal locations and other methods"

        # 1. Create an solver without a donut and then slap on a donut
        mysolver = solver.Solver()
        mysolver.donut = donut.Donut(text=from_text(test_donut.EXAMPLES[0]))

        # 2. Explore from all portal ends
        self.assertEqual(mysolver.explore_from((2, 8)), {(6, 10): 6})   # BC -> DE
        self.assertEqual(mysolver.explore_from((2, 13)), {(2, 15): 4})  # DE -> FG
        self.assertEqual(mysolver.explore_from((2, 15)), {(2, 13): 4})  # FG -> DE
        self.assertEqual(mysolver.explore_from((6, 10)), {(2, 8): 6})   # DE -> BC
        self.assertEqual(mysolver.explore_from((9, 2)), {(9, 6): 4,     # AA -> BC
                                                         (11, 12): 30,   # AA -> FG
                                                         (13, 16): 26})  # AA -> ZZ
        self.assertEqual(mysolver.explore_from((11, 12)), {(13, 16): 6,  # FG -> ZZ
                                                           (9, 2): 30,   # FG -> AA
                                                           (9, 6): 32})  # FG -> BC
        self.assertEqual(mysolver.explore_from((13, 16)), {(11, 12): 6,  # ZZ -> FG
                                                           (9, 2): 26,   # ZZ -> AA
                                                           (9, 6): 28})  # ZZ -> BC

        # 3. Compute and check direct portal paths
        mysolver.portal_paths = mysolver.get_direct_paths_between_portals()
        self.assertEqual(len(mysolver.portal_paths), 5)
        self.assertEqual(sorted(mysolver.portal_paths.keys()), ['AA', 'BC', 'DE', 'FG', 'ZZ'])
        self.assertEqual(len(mysolver.portal_paths['AA']), 3)
        self.assertEqual(sorted([path.steps for path in mysolver.portal_paths['AA']]), [4, 26, 30])
        self.assertEqual(sorted([path.steps for path in mysolver.portal_paths['BC']]), [1, 1, 4, 6, 28, 32])
        self.assertEqual(sorted([path.steps for path in mysolver.portal_paths['DE']]), [1, 1, 4, 6])
        self.assertEqual(sorted([path.steps for path in mysolver.portal_paths['FG']]), [1, 1, 4, 6, 30, 32])
        self.assertEqual(sorted([path.steps for path in mysolver.portal_paths['ZZ']]), [6, 26, 28])

        # 4. Compute and check graph
        mysolver.graph = mysolver.portal_paths_to_graph()
        self.assertEqual(len(mysolver.graph.edges), 22)

        # 5. Test solving the graph
        mysolver.solve_donut_maze()
        self.assertEqual(len(mysolver.path), 8)
        self.assertEqual(mysolver.cost, 23)

        # 6. Test part2 graph generation
        mysolver.part2 = True
        mysolver.graph = mysolver.portal_paths_to_graph(depth=1)
        self.assertCountEqual(Counter([(_.start[0], _.end[0]) for _ in mysolver.graph.edges]),
                              {(0, 0): 22})

        mysolver.graph = mysolver.portal_paths_to_graph(depth=2)
        self.assertCountEqual(Counter([(_.start[0], _.end[0]) for _ in mysolver.graph.edges]),
                              {(0, 0): 12, (1, 1): 6, (0, 1): 3, (1, 0): 3})

        mysolver.graph = mysolver.portal_paths_to_graph(depth=3)
        self.assertCountEqual(Counter([(_.start[0], _.end[0]) for _ in mysolver.graph.edges]),
                              {(0, 0): 12, (1, 1): 6, (2, 2): 6, (0, 1): 3, (1, 2): 3, (1, 0): 3, (2, 1): 3})
示例#3
0
    def test_p1e1_solve(self):
        "Test Solver object creation with text of part 1 example 1"

        # 1. Test Solver object creation with text of part 1 example 1
        mysolver = solver.Solver(text=from_text(test_donut.EXAMPLES[1]))

        # 2. Make sure it has the specified values
        self.assertEqual(mysolver.donut.rows, 37)
        self.assertEqual(mysolver.donut.cols, 35)
        self.assertEqual(len(mysolver.portal_paths), 12)
        self.assertEqual(len(mysolver.graph.edges), 56)

        # 3. Solve the donut maze
        mysolver.solve_donut_maze()
        self.assertEqual(len(mysolver.path), 10)
        self.assertEqual(mysolver.cost, 58)
示例#4
0
    def test_p1e0_solve(self):
        "Test Solver object creation with text of part 1 example 0"

        # 1. Create Donut Maze solver object from part one example 0
        mysolver = solver.Solver(text=from_text(test_donut.EXAMPLES[0]))

        # 2. Make sure it has the specified values
        self.assertEqual(mysolver.donut.rows, 19)
        self.assertEqual(mysolver.donut.cols, 19)
        self.assertEqual(len(mysolver.portal_paths), 5)
        self.assertEqual(len(mysolver.graph.edges), 22)

        # 3. Solve the donut maze
        mysolver.solve_donut_maze()
        self.assertEqual(len(mysolver.path), 8)
        self.assertEqual(mysolver.cost, 23)
示例#5
0
    def test_p2e2_solve(self):
        "Test Solver object creation with text of part 2 example 2"

        # 1. Test Solver object creation with text of part 2 example 2
        mysolver = solver.Solver(text=from_text(test_donut.EXAMPLES[2]),
                                 depth=15,
                                 part2=True)

        # 2. Make sure it has the specified values
        self.assertEqual(mysolver.donut.rows, 37)
        self.assertEqual(mysolver.donut.cols, 45)
        self.assertEqual(len(mysolver.portal_paths), 15)
        self.assertEqual(len(mysolver.graph.edges), 846)

        # 3. Solve the donut maze
        mysolver.solve_donut_maze()
        self.assertEqual(len(mysolver.path), 66)
        self.assertEqual(mysolver.cost, 396)
示例#6
0
    def test_text_2_init(self):
        """Test vault object creation with text"""

        # 1. Create default donut object
        mydonut = donut.Donut(text=from_text(EXAMPLES[2]), part2=True)

        # 2. Make sure it has the expected values
        self.assertEqual(len(mydonut.text), 37)
        self.assertEqual(mydonut.rows, 37)
        self.assertEqual(mydonut.cols, 45)
        self.assertEqual(
            mydonut.portals, {
                'OA': {(17, 34), (8, 13)},
                'WB': {(36, 13), (19, 2)},
                'ZH': {(42, 13), (31, 8)},
                'CJ': {(2, 15), (8, 23)},
                'CK': {(8, 17), (27, 2)},
                'IC': {(23, 8), (42, 17)},
                'XF': {(2, 21), (17, 28)},
                'RF': {(36, 21), (42, 25)},
                'NM': {(36, 23), (23, 34)},
                'RE': {(21, 8), (2, 25)},
                'ZZ': {(13, 2)},
                'FD': {(19, 34), (13, 8)},
                'LP': {(29, 28), (15, 2)},
                'AA': {(15, 34)},
                'XQ': {(17, 2), (21, 28)}
            })
        self.assertEqual(mydonut.start, donut.START)
        self.assertEqual(mydonut.finish, donut.FINISH)
        self.assertEqual(
            mydonut.portals_at, {
                (8, 13): 'OA',
                (36, 13): 'WB',
                (42, 13): 'ZH',
                (2, 15): 'CJ',
                (8, 17): 'CK',
                (42, 17): 'IC',
                (2, 21): 'XF',
                (36, 21): 'RF',
                (8, 23): 'CJ',
                (36, 23): 'NM',
                (2, 25): 'RE',
                (42, 25): 'RF',
                (13, 2): 'ZZ',
                (13, 8): 'FD',
                (15, 2): 'LP',
                (15, 34): 'AA',
                (17, 2): 'XQ',
                (17, 28): 'XF',
                (17, 34): 'OA',
                (19, 2): 'WB',
                (19, 34): 'FD',
                (21, 8): 'RE',
                (21, 28): 'XQ',
                (23, 8): 'IC',
                (23, 34): 'NM',
                (27, 2): 'CK',
                (29, 28): 'LP',
                (31, 8): 'ZH'
            })
        self.assertEqual(mydonut.part2, True)
        self.assertEqual(len(mydonut.locs), 376)
        self.assertEqual(mydonut.outer_portal((8, 13)), False)
        self.assertEqual(mydonut.outer_portal((36, 13)), False)
        self.assertEqual(mydonut.outer_portal((42, 13)), True)
        self.assertEqual(mydonut.outer_portal((2, 15)), True)
        self.assertEqual(mydonut.outer_portal((8, 17)), False)
        self.assertEqual(mydonut.outer_portal((42, 17)), True)
        self.assertEqual(mydonut.outer_portal((2, 21)), True)
        self.assertEqual(mydonut.outer_portal((36, 21)), False)
        self.assertEqual(mydonut.outer_portal((8, 23)), False)
        self.assertEqual(mydonut.outer_portal((36, 23)), False)
        self.assertEqual(mydonut.outer_portal((2, 25)), True)
        self.assertEqual(mydonut.outer_portal((42, 25)), True)

        self.assertEqual(mydonut.inner_portal((13, 2)), False)
        self.assertEqual(mydonut.inner_portal((13, 8)), True)
        self.assertEqual(mydonut.inner_portal((15, 2)), False)
        self.assertEqual(mydonut.inner_portal((15, 24)), True)
        self.assertEqual(mydonut.inner_portal((17, 2)), False)
        self.assertEqual(mydonut.inner_portal((17, 28)), True)
        self.assertEqual(mydonut.inner_portal((17, 34)), False)
        self.assertEqual(mydonut.inner_portal((19, 2)), False)
        self.assertEqual(mydonut.inner_portal((19, 34)), False)
        self.assertEqual(mydonut.inner_portal((21, 8)), True)
        self.assertEqual(mydonut.inner_portal((23, 8)), True)
        self.assertEqual(mydonut.inner_portal((23, 34)), False)
        self.assertEqual(mydonut.inner_portal((27, 2)), False)
        self.assertEqual(mydonut.inner_portal((29, 28)), True)
        self.assertEqual(mydonut.inner_portal((31, 8)), True)
示例#7
0
    def test_text_1_init(self):
        """Test vault object creation with text"""

        # 1. Create default donut object
        mydonut = donut.Donut(text=from_text(EXAMPLES[1]))

        # 2. Make sure it has the expected values
        self.assertEqual(len(mydonut.text), 37)
        self.assertEqual(mydonut.rows, 37)
        self.assertEqual(mydonut.cols, 35)
        self.assertEqual(
            mydonut.portals, {
                'AA': {(19, 2)},
                'AS': {(32, 17), (17, 8)},
                'BU': {(26, 21), (11, 34)},
                'CP': {(19, 34), (21, 8)},
                'DI': {(2, 15), (8, 21)},
                'JO': {(13, 28), (2, 19)},
                'JP': {(21, 28), (15, 34)},
                'LF': {(15, 28), (32, 21)},
                'QG': {(32, 23), (26, 17)},
                'VT': {(26, 23), (32, 11)},
                'YN': {(2, 23), (26, 13)},
                'ZZ': {(2, 17)}
            })
        self.assertEqual(mydonut.start, donut.START)
        self.assertEqual(mydonut.finish, donut.FINISH)
        self.assertEqual(
            mydonut.portals_at, {
                (2, 15): 'DI',
                (2, 17): 'ZZ',
                (2, 19): 'JO',
                (2, 23): 'YN',
                (8, 21): 'DI',
                (11, 34): 'BU',
                (13, 28): 'JO',
                (15, 28): 'LF',
                (15, 34): 'JP',
                (17, 8): 'AS',
                (19, 2): 'AA',
                (19, 34): 'CP',
                (21, 8): 'CP',
                (21, 28): 'JP',
                (26, 13): 'YN',
                (26, 17): 'QG',
                (26, 21): 'BU',
                (26, 23): 'VT',
                (32, 11): 'VT',
                (32, 17): 'AS',
                (32, 21): 'LF',
                (32, 23): 'QG'
            })
        self.assertEqual(mydonut.part2, False)
        self.assertEqual(len(mydonut.locs), 313)

        self.assertEqual(mydonut.outer_portal((2, 15)), True)
        self.assertEqual(mydonut.outer_portal((2, 17)), True)
        self.assertEqual(mydonut.outer_portal((2, 19)), True)
        self.assertEqual(mydonut.outer_portal((2, 23)), True)
        self.assertEqual(mydonut.outer_portal((8, 21)), False)
        self.assertEqual(mydonut.outer_portal((11, 34)), True)
        self.assertEqual(mydonut.outer_portal((13, 28)), False)
        self.assertEqual(mydonut.outer_portal((15, 28)), False)
        self.assertEqual(mydonut.outer_portal((15, 34)), True)
        self.assertEqual(mydonut.outer_portal((17, 8)), False)
        self.assertEqual(mydonut.outer_portal((19, 2)), True)
        self.assertEqual(mydonut.outer_portal((19, 34)), True)
        self.assertEqual(mydonut.outer_portal((21, 8)), False)
        self.assertEqual(mydonut.outer_portal((21, 28)), False)
        self.assertEqual(mydonut.outer_portal((26, 13)), False)
        self.assertEqual(mydonut.outer_portal((26, 17)), False)
        self.assertEqual(mydonut.outer_portal((26, 21)), False)
        self.assertEqual(mydonut.outer_portal((26, 23)), False)
        self.assertEqual(mydonut.outer_portal((32, 11)), True)
        self.assertEqual(mydonut.outer_portal((32, 17)), True)
        self.assertEqual(mydonut.outer_portal((32, 21)), True)
        self.assertEqual(mydonut.outer_portal((32, 23)), True)