NMDanny

Untitled

Dec 11th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.52 KB | None | 0 0
  1. from ex8 import *
  2. import io
  3. import contextlib
  4. import itertools
  5. import copy
  6.  
  7.  
  8. def capture_print(fun):
  9.     f = io.StringIO()
  10.     with contextlib.redirect_stdout(f):
  11.         fun()
  12.     retval = f.getvalue().strip().split("\n")
  13.     # because splitting an empty string(e.g, nothing was printed) gives
  14.     # an empty string in the list for some reason
  15.     if retval == [""]:
  16.         return []
  17.     return retval
  18.  
  19.  
  20. def test_3b3_sudoku():
  21.     board = [
  22.         [2, 1, 4, 3],
  23.         [4, 3, 0, 1],
  24.         [3, 4, 1, 2],
  25.         [0, 0, 0, 4]
  26.     ]
  27.     assert solve_sudoku(board)
  28.     assert board == [
  29.         [2, 1, 4, 3],
  30.         [4, 3, 2, 1],
  31.         [3, 4, 1, 2],
  32.         [1, 2, 3, 4]
  33.     ]
  34.  
  35.  
  36. def test_4b4_sudoku():
  37.     board = [
  38.         [2,4,3,1],
  39.         [1,0,2,4],
  40.         [4,0,1,0],
  41.         [3,1,0,0]
  42.     ]
  43.     assert solve_sudoku(board)
  44.     assert board == [
  45.         [2, 4, 3, 1],
  46.         [1,3,2,4],
  47.         [4,2,1,3],
  48.         [3,1,4,2]
  49.     ]
  50.  
  51.  
  52. def test_6b6_sudoku():
  53.     board = [
  54.         [2, 1, 5, 3, 4, 6],
  55.         [3, 0, 0, 2, 0, 0],
  56.         [5, 0, 0, 0, 0, 4],
  57.         [0, 2, 4, 5, 0, 0],
  58.         [4, 0, 0, 0, 0, 5],
  59.         [1, 5, 3, 4, 6, 2]
  60.     ]
  61.     assert solve_sudoku(board)
  62.  
  63.  
  64. def assert_subset_works(n, k, expected):
  65.     via_print = capture_print(lambda: print_k_subsets(n, k))
  66.     assert len(via_print) == len(expected)
  67.     assert set(str(ex) for ex in expected) == set(via_print)
  68.  
  69.  
  70.     via_fill = []
  71.     fill_k_subsets(n, k, via_fill)
  72.     assert sorted(expected) == sorted(via_fill)
  73.  
  74.     via_return = return_k_subsets(n, k)
  75.     assert sorted(expected) == sorted(via_return)
  76.  
  77.  
  78. def test_n3k2_subsets():
  79.     assert_subset_works(3, 2, [[0, 1],[0, 2],[1, 2]])
  80.  
  81.  
  82. def test_subsets_general():
  83.     for n in range(16):
  84.         for k in range(1, n+1):
  85.             correct_subsets = [list(t) for t in itertools.combinations(range(n), k)]
  86.             assert_subset_works(n, k, correct_subsets)
  87.  
  88.  
  89. def test_edgecase_subsets():
  90.     for n in range(16):
  91.         # the empty set is a subset of length 0 for every set
  92.         assert_subset_works(n, 0, [[]])
  93.  
  94.  
  95. def test_unsolveable_sudoku():
  96.     unsolveable = [
  97.         [1, 4, 2, 0, 3, 0, 0, 0, 0],
  98.         [0, 7, 0, 4, 6, 0, 0, 5, 0],
  99.         [0, 3, 0, 7, 8, 1, 0, 9, 0],
  100.         [4, 0, 0, 0, 0, 7, 2, 6, 5],
  101.         [0, 6, 7, 0, 0, 0, 0, 8, 0],
  102.         [2, 9, 8, 6, 0, 3, 0, 0, 4],
  103.         [0, 8, 0, 5, 0, 4, 9, 0, 0],
  104.         [0, 2, 6, 3, 0, 0, 0, 0, 0],
  105.         [7, 0, 4, 9, 2, 6, 0, 3, 1],
  106.     ]
  107.     unsolveable_dup = copy.deepcopy(unsolveable)
  108.     assert not solve_sudoku(unsolveable_dup)
  109.     assert unsolveable_dup == unsolveable
  110.  
  111. # everything above finished almost instantly for me
  112. # this took about 5~ minutes to run on an i5-7300hq
  113. def test_another_hard_sudoku():
  114.     board = [[0,0,0,7,0,0,0,0,0],
  115.              [1,0,0,0,0,0,0,0,0],
  116.              [0,0,0,4,3,0,2,0,0],
  117.              [0,0,0,0,0,0,0,0,6],
  118.              [0,0,0,5,0,9,0,0,0],
  119.              [0,0,0,0,0,0,4,1,8],
  120.              [0,0,0,0,8,1,0,0,0],
  121.              [0,0,2,0,0,0,0,5,0],
  122.              [0,4,0,0,0,0,3,0,0]]
  123.     assert solve_sudoku(board)
  124.  
  125.  
  126. # this test took about 16~ minutes to run on an i5-7300hq
  127. def test_difficult_bruteforce_sudoku_9b9():
  128.     board = [
  129.         [0,0,0,0,0,0,0,0,0],
  130.         [0,0,0,0,0,3,0,8,5],
  131.         [0,0,1,0,2,0,0,0,0],
  132.         [0,0,0,5,0,7,0,0,0],
  133.         [0,0,4,0,0,0,1,0,0],
  134.         [0,9,0,0,0,0,0,0,0],
  135.         [5,0,0,0,0,0,0,7,3],
  136.         [0,0,2,0,1,0,0,0,0],
  137.         [0,0,0,0,4,0,0,0,9]
  138.     ]
  139.     assert solve_sudoku(board)
Advertisement
Add Comment
Please, Sign In to add comment