Guest User

Untitled

a guest
Jan 21st, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. import sys
  2.  
  3. L0 = sys.argv[1]
  4. N = int(sys.argv[2])
  5.  
  6. alpha = set("abcdefghijklmnopqrstuvwxyz")
  7.  
  8. words = set()
  9. for L in open("words_alpha.txt"):
  10. L = L.strip()
  11. if len(L) == N and L[0] == L0:
  12. words.add(L)
  13.  
  14. print("%i acceptable words" % len(words))
  15.  
  16. wsets = {}
  17. for i in range(1, N):
  18. for c in alpha:
  19. wsets[(i, c)] = set(w for w in words if w[i] == c)
  20.  
  21. #
  22. # playing board
  23. #
  24. # x
  25. # x x
  26. # x x x
  27. # x x x x
  28. # x x x x x
  29. #
  30.  
  31. M = [["?"] * (i+1) for i in range(N)]
  32.  
  33. wtab = []
  34. for i in range(1<<(N-1)):
  35. j = 0
  36. w = [(0, 0)]
  37. for k in range(N-1):
  38. j += (i>>k)&1
  39. w.append((k+1, j))
  40. wtab.append(w)
  41.  
  42. def show():
  43. for i, L in enumerate(M):
  44. print(" " * (N-i) + (" ".join(L)))
  45.  
  46. def solve():
  47. if M[0][0] == "?":
  48. # First word, write it down on left side
  49. for w in words:
  50. for i in range(N):
  51. M[i][0] = w[i]
  52. if solve():
  53. return True
  54. for i in range(N):
  55. M[i][0] = "?"
  56. return False
  57. elif M[1][1] == "?":
  58. # Second word; consider words where the
  59. # second character is bigger than the second
  60. # character of first word and write them down
  61. # on the right side.
  62. for w in words:
  63. if (w[1] > M[1][0]):
  64. for i in range(1, N):
  65. M[i][i] = w[i]
  66. if solve():
  67. return True
  68. for i in range(1, N):
  69. M[i][i] = "?"
  70. return False
  71. else:
  72. # General case; find a free cell and try every compatible
  73. # letter that covers it.
  74. free = None
  75. for i in range(2, N):
  76. for j in range(i):
  77. if M[i][j] == "?":
  78. free = (i, j)
  79. break
  80. if free: break
  81. if free is None:
  82. # No free cells, we solved the puzzle
  83. return True
  84. i, j = free
  85. checks = [w for w in wtab if (i, j) in w]
  86. for x in alpha - set(M[i]):
  87. M[i][j] = x
  88. for w in checks:
  89. if (i, j) in w:
  90. word = "".join(M[ii][jj] for (ii, jj) in w)
  91. if "?" not in word:
  92. if word not in words:
  93. break
  94. else:
  95. ws = None
  96. for ii in range(1, N):
  97. if word[ii] != "?":
  98. if ws is None:
  99. ws = wsets[ii, word[ii]]
  100. else:
  101. ws = ws & wsets[ii, word[ii]]
  102. if not ws: break
  103. if not ws: break
  104. else:
  105. # Acceptable assignment, recurse
  106. if solve():
  107. return True
  108. M[i][j] = "?"
  109. return False
  110.  
  111. def score(debug = False):
  112. miss = 0
  113. for w in wtab:
  114. word = "".join(M[i][j] for (i, j) in w)
  115. if word not in words:
  116. miss += 1
  117. if debug:
  118. print("Checking " + word)
  119. return miss
  120.  
  121. if solve():
  122. show()
  123. score(True)
  124. else:
  125. print("No solution")
Add Comment
Please, Sign In to add comment