Removing files from data analysis directory
[ou-summer-of-code-2017.git] / 10-word-search / wordsearch-solution.py
1 import string
2 import re
3 import collections
4 import copy
5 import os
6
7 from enum import Enum
8 Direction = Enum('Direction', 'left right up down upleft upright downleft downright')
9
10 delta = {Direction.left: (0, -1),Direction.right: (0, 1),
11 Direction.up: (-1, 0), Direction.down: (1, 0),
12 Direction.upleft: (-1, -1), Direction.upright: (-1, 1),
13 Direction.downleft: (1, -1), Direction.downright: (1, 1)}
14
15 cat = ''.join
16 wcat = ' '.join
17 lcat = '\n'.join
18
19 def empty_grid(w, h):
20 return [['.' for c in range(w)] for r in range(h)]
21
22 def show_grid(grid):
23 return lcat(cat(r) for r in grid)
24
25 def indices(grid, r, c, l, d):
26 dr, dc = delta[d]
27 w = len(grid[0])
28 h = len(grid)
29 inds = [(r + i * dr, c + i * dc) for i in range(l)]
30 return [(i, j) for i, j in inds
31 if i >= 0
32 if j >= 0
33 if i < h
34 if j < w]
35
36
37 def gslice(grid, r, c, l, d):
38 return [grid[i][j] for i, j in indices(grid, r, c, l, d)]
39
40
41 def set_grid(grid, r, c, d, word):
42 for (i, j), l in zip(indices(grid, r, c, len(word), d), word):
43 grid[i][j] = l
44 return grid
45
46
47 def present_many(grid, words):
48 w = len(grid[0])
49 h = len(grid)
50 wordlens = set(len(w) for w in words)
51 presences = []
52 for r in range(h):
53 for c in range(w):
54 for d in Direction:
55 for wordlen in wordlens:
56 word = cat(gslice(grid, r, c, wordlen, d))
57 if word in words:
58 presences += [(word, r, c, d)]
59 return set(presences)
60
61
62
63 def read_wordsearch(fn):
64 lines = [l.strip() for l in open(fn).readlines()]
65 w, h = [int(s) for s in lines[0].split('x')]
66 grid = lines[1:h+1]
67 words = set(lines[h+1:])
68 return w, h, grid, words
69
70
71
72
73 # ## Part 1
74
75
76 def found_words_length(puzzle):
77 width, height, grid, words = puzzle
78 return sum(len(p[0]) for p in present_many(grid, words))
79
80 def total_found_words_length(puzzles):
81 return sum(found_words_length(p) for p in puzzles)
82
83
84
85
86
87
88 # ## Part 2
89
90
91 def unused_vowels(puzzle, presences):
92 width, height, grid, words = puzzle
93
94 unused_grid = [[c for c in r] for r in grid]
95 for w, r, c, d in presences:
96 set_grid(unused_grid, r, c, d, '.' * len(w))
97 unused_vowel_count = sum(1 for l in unused_grid for c in l if c in 'aeiou')
98 return unused_vowel_count
99
100
101 puzzle = read_wordsearch('10-wordsearch.txt')
102
103 width, height, grid, words = puzzle
104 presences = present_many(grid, words)
105 # found_words = [p[0] for p in presences]
106
107 print("Part 1: Found {} words".format(len(presences)))
108 print("Part 2: {} unused vowels".format(unused_vowels(puzzle, presences)))