diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_sample.doctest | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/tests/test_sample.doctest b/tests/test_sample.doctest index 7c5c1f9..5ab8910 100644 --- a/tests/test_sample.doctest +++ b/tests/test_sample.doctest @@ -2,6 +2,14 @@ test_sample.doctest - simple test for rush hour solution finder >>> from x import find_solutions + +>>> def get_moves(board): +... """Return a list or printable solutions (steps).""" +... return [ +... ','.join(move for move, board in solution) +... for solution in find_solutions(board)] + + >>> board = ''' ... ....AA ... ..BBCC @@ -10,5 +18,96 @@ test_sample.doctest - simple test for rush hour solution finder ... ...IEF ... ...IJJ ... '''.strip().split() +>>> solutions = get_moves(board) +>>> len(solutions[0].split(',')) +13 +>>> 'AL4,BL2,CL2,EU2,FU2,HR2,IU1,JL4,ID1,HL2,ED3,FD3,rR4' in solutions +True + + +With the current algorithm it is very hard to determine whether a (manually) +precomputed solution will be found because there are a lot of orders in which +steps can be taken and since we try to avoid finding moves that result in the +exact same board configuration we are bound to miss some. + +>>> board = ''' +... ..OOOP +... .....P +... rrAB.P +... Q.ABCC +... Q..... +... QRRR.. +... '''.strip().split() +>>> solutions = get_moves(board) +>>> len(solutions[0].split(',')) +6 + +For example, the first one is not found with the current implementation but +the second (which is basically the exact same solution) is: + +>>> 'OL2,BU2,CL1,PD3,AD1,rR4' in solutions +False +>>> 'OL2,AD1,BU2,CL1,PD3,rR4' in solutions +True + + +Another simple example. + +>>> board = ''' +... ..OABB +... ..OA.C +... ..OrrC +... ..PPPD +... .....D +... ...... +... '''.strip().split() +>>> solutions = get_moves(board) +>>> len(solutions[0].split(',')) +9 +>>> 'DD1,PR1,OD3,rL2,AD1,BL3,CU1,AU1,rR3' in solutions +False +>>> 'DD1,PR1,OD3,rL2,AD1,BL3,AU1,CU1,rR3' in solutions +True ->>> list(find_solutions(board)) + +This is the hardest example from the Rush Hour game. + +>>> board = ''' +... OOO..P +... .....P +... ..ArrP +... ..ABCC +... D.EBFF +... D.EQQQ +... '''.strip().split() +>>> solutions = get_moves(board) +>>> len(solutions[0].split(',')) +29 + + +The algorithm should also deal fine with larger or smaller boards, non-square +boards and longer cars. + +>>> board = ''' +... ....DAAAAA +... ..rrD..B.. +... .......B.. +... ....CCCCC. +... '''.strip().split() +>>> solutions = get_moves(board) +>>> len(solutions[0].split(',')) +7 + + +The algorithm will return nothing (empty iterator) for impossible boards. + +>>> board = ''' +... ....B. +... ..AAB. +... rr..B. +... ..ECCC +... ..E.D. +... FFF.D. +... '''.strip().split() +>>> len(get_moves(board)) +0 |