igen-80x25-crossword - crossword-generator - A crossword vtv generator. Err bitreich.org 70 hgit clone git://bitreich.org/crossword-generator git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/crossword-generator URL:git://bitreich.org/crossword-generator git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/crossword-generator bitreich.org 70 1Log /scm/crossword-generator/log.gph bitreich.org 70 1Files /scm/crossword-generator/files.gph bitreich.org 70 1Refs /scm/crossword-generator/refs.gph bitreich.org 70 1Tags /scm/crossword-generator/tag bitreich.org 70 1LICENSE /scm/crossword-generator/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 igen-80x25-crossword (5644B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/usr/bin/env python Err bitreich.org 70 i 2 # coding=utf-8 Err bitreich.org 70 i 3 # Err bitreich.org 70 i 4 # © 2023 Christoph Lohmann <20h@r-36.net> Err bitreich.org 70 i 5 # Err bitreich.org 70 i 6 # This file is published under the terms of the GPLv3. Err bitreich.org 70 i 7 # Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 import os Err bitreich.org 70 i 10 import sys Err bitreich.org 70 i 11 import getopt Err bitreich.org 70 i 12 import random Err bitreich.org 70 i 13 Err bitreich.org 70 i 14 def print_field(field): Err bitreich.org 70 i 15 for line in field: Err bitreich.org 70 i 16 for cell in line: Err bitreich.org 70 i 17 print("%s" % (cell), end="") Err bitreich.org 70 i 18 print("") Err bitreich.org 70 i 19 Err bitreich.org 70 i 20 def usage(app): Err bitreich.org 70 i 21 app = os.path.basename(app) Err bitreich.org 70 i 22 print("usage: %s [-h] file.txt" % (app), file=sys.stderr) Err bitreich.org 70 i 23 sys.exit(1) Err bitreich.org 70 i 24 Err bitreich.org 70 i 25 def main(args): Err bitreich.org 70 i 26 try: Err bitreich.org 70 i 27 opts, largs = getopt.getopt(args[1:], "h") Err bitreich.org 70 i 28 except getopt.GetoptError as err: Err bitreich.org 70 i 29 print(str(err)) Err bitreich.org 70 i 30 usage(args[0]) Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 for o, a in opts: Err bitreich.org 70 i 33 if o == "-h": Err bitreich.org 70 i 34 usage(args[0]) Err bitreich.org 70 i 35 else: Err bitreich.org 70 i 36 assert False, "unhandled option" Err bitreich.org 70 i 37 Err bitreich.org 70 i 38 if len(largs) < 1: Err bitreich.org 70 i 39 usage(args[0]) Err bitreich.org 70 i 40 crossfile = largs[0] Err bitreich.org 70 i 41 entries = {} Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 with open(crossfile) as fd: Err bitreich.org 70 i 44 for line in fd: Err bitreich.org 70 i 45 line = line.strip() Err bitreich.org 70 i 46 if len(line) == 0: Err bitreich.org 70 i 47 continue Err bitreich.org 70 i 48 if line[0] == "#": Err bitreich.org 70 i 49 continue Err bitreich.org 70 i 50 try: Err bitreich.org 70 i 51 (word, hint) = line.split(" ", 1) Err bitreich.org 70 i 52 except ValueError: Err bitreich.org 70 i 53 continue Err bitreich.org 70 i 54 entries[word] = hint Err bitreich.org 70 i 55 if entries == {}: Err bitreich.org 70 i 56 usage(args[0]) Err bitreich.org 70 i 57 #print(entries) Err bitreich.org 70 i 58 Err bitreich.org 70 i 59 def check_word(field, x, y, word, vertical): Err bitreich.org 70 i 60 #print("check_word(field, %s, %s, %s, %s)" % \ Err bitreich.org 70 i 61 # (x, y, word, vertical)) Err bitreich.org 70 i 62 if y < 1 or x < 1: Err bitreich.org 70 i 63 return False Err bitreich.org 70 i 64 for c in word: Err bitreich.org 70 i 65 #print("check '%s' vs '%s' at (%s,%s)" % \ Err bitreich.org 70 i 66 # (field[y][x], c, x, y)) Err bitreich.org 70 i 67 if y > 24: Err bitreich.org 70 i 68 return False Err bitreich.org 70 i 69 if x > 79: Err bitreich.org 70 i 70 return False Err bitreich.org 70 i 71 if field[y][x] == '#': Err bitreich.org 70 i 72 return False Err bitreich.org 70 i 73 if field[y][x] != c and field[y][x] != '.': Err bitreich.org 70 i 74 return False Err bitreich.org 70 i 75 if vertical: Err bitreich.org 70 i 76 y += 1 Err bitreich.org 70 i 77 else: Err bitreich.org 70 i 78 x += 1 Err bitreich.org 70 i 79 return True Err bitreich.org 70 i 80 Err bitreich.org 70 i 81 def add_word(field, x, y, word, vertical): Err bitreich.org 70 i 82 #print("add_word %s %s %s %s %s" % (x, y, word, len(word), Err bitreich.org 70 i 83 # vertical)) Err bitreich.org 70 i 84 for c in word: Err bitreich.org 70 i 85 try: Err bitreich.org 70 i 86 field[y][x] = c Err bitreich.org 70 i 87 except IndexError: Err bitreich.org 70 i 88 print("x = %s, y = %s" % (x, y)) Err bitreich.org 70 i 89 sys.exit(1) Err bitreich.org 70 i 90 if c not in char2pos: Err bitreich.org 70 i 91 char2pos[c] = [] Err bitreich.org 70 i 92 char2pos[c] += [[x, y, vertical]] Err bitreich.org 70 i 93 if vertical: Err bitreich.org 70 i 94 y += 1 Err bitreich.org 70 i 95 else: Err bitreich.org 70 i 96 x += 1 Err bitreich.org 70 i 97 Err bitreich.org 70 i 98 def replace_word(field, x, y, word, vertical, c): Err bitreich.org 70 i 99 #print("replace_word %s %s %s %s %s %s" % (x, y, word, len(word), Err bitreich.org 70 i 100 # vertical, c)) Err bitreich.org 70 i 101 for b in word: Err bitreich.org 70 i 102 try: Err bitreich.org 70 i 103 if c == "=": Err bitreich.org 70 i 104 field[y][x] = c Err bitreich.org 70 i 105 elif field[y][x] != "=": Err bitreich.org 70 i 106 field[y][x] = "X" Err bitreich.org 70 i 107 else: Err bitreich.org 70 i 108 field[y][x] = c Err bitreich.org 70 i 109 except IndexError: Err bitreich.org 70 i 110 print("x = %s, y = %s" % (x, y)) Err bitreich.org 70 i 111 sys.exit(1) Err bitreich.org 70 i 112 if vertical: Err bitreich.org 70 i 113 y += 1 Err bitreich.org 70 i 114 else: Err bitreich.org 70 i 115 x += 1 Err bitreich.org 70 i 116 Err bitreich.org 70 i 117 def print_description(field, x, y, description): Err bitreich.org 70 i 118 for c in description: Err bitreich.org 70 i 119 try: Err bitreich.org 70 i 120 field[y][x] = c Err bitreich.org 70 i 121 except IndexError: Err bitreich.org 70 i 122 print("x = %s, y = %s" % (x, y)) Err bitreich.org 70 i 123 sys.exit(1) Err bitreich.org 70 i 124 x += 1 Err bitreich.org 70 i 125 if x > 78: Err bitreich.org 70 i 126 break Err bitreich.org 70 i 127 Err bitreich.org 70 i 128 maxtries = 10 Err bitreich.org 70 i 129 tries = 0 Err bitreich.org 70 i 130 entriesbackup = entries.copy() Err bitreich.org 70 i 131 while tries < maxtries: Err bitreich.org 70 i 132 # 80x25 for term output. Err bitreich.org 70 i 133 field = [] Err bitreich.org 70 i 134 field.append(["#"]*80) Err bitreich.org 70 i 135 for i in range(1, 24): Err bitreich.org 70 i 136 field.append(["#"] + ["."]*78 + ["#"]) Err bitreich.org 70 i 137 field.append(["#"]*80) Err bitreich.org 70 i 138 char2pos = {} Err bitreich.org 70 i 139 Err bitreich.org 70 i 140 field.append(["#"]*80) Err bitreich.org 70 i 141 for i in range(1, 24): Err bitreich.org 70 i 142 field.append(["#"] + ["."]*78 + ["#"]) Err bitreich.org 70 i 143 field.append(["#"]*80) Err bitreich.org 70 i 144 Err bitreich.org 70 i 145 entries = entriesbackup.copy() Err bitreich.org 70 i 146 print_description(field, 45, 3, "A funny crossword from man pages.") Err bitreich.org 70 i 147 print_description(field, 47, 5, "Have fun solving it!") Err bitreich.org 70 i 148 print_description(field, 42, 7, "[a-z0-9] -> find the manpage") Err bitreich.org 70 i 149 print_description(field, 49, 8, "X -> crossover of names") Err bitreich.org 70 i 150 print_description(field, 30, 10, "= manpage description (hint: grep it)") Err bitreich.org 70 i 151 outputentries = {} Err bitreich.org 70 i 152 markerstr = "abcdefghijklmnopqrstuvwxyz0123456789" Err bitreich.org 70 i 153 ypos = 11 Err bitreich.org 70 i 154 xpos = 30 Err bitreich.org 70 i 155 markeri = 0 Err bitreich.org 70 i 156 for entry in entries.keys(): Err bitreich.org 70 i 157 entries[entry] = [entries[entry], markerstr[markeri]] Err bitreich.org 70 i 158 if ypos == 24: Err bitreich.org 70 i 159 xpos = 2 Err bitreich.org 70 i 160 ypos += 2 Err bitreich.org 70 i 161 if ypos < len(field) - 1: Err bitreich.org 70 i 162 print_description(field, xpos, ypos, \ Err bitreich.org 70 i 163 "%s %s" % (entries[entry][1], \ Err bitreich.org 70 i 164 entries[entry][0])) Err bitreich.org 70 i 165 ypos += 1 Err bitreich.org 70 i 166 markeri += 1 Err bitreich.org 70 i 167 Err bitreich.org 70 i 168 entry = random.choice(list(entries.keys())) Err bitreich.org 70 i 169 vertical = random.choice([True, False]) Err bitreich.org 70 i 170 x = 5 Err bitreich.org 70 i 171 y = 12 Err bitreich.org 70 i 172 #x = random.randint(0 + 5, 5 + 20 - len(entry) * int(not vertical)) Err bitreich.org 70 i 173 #y = random.randint(0 + 5, 5 + 10 - len(entry) * int(vertical)) Err bitreich.org 70 i 174 add_word(field, x, y, entry, vertical) Err bitreich.org 70 i 175 del entries[entry] Err bitreich.org 70 i 176 Err bitreich.org 70 i 177 tryouts = [] Err bitreich.org 70 i 178 while len(entries.keys()) > 0: Err bitreich.org 70 i 179 ex = 0 Err bitreich.org 70 i 180 ey = 0 Err bitreich.org 70 i 181 vertical = True Err bitreich.org 70 i 182 entryfound = False Err bitreich.org 70 i 183 entry = random.choice(list(entries.keys())) Err bitreich.org 70 i 184 #print("Trying %s ..." % (entry), end="") Err bitreich.org 70 i 185 if entry in tryouts: Err bitreich.org 70 i 186 #print("") Err bitreich.org 70 i 187 break Err bitreich.org 70 i 188 Err bitreich.org 70 i 189 sentry = "".join(random.sample(entry, len(entry))) Err bitreich.org 70 i 190 for c in sentry: Err bitreich.org 70 i 191 if c not in char2pos: Err bitreich.org 70 i 192 continue Err bitreich.org 70 i 193 (beg, remain) = entry.split(c, 1) Err bitreich.org 70 i 194 randpos = random.sample(char2pos[c], len(char2pos[c])) Err bitreich.org 70 i 195 for pos in randpos: Err bitreich.org 70 i 196 vertical = not pos[2] Err bitreich.org 70 i 197 ex = pos[0] - len(beg) * int(not vertical) Err bitreich.org 70 i 198 ey = pos[1] - len(beg) * int(vertical) Err bitreich.org 70 i 199 if check_word(field, ex, ey, entry, vertical) == True: Err bitreich.org 70 i 200 #print(" entryfound", end="") Err bitreich.org 70 i 201 entryfound = True Err bitreich.org 70 i 202 break Err bitreich.org 70 i 203 if entryfound == True: Err bitreich.org 70 i 204 break Err bitreich.org 70 i 205 #print("") Err bitreich.org 70 i 206 if entryfound == True: Err bitreich.org 70 i 207 add_word(field, ex, ey, entry, vertical) Err bitreich.org 70 i 208 outputentries[entry] = \ Err bitreich.org 70 i 209 [entries[entry][0], \ Err bitreich.org 70 i 210 entries[entry][1], \ Err bitreich.org 70 i 211 ex, ey, vertical] Err bitreich.org 70 i 212 del entries[entry] Err bitreich.org 70 i 213 else: Err bitreich.org 70 i 214 tryouts.append(entry) Err bitreich.org 70 i 215 if len(entries) == 0: Err bitreich.org 70 i 216 for entry in outputentries.keys(): Err bitreich.org 70 i 217 replace_word(field, \ Err bitreich.org 70 i 218 outputentries[entry][2], \ Err bitreich.org 70 i 219 outputentries[entry][3], \ Err bitreich.org 70 i 220 entry, \ Err bitreich.org 70 i 221 outputentries[entry][4], \ Err bitreich.org 70 i 222 "=") Err bitreich.org 70 i 223 Err bitreich.org 70 i 224 for entry in outputentries.keys(): Err bitreich.org 70 i 225 replace_word(field, \ Err bitreich.org 70 i 226 outputentries[entry][2], \ Err bitreich.org 70 i 227 outputentries[entry][3], \ Err bitreich.org 70 i 228 entry, \ Err bitreich.org 70 i 229 outputentries[entry][4], \ Err bitreich.org 70 i 230 outputentries[entry][1]) Err bitreich.org 70 i 231 break Err bitreich.org 70 i 232 tries += 1 Err bitreich.org 70 i 233 Err bitreich.org 70 i 234 if tries >= maxtries: Err bitreich.org 70 i 235 sys.stderr.write("Crossword not possible.\n") Err bitreich.org 70 i 236 #print(char2pos) Err bitreich.org 70 i 237 print_field(field) Err bitreich.org 70 i 238 return 1 Err bitreich.org 70 i 239 Err bitreich.org 70 i 240 print_field(field) Err bitreich.org 70 i 241 return 0 Err bitreich.org 70 i 242 Err bitreich.org 70 i 243 if __name__ == "__main__": Err bitreich.org 70 i 244 sys.exit(main(sys.argv)) Err bitreich.org 70 i 245 Err bitreich.org 70 .