diff --git a/096.py b/096.py new file mode 100644 index 0000000..b362288 --- /dev/null +++ b/096.py @@ -0,0 +1,354 @@ +# !/usr/bin/python3 +# -*- coding: utf-8 -*- + +print('---------------------- 96 --') +import random +from copy import deepcopy + + +def load_file(): + data = [] + tmp = [] + n = 0 + with open("p096_sudoku.txt") as f: + for line in f: + # print(n, line[:-1]) + if n == 0: + n += 1 + else: + tmp.append([int(i) for i in line[:-1]]) + n += 1 + if n == 10: + data.append(tmp) + tmp = [] + n = 0 + # print(data) + # print(len(data)) + # for i in data: + # print(len(i)) + # + return data + + +def ves_riad(arr, col): + tmp = [] + for i in arr: + tmp.append(i[col]) + # print(tmp) + return tmp + + +def nice_print(arr): + for st_n, st in enumerate(arr): + for rd_n, rd in enumerate(st): + print(rd, ' ', end='') + if rd_n == 2 or rd_n == 5: + print(' ', end='') + print() + if st_n == 2 or st_n == 5: + print() + print('-------------------') + + +def sud_win(arr): + for st_n, st in enumerate(arr): + for rd_n, rd in enumerate(st): + if rd != 0 and st.count(rd) == 1 and ves_riad(arr, rd_n).count(rd) == 1: + pass + else: + return False + return True + + +# win = [[4, 8, 3, 9, 2, 1, 6, 5, 7], [9, 6, 7, 3, 4, 5, 8, 2, 1], [2, 5, 1, 8, 7, 6, 4, 9, 3], [5, 4, 8, 1, 3, 2, 9, 7, 6], [7, 2, 9, 5, 6, 4, 1, 3, 8], [1, 3, 6, 7, 9, 8, 2, 4, 5], [3, 7, 2, 6, 8, 9, 5, 1, 4], [8, 1, 4, 2, 5, 3, 7, 6, 9], [6, 9, 5, 4, 1, 7, 3, 8, 2]] +# nice_print(win) +# print(sud_win(win)) + + +# tst = ['003020600', '900305001', '001806400', '008102900', '700000008', '006708200', '002609500', '800203009', '005010300'] + +tst0 = [[0, 0, 3, 0, 2, 0, 6, 0, 0], [9, 0, 0, 3, 0, 5, 0, 0, 1], [0, 0, 1, 8, 0, 6, 4, 0, 0], + [0, 0, 8, 1, 0, 2, 9, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0, 8], [0, 0, 6, 7, 0, 8, 2, 0, 0], + [0, 0, 2, 6, 0, 9, 5, 0, 0], [8, 0, 0, 2, 0, 3, 0, 0, 9], [0, 0, 5, 0, 1, 0, 3, 0, 0]] + + +# nice_print(tst0) +# print() +# ves_riad(tst, 8) + +# 0 0 3 0 2 0 6 0 0 +# 9 0 0 3 0 5 0 0 1 +# 0 0 1 8 0 6 4 0 0 +# +# 0 0 8 1 0 2 9 0 0 +# 7 0 0 0 0 0 0 0 8 +# 0 0 6 7 0 8 2 0 0 +# +# 0 0 2 6 0 9 5 0 0 +# 8 0 0 2 0 3 0 0 9 +# 0 0 5 0 1 0 3 0 0 + + +def minikvadrat(arr, st_n, rd_n): + # print(st_n, rd_n) + + tmp = [] + + if st_n < 3: st = [0, 1, 2] + if 2 < st_n < 6: st = [3, 4, 5] + if 5 < st_n: st = [6, 7, 8] + + if rd_n < 3: rd = [0, 1, 2] + if 2 < rd_n < 6: rd = [3, 4, 5] + if 5 < rd_n: rd = [6, 7, 8] + # print(st, rd) + + for i in st: + for j in rd: + # print(arr[i][j]) + tmp.append(arr[i][j]) + return tmp + + +def rend_arr(): + a = [0, 0, 0, 0, 0, 0, 0, 0, 0] + for i in range(len(a)): + tmp = random.randint(1, 9) + while tmp in a: + tmp = random.randint(1, 9) + a[i] = tmp + # a = [random.randint(1, 10)] + # print(a) + return a + + +def fnd_obvious_singles(arr): + n = 0 + for st_n, st in enumerate(arr): + for rd_n, rd in enumerate(st): + if rd == 0: + tmp = [1, 2, 3, 4, 5, 6, 7, 8, 9] + for i in range(1, 10): + if (i in st) or (i in ves_riad(arr, rd_n)) or (i in minikvadrat(arr, st_n, rd_n)): + # print(rd, '>', st_n, rd_n, '>>', i, tmp) + del tmp[tmp.index(i)] + # print() + # print(' ', tmp) + if len(tmp) == 1: + arr[st_n][rd_n] = tmp[0] + n += 1 + # else: + # arr[st_n][rd_n] = tmp + # else: + # print(rd, '>') + print('fnd obvious singles -', n) + # nice_print(arr) + if n != 0: + return True + else: + return False + + +# =============== + + +def fnd_obvious_singles_witharr(arr): + n = 0 + for st_n, st in enumerate(arr): + for rd_n, rd in enumerate(st): + if rd == 0: + tmp = [1, 2, 3, 4, 5, 6, 7, 8, 9] + for i in range(1, 10): + if (i in st) or (i in ves_riad(arr, rd_n)) or (i in minikvadrat(arr, st_n, rd_n)): + # print(rd, '>', st_n, rd_n, '>>', i, tmp) + del tmp[tmp.index(i)] + # print() + # print(' ', tmp) + if len(tmp) == 1: + arr[st_n][rd_n] = tmp[0] + n += 1 + else: + arr[st_n][rd_n] = tmp + # else: + # print(rd, '>') + print('fnd obvious with arr -', n) + # nice_print(arr) + # if n != 0: + # return True + # else: + # return False + + +# =============== + + +def perebor(arr, nn): + n_iter = 0 + tst = deepcopy(arr) + while not sud_win(tst): + n_iter += 1 + if n_iter % 5_000 == 0: + print(nn, n_iter) + next = True + # print(False) + tst = deepcopy(arr) + for st_n, st in enumerate(tst): + if next == False: + break + for rd_n, rd in enumerate(st): + if next == False: + break + if rd == 0: + tmp = rend_arr() + for i in tmp: + # print(i, minikvadrat(tst, st_n, rd_n)) + if (i in st) or (i in ves_riad(tst, rd_n)) or (i in minikvadrat(tst, st_n, rd_n)): + pass + else: + # print(rd_n*' ', i) + tst[st_n][rd_n] = i + break + if tst[st_n][rd_n] == 0: + # print('False') + next = False + + # nice_print(tst) + print(tst) + return tst + + +# ===================== + + +def rend_win(arr): + pomena = 0 + # found = True + for st_n, st in enumerate(arr): + # if not found: break + for rd_n, rd in enumerate(st): + # if not found: break + if type(rd) == list: + len_n = len(arr[st_n][rd_n]) - 1 + rndind = random.randint(0, len_n) + i = arr[st_n][rd_n][rndind] + + if (i not in st) and (i not in ves_riad(arr, rd_n)) and (i not in minikvadrat(arr, st_n, rd_n)): + arr[st_n][rd_n] = arr[st_n][rd_n][rndind] + pomena += 1 + else: + # found = False + # print(False) + # print('pomena', pomena) + return + # print(st_n, rd_n, 'LIST', rd, '>', len_n, rndind, '>>', arr[st_n][rd_n]) + + +# ===================== + +def recursive_selection(arr, st_start, rd_start): + # nice_print(arr) + print('rec..') + for st_n in range(st_start, len(arr)): + for rd_n in range(rd_start, len(arr)): + if type(arr[st_n][rd_n]) == list: + for i in arr[st_n][rd_n]: + # print(arr[st_n][rd_n], i, arr[st_n], ves_riad(arr, rd_n), minikvadrat(arr, st_n, rd_n)) + if (i not in arr[st_n]) and (i not in ves_riad(arr, rd_n)) and (i not in minikvadrat(arr, st_n, rd_n)): + + print(arr[st_n][rd_n], i) + + arr[st_n][rd_n] = i + + if st_n+1 != 9 and rd_n+1 != 9: + print('>') + recursive_selection(deepcopy(arr), st_n, rd_n + 1) + elif st_n+1 != 9 and rd_n+1 == 9: + print('>>') + + recursive_selection(deepcopy(arr), st_n + 1, 0) + elif st_n + 1 == 9 and rd_n + 1 != 9: + print('>>>') + + recursive_selection(deepcopy(arr), 8, rd_n + 1) + else: + break + # nice_print(arr) + # nice_print(arr) + # if st_n+1 == 9 and rd_n+1 == 9: + # nice_print(arr) + # break + # else: + # # nice_print(arr) + # recursive_selection(arr, st_n+1, rd_n+1) + + + + +# ==================== + +def startgame(arr): + # nice_print(arr) + + while fnd_obvious_singles(arr): + pass + + if sud_win(arr): + print('WIN') + return arr + else: + print('perebor ...') + fnd_obvious_singles_witharr(arr) + nice_print(arr) + wrk = deepcopy(arr) + recursive_selection(wrk, 0, 0) + + return arr + + # fnd_obvious_singles_witharr(arr) + # nice_print(arr) + + # n = 0 + # wrk = deepcopy(arr) + # rend_win(wrk) + # n += 1 + # + # nice_print(wrk) + # + # while not sud_win(wrk): + # wrk = deepcopy(arr) + # rend_win(wrk) + # n += 1 + # print('perebor', n) + # quit() + + # nice_print(arr) + + # wrk = deepcopy(arr) + # rend_win(wrk) + # + # nice_print(wrk) + # + # while not sud_win(wrk): + # wrk = deepcopy(arr) + # rend_win(wrk) + + +# startgame(tst0) + +# nice_print(tst0) + + +data = load_file() +print(len(data)) + +n = 0 +win_arr = [] + +startgame(data[1]) + +# for i in data: +# n += 1 +# print() +# print(n, i) +# win_arr.append(startgame(i)) +# print(win_arr) diff --git a/p096_sudoku.txt b/p096_sudoku.txt new file mode 100644 index 0000000..c82a83c --- /dev/null +++ b/p096_sudoku.txt @@ -0,0 +1,500 @@ +Grid 01 +003020600 +900305001 +001806400 +008102900 +700000008 +006708200 +002609500 +800203009 +005010300 +Grid 02 +200080300 +060070084 +030500209 +000105408 +000000000 +402706000 +301007040 +720040060 +004010003 +Grid 03 +000000907 +000420180 +000705026 +100904000 +050000040 +000507009 +920108000 +034059000 +507000000 +Grid 04 +030050040 +008010500 +460000012 +070502080 +000603000 +040109030 +250000098 +001020600 +080060020 +Grid 05 +020810740 +700003100 +090002805 +009040087 +400208003 +160030200 +302700060 +005600008 +076051090 +Grid 06 +100920000 +524010000 +000000070 +050008102 +000000000 +402700090 +060000000 +000030945 +000071006 +Grid 07 +043080250 +600000000 +000001094 +900004070 +000608000 +010200003 +820500000 +000000005 +034090710 +Grid 08 +480006902 +002008001 +900370060 +840010200 +003704100 +001060049 +020085007 +700900600 +609200018 +Grid 09 +000900002 +050123400 +030000160 +908000000 +070000090 +000000205 +091000050 +007439020 +400007000 +Grid 10 +001900003 +900700160 +030005007 +050000009 +004302600 +200000070 +600100030 +042007006 +500006800 +Grid 11 +000125400 +008400000 +420800000 +030000095 +060902010 +510000060 +000003049 +000007200 +001298000 +Grid 12 +062340750 +100005600 +570000040 +000094800 +400000006 +005830000 +030000091 +006400007 +059083260 +Grid 13 +300000000 +005009000 +200504000 +020000700 +160000058 +704310600 +000890100 +000067080 +000005437 +Grid 14 +630000000 +000500008 +005674000 +000020000 +003401020 +000000345 +000007004 +080300902 +947100080 +Grid 15 +000020040 +008035000 +000070602 +031046970 +200000000 +000501203 +049000730 +000000010 +800004000 +Grid 16 +361025900 +080960010 +400000057 +008000471 +000603000 +259000800 +740000005 +020018060 +005470329 +Grid 17 +050807020 +600010090 +702540006 +070020301 +504000908 +103080070 +900076205 +060090003 +080103040 +Grid 18 +080005000 +000003457 +000070809 +060400903 +007010500 +408007020 +901020000 +842300000 +000100080 +Grid 19 +003502900 +000040000 +106000305 +900251008 +070408030 +800763001 +308000104 +000020000 +005104800 +Grid 20 +000000000 +009805100 +051907420 +290401065 +000000000 +140508093 +026709580 +005103600 +000000000 +Grid 21 +020030090 +000907000 +900208005 +004806500 +607000208 +003102900 +800605007 +000309000 +030020050 +Grid 22 +005000006 +070009020 +000500107 +804150000 +000803000 +000092805 +907006000 +030400010 +200000600 +Grid 23 +040000050 +001943600 +009000300 +600050002 +103000506 +800020007 +005000200 +002436700 +030000040 +Grid 24 +004000000 +000030002 +390700080 +400009001 +209801307 +600200008 +010008053 +900040000 +000000800 +Grid 25 +360020089 +000361000 +000000000 +803000602 +400603007 +607000108 +000000000 +000418000 +970030014 +Grid 26 +500400060 +009000800 +640020000 +000001008 +208000501 +700500000 +000090084 +003000600 +060003002 +Grid 27 +007256400 +400000005 +010030060 +000508000 +008060200 +000107000 +030070090 +200000004 +006312700 +Grid 28 +000000000 +079050180 +800000007 +007306800 +450708096 +003502700 +700000005 +016030420 +000000000 +Grid 29 +030000080 +009000500 +007509200 +700105008 +020090030 +900402001 +004207100 +002000800 +070000090 +Grid 30 +200170603 +050000100 +000006079 +000040700 +000801000 +009050000 +310400000 +005000060 +906037002 +Grid 31 +000000080 +800701040 +040020030 +374000900 +000030000 +005000321 +010060050 +050802006 +080000000 +Grid 32 +000000085 +000210009 +960080100 +500800016 +000000000 +890006007 +009070052 +300054000 +480000000 +Grid 33 +608070502 +050608070 +002000300 +500090006 +040302050 +800050003 +005000200 +010704090 +409060701 +Grid 34 +050010040 +107000602 +000905000 +208030501 +040070020 +901080406 +000401000 +304000709 +020060010 +Grid 35 +053000790 +009753400 +100000002 +090080010 +000907000 +080030070 +500000003 +007641200 +061000940 +Grid 36 +006080300 +049070250 +000405000 +600317004 +007000800 +100826009 +000702000 +075040190 +003090600 +Grid 37 +005080700 +700204005 +320000084 +060105040 +008000500 +070803010 +450000091 +600508007 +003010600 +Grid 38 +000900800 +128006400 +070800060 +800430007 +500000009 +600079008 +090004010 +003600284 +001007000 +Grid 39 +000080000 +270000054 +095000810 +009806400 +020403060 +006905100 +017000620 +460000038 +000090000 +Grid 40 +000602000 +400050001 +085010620 +038206710 +000000000 +019407350 +026040530 +900020007 +000809000 +Grid 41 +000900002 +050123400 +030000160 +908000000 +070000090 +000000205 +091000050 +007439020 +400007000 +Grid 42 +380000000 +000400785 +009020300 +060090000 +800302009 +000040070 +001070500 +495006000 +000000092 +Grid 43 +000158000 +002060800 +030000040 +027030510 +000000000 +046080790 +050000080 +004070100 +000325000 +Grid 44 +010500200 +900001000 +002008030 +500030007 +008000500 +600080004 +040100700 +000700006 +003004050 +Grid 45 +080000040 +000469000 +400000007 +005904600 +070608030 +008502100 +900000005 +000781000 +060000010 +Grid 46 +904200007 +010000000 +000706500 +000800090 +020904060 +040002000 +001607000 +000000030 +300005702 +Grid 47 +000700800 +006000031 +040002000 +024070000 +010030080 +000060290 +000800070 +860000500 +002006000 +Grid 48 +001007090 +590080001 +030000080 +000005800 +050060020 +004100000 +080000030 +100020079 +020700400 +Grid 49 +000003017 +015009008 +060000000 +100007000 +009000200 +000500004 +000000020 +500600340 +340200000 +Grid 50 +300200000 +000107000 +706030500 +070009080 +900020004 +010800050 +009040301 +000702000 +000008006