{ "cells": [ { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import string\n", "import re\n", "import collections\n", "import copy\n", "import os\n", "\n", "from enum import Enum\n", "Direction = Enum('Direction', 'left right up down upleft upright downleft downright')\n", " \n", "delta = {Direction.left: (0, -1),Direction.right: (0, 1), \n", " Direction.up: (-1, 0), Direction.down: (1, 0), \n", " Direction.upleft: (-1, -1), Direction.upright: (-1, 1), \n", " Direction.downleft: (1, -1), Direction.downright: (1, 1)}\n", "\n", "cat = ''.join\n", "wcat = ' '.join\n", "lcat = '\\n'.join" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def empty_grid(w, h):\n", " return [['.' for c in range(w)] for r in range(h)]" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def show_grid(grid):\n", " return lcat(cat(r) for r in grid)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def indices(grid, r, c, l, d):\n", " dr, dc = delta[d]\n", " w = len(grid[0])\n", " h = len(grid)\n", " inds = [(r + i * dr, c + i * dc) for i in range(l)]\n", " return [(i, j) for i, j in inds\n", " if i >= 0\n", " if j >= 0\n", " if i < h\n", " if j < w]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def gslice(grid, r, c, l, d):\n", " return [grid[i][j] for i, j in indices(grid, r, c, l, d)]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def set_grid(grid, r, c, d, word):\n", " for (i, j), l in zip(indices(grid, r, c, len(word), d), word):\n", " grid[i][j] = l\n", " return grid" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def could_add(grid, r, c, d, word):\n", " s = gslice(grid, r, c, len(word), d)\n", " return re.fullmatch(cat(s), word)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def present(grid, word):\n", " w = len(grid[0])\n", " h = len(grid)\n", " for r in range(h):\n", " for c in range(w):\n", " for d in Direction:\n", " if cat(gslice(grid, r, c, len(word), d)) == word:\n", " return True, r, c, d\n", " return False, 0, 0, list(Direction)[0]" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def pad_grid(g0):\n", " grid = copy.deepcopy(g0)\n", " w = len(grid[0])\n", " h = len(grid)\n", " for r in range(h):\n", " for c in range(w):\n", " if grid[r][c] == '.':\n", " grid[r][c] = random_wordsearch_letter()\n", " return grid" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def read_wordsearch(fn):\n", " lines = [l.strip() for l in open(fn).readlines()]\n", " w, h = [int(s) for s in lines[0].split('x')]\n", " grid = lines[1:h+1]\n", " words = lines[h+1:]\n", " return w, h, grid, words" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(['iisnoitpircserpoacos',\n", " 'eohgiodnpgbeautypoar',\n", " 'arsllorcsnestdomofne',\n", " 'irfdeemseirrgarnlfrb',\n", " 'tclumpingkoeasevoedm',\n", " 'hetobsibecgftdcmgrvi',\n", " 'isesrepoeuelmsriyset',\n", " 'eknaodouusnoedetoxes',\n", " 'vldwiarsoiogsstiedue',\n", " 'ehealcegdsuidsesuifi',\n", " 'dirrsiidnesepmdaelnc',\n", " 'nierrrsdeibuwpegriga',\n", " 'sprirrsyebniednusirb',\n", " 'eeboraisahmieeaycnnw',\n", " 'irrrnbrnepcmanhriuug',\n", " 'tjasdypeykuanppetiot',\n", " 'nuvaaaicssndonrppmer',\n", " 'areeioassenyocoaooze',\n", " 'hellesoamalabruptest',\n", " 'csygsfyosinightclubs'],\n", " ['abruptest',\n", " 'apology',\n", " 'assumed',\n", " 'barricades',\n", " 'beauty',\n", " 'bravely',\n", " 'bravos',\n", " 'burlier',\n", " 'chanties',\n", " 'clumping',\n", " 'coached',\n", " 'coffers',\n", " 'coyness',\n", " 'decriminalisation',\n", " 'detoxes',\n", " 'differs',\n", " 'duelled',\n", " 'duplicating',\n", " 'elaborates',\n", " 'embroils',\n", " 'encirclement',\n", " 'erogenous',\n", " 'facsimiled',\n", " 'festers',\n", " 'flickering',\n", " 'fusible',\n", " 'gluiest',\n", " 'golfers',\n", " 'interpolations',\n", " 'involved',\n", " 'irony',\n", " 'lithographed',\n", " 'nabbed',\n", " 'nightclubs',\n", " 'oblongs',\n", " 'optics',\n", " 'orphaned',\n", " 'overstates',\n", " 'paining',\n", " 'papery',\n", " 'perjures',\n", " 'prescriptions',\n", " 'prissier',\n", " 'rallies',\n", " 'rebated',\n", " 'reneges',\n", " 'saleswomen',\n", " 'scrolls',\n", " 'searing',\n", " 'slobbering',\n", " 'soups',\n", " 'sucking',\n", " 'tenderer',\n", " 'thieved',\n", " 'timbers',\n", " 'toiletries',\n", " 'unabashed',\n", " 'warriors',\n", " 'wimpy',\n", " 'wriest'])" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "width, height, g, ws = read_wordsearch('wordsearch1.txt')\n", "g, ws" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "abruptest (True, 18, 11, )\n", "apology (True, 0, 16, )\n", "assumed (True, 18, 7, )\n", "barricades (True, 14, 5, )\n", "beauty (True, 1, 10, )\n", "bravely (True, 13, 2, )\n", "bravos (False, 0, 0, )\n", "burlier (False, 0, 0, )\n", "chanties (True, 19, 0, )\n", "clumping (True, 4, 1, )\n", "coached (True, 17, 13, )\n", "coffers (True, 0, 17, )\n", "coyness (True, 17, 13, )\n", "decriminalisation (False, 0, 0, )\n", "detoxes (True, 7, 13, )\n", "differs (False, 0, 0, )\n", "duelled (False, 0, 0, )\n", "duplicating (False, 0, 0, )\n", "elaborates (False, 0, 0, )\n", "embroils (True, 3, 4, )\n", "encirclement (False, 0, 0, )\n", "erogenous (True, 2, 10, )\n", "facsimiled (False, 0, 0, )\n", "festers (False, 0, 0, )\n", "flickering (False, 0, 0, )\n", "fusible (False, 0, 0, )\n", "gluiest (True, 11, 18, )\n", "golfers (True, 8, 11, )\n", "interpolations (False, 0, 0, )\n", "involved (False, 0, 0, )\n", "irony (True, 11, 1, )\n", "lithographed (False, 0, 0, )\n", "nabbed (True, 14, 7, )\n", "nightclubs (True, 19, 10, )\n", "oblongs (False, 0, 0, )\n", "optics (True, 17, 16, )\n", "orphaned (True, 17, 14, )\n", "overstates (False, 0, 0, )\n", "paining (True, 15, 13, )\n", "papery (True, 18, 15, )\n", "perjures (True, 12, 1, )\n", "prescriptions (True, 0, 14, )\n", "prissier (True, 15, 6, )\n", "rallies (False, 0, 0, )\n", "rebated (False, 0, 0, )\n", "reneges (False, 0, 0, )\n", "saleswomen (False, 0, 0, )\n", "scrolls (True, 2, 8, )\n", "searing (True, 8, 13, )\n", "slobbering (False, 0, 0, )\n", "soups (True, 9, 9, )\n", "sucking (True, 7, 9, )\n", "tenderer (True, 5, 2, )\n", "thieved (True, 4, 0, )\n", "timbers (True, 6, 19, )\n", "toiletries (False, 0, 0, )\n", "unabashed (False, 0, 0, )\n", "warriors (True, 8, 3, )\n", "wimpy (True, 11, 12, )\n", "wriest (True, 13, 19, )\n" ] } ], "source": [ "for w in ws:\n", " print(w, present(g, w))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which words are present?" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['abruptest',\n", " 'apology',\n", " 'assumed',\n", " 'barricades',\n", " 'beauty',\n", " 'bravely',\n", " 'chanties',\n", " 'clumping',\n", " 'coached',\n", " 'coffers',\n", " 'coyness',\n", " 'detoxes',\n", " 'embroils',\n", " 'erogenous',\n", " 'gluiest',\n", " 'golfers',\n", " 'irony',\n", " 'nabbed',\n", " 'nightclubs',\n", " 'optics',\n", " 'orphaned',\n", " 'paining',\n", " 'papery',\n", " 'perjures',\n", " 'prescriptions',\n", " 'prissier',\n", " 'scrolls',\n", " 'searing',\n", " 'soups',\n", " 'sucking',\n", " 'tenderer',\n", " 'thieved',\n", " 'timbers',\n", " 'warriors',\n", " 'wimpy',\n", " 'wriest']" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[w for w in ws if present(g, w)[0]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the longest word that is present?" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'prescriptions'" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted([w for w in ws if present(g, w)[0]], key=len)[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the longest word that is absent?" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'decriminalisation'" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted([w for w in ws if not present(g, w)[0]], key=len)[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many letters are unused?" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "143" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g0 = empty_grid(width, height)\n", "for w in ws:\n", " p, r, c, d = present(g, w)\n", " if p:\n", " set_grid(g0, r, c, d, w)\n", "len([c for c in cat(cat(l) for l in g0) if c == '.'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the longest word you can make form the leftover letters?" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Counter({'a': 11,\n", " 'b': 2,\n", " 'c': 3,\n", " 'd': 10,\n", " 'e': 21,\n", " 'f': 3,\n", " 'g': 4,\n", " 'h': 2,\n", " 'i': 15,\n", " 'k': 2,\n", " 'l': 3,\n", " 'm': 7,\n", " 'n': 10,\n", " 'o': 13,\n", " 'p': 3,\n", " 'r': 9,\n", " 's': 12,\n", " 't': 2,\n", " 'u': 6,\n", " 'v': 2,\n", " 'y': 2,\n", " 'z': 1})" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unused_letters = [l for l, u in zip((c for c in cat(cat(l) for l in g)), (c for c in cat(cat(l) for l in g0)))\n", " if u == '.']\n", "unused_letter_count = collections.Counter(unused_letters)\n", "unused_letter_count" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['bravos',\n", " 'burlier',\n", " 'decriminalisation',\n", " 'differs',\n", " 'duelled',\n", " 'duplicating',\n", " 'elaborates',\n", " 'encirclement',\n", " 'facsimiled',\n", " 'festers',\n", " 'flickering',\n", " 'fusible',\n", " 'interpolations',\n", " 'involved',\n", " 'lithographed',\n", " 'oblongs',\n", " 'overstates',\n", " 'rallies',\n", " 'rebated',\n", " 'reneges',\n", " 'saleswomen',\n", " 'slobbering',\n", " 'toiletries',\n", " 'unabashed']" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unused_words = [w for w in ws if not present(g, w)[0]]\n", "unused_words" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*bravos Counter({'v': 1, 'b': 1, 'a': 1, 's': 1, 'o': 1, 'r': 1})\n", "*burlier Counter({'r': 2, 'b': 1, 'u': 1, 'l': 1, 'i': 1, 'e': 1})\n", "*decriminalisation Counter({'i': 4, 'n': 2, 'a': 2, 's': 1, 'l': 1, 'd': 1, 'e': 1, 'r': 1, 't': 1, 'm': 1, 'o': 1, 'c': 1})\n", "*differs Counter({'f': 2, 's': 1, 'i': 1, 'd': 1, 'e': 1, 'r': 1})\n", "*duelled Counter({'d': 2, 'e': 2, 'l': 2, 'u': 1})\n", "*duplicating Counter({'i': 2, 'g': 1, 'n': 1, 'a': 1, 'l': 1, 'd': 1, 't': 1, 'p': 1, 'u': 1, 'c': 1})\n", "*elaborates Counter({'a': 2, 'e': 2, 'b': 1, 's': 1, 'l': 1, 'o': 1, 'r': 1, 't': 1})\n", "*encirclement Counter({'e': 3, 'n': 2, 'c': 2, 'm': 1, 't': 1, 'l': 1, 'i': 1, 'r': 1})\n", "*facsimiled Counter({'i': 2, 's': 1, 'm': 1, 'a': 1, 'f': 1, 'l': 1, 'd': 1, 'e': 1, 'c': 1})\n", "*festers Counter({'s': 2, 'e': 2, 'f': 1, 'r': 1, 't': 1})\n", "*flickering Counter({'i': 2, 'g': 1, 'n': 1, 'f': 1, 'l': 1, 'e': 1, 'k': 1, 'r': 1, 'c': 1})\n", "*fusible Counter({'s': 1, 'e': 1, 'f': 1, 'b': 1, 'i': 1, 'l': 1, 'u': 1})\n", "*interpolations Counter({'n': 2, 'i': 2, 'o': 2, 't': 2, 's': 1, 'a': 1, 'l': 1, 'e': 1, 'p': 1, 'r': 1})\n", "*involved Counter({'v': 2, 'n': 1, 'l': 1, 'i': 1, 'o': 1, 'e': 1, 'd': 1})\n", "*lithographed Counter({'h': 2, 'g': 1, 'a': 1, 'r': 1, 'l': 1, 'i': 1, 'o': 1, 'e': 1, 'p': 1, 'd': 1, 't': 1})\n", "*oblongs Counter({'o': 2, 'b': 1, 'g': 1, 'n': 1, 'l': 1, 's': 1})\n", "*overstates Counter({'s': 2, 'e': 2, 't': 2, 'v': 1, 'a': 1, 'o': 1, 'r': 1})\n", "*rallies Counter({'l': 2, 's': 1, 'a': 1, 'i': 1, 'e': 1, 'r': 1})\n", "*rebated Counter({'e': 2, 'b': 1, 'a': 1, 'd': 1, 'r': 1, 't': 1})\n", "*reneges Counter({'e': 3, 's': 1, 'g': 1, 'n': 1, 'r': 1})\n", "saleswomen Counter({'s': 2, 'e': 2, 'm': 1, 'n': 1, 'a': 1, 'l': 1, 'o': 1, 'w': 1})\n", "*slobbering Counter({'b': 2, 's': 1, 'g': 1, 'n': 1, 'i': 1, 'o': 1, 'e': 1, 'l': 1, 'r': 1})\n", "*toiletries Counter({'i': 2, 'e': 2, 't': 2, 's': 1, 'l': 1, 'o': 1, 'r': 1})\n", "*unabashed Counter({'a': 2, 'b': 1, 'n': 1, 'h': 1, 's': 1, 'd': 1, 'e': 1, 'u': 1})\n" ] } ], "source": [ "makeable_words = []\n", "for w in unused_words:\n", " unused_word_count = collections.Counter(w)\n", " if all(l in unused_letter_count and unused_word_count[l] <= unused_letter_count[l] for l in unused_word_count):\n", " makeable_words += [w]\n", " print('*', end='')\n", " print(w, unused_word_count)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "17" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max(len(w) for w in makeable_words)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'decriminalisation'" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(makeable_words, key=len)[-1]" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def do_wordsearch_tasks(fn):\n", " width, height, grid, words = read_wordsearch(fn)\n", " unused_words = [w for w in words if not present(grid, w)[0]]\n", " lwp = sorted([w for w in words if present(grid, w)[0]], key=len)[-1]\n", " lwa = sorted(unused_words, key=len)[-1]\n", " g0 = empty_grid(width, height)\n", " for w in words:\n", " p, r, c, d = present(grid, w)\n", " if p:\n", " set_grid(g0, r, c, d, w) \n", " unused_letters = [l for l, u in zip((c for c in cat(cat(l) for l in grid)), (c for c in cat(cat(l) for l in g0)))\n", " if u == '.']\n", " unused_letter_count = collections.Counter(unused_letters)\n", " makeable_words = []\n", " for w in unused_words:\n", " unused_word_count = collections.Counter(w)\n", " if all(l in unused_letter_count and unused_word_count[l] <= unused_letter_count[l] for l in unused_word_count):\n", " makeable_words += [w]\n", " lwm = sorted(makeable_words, key=len)[-1]\n", " print('\\n{}'.format(fn))\n", " print('Longest word present: {}, {} letters'.format(lwp, len(lwp)))\n", " print('Longest word absent: {}, {} letters'.format(lwa, len(lwa)))\n", " print('{} unused letters'.format(len([c for c in cat(cat(l) for l in g0) if c == '.'])))\n", " print('Longest makeable word: {}, {}'.format(lwm, len(lwm)))" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "wordsearch00.txt\n", "Longest word present: testamentary, 12 letters\n", "Longest word absent: decontamination, 15 letters\n", "133 unused letters\n", "Longest makeable word: decontamination, 15\n", "\n", "wordsearch01.txt\n", "Longest word present: corresponded, 12 letters\n", "Longest word absent: antihistamines, 14 letters\n", "115 unused letters\n", "Longest makeable word: universality, 12\n", "\n", "wordsearch02.txt\n", "Longest word present: presupposing, 12 letters\n", "Longest word absent: chloroformed, 12 letters\n", "114 unused letters\n", "Longest makeable word: chloroformed, 12\n", "\n", "wordsearch03.txt\n", "Longest word present: pasteurisation, 14 letters\n", "Longest word absent: spotlessness, 12 letters\n", "115 unused letters\n", "Longest makeable word: spotlessness, 12\n", "\n", "wordsearch04.txt\n", "Longest word present: domestication, 13 letters\n", "Longest word absent: discountenances, 15 letters\n", "123 unused letters\n", "Longest makeable word: discountenances, 15\n", "\n", "wordsearch05.txt\n", "Longest word present: refinancing, 11 letters\n", "Longest word absent: polytechnics, 12 letters\n", "124 unused letters\n", "Longest makeable word: polytechnics, 12\n", "\n", "wordsearch06.txt\n", "Longest word present: playwrights, 11 letters\n", "Longest word absent: conglomerations, 15 letters\n", "137 unused letters\n", "Longest makeable word: conglomerations, 15\n", "\n", "wordsearch07.txt\n", "Longest word present: negotiations, 12 letters\n", "Longest word absent: electroplating, 14 letters\n", "110 unused letters\n", "Longest makeable word: electroplating, 14\n", "\n", "wordsearch08.txt\n", "Longest word present: schoolhouses, 12 letters\n", "Longest word absent: tonsillectomies, 15 letters\n", "129 unused letters\n", "Longest makeable word: tonsillectomies, 15\n", "\n", "wordsearch09.txt\n", "Longest word present: ecumenically, 12 letters\n", "Longest word absent: vulgarisation, 13 letters\n", "136 unused letters\n", "Longest makeable word: vulgarisation, 13\n", "\n", "wordsearch10.txt\n", "Longest word present: cosmological, 12 letters\n", "Longest word absent: flabbergasting, 14 letters\n", "115 unused letters\n", "Longest makeable word: perversions, 11\n", "\n", "wordsearch11.txt\n", "Longest word present: penultimates, 12 letters\n", "Longest word absent: slaughterhouses, 15 letters\n", "122 unused letters\n", "Longest makeable word: unfriendliness, 14\n", "\n", "wordsearch12.txt\n", "Longest word present: unintelligibly, 14 letters\n", "Longest word absent: equestriennes, 13 letters\n", "124 unused letters\n", "Longest makeable word: unresponsive, 12\n", "\n", "wordsearch13.txt\n", "Longest word present: fearlessness, 12 letters\n", "Longest word absent: impoverishing, 13 letters\n", "130 unused letters\n", "Longest makeable word: impoverishing, 13\n", "\n", "wordsearch14.txt\n", "Longest word present: separations, 11 letters\n", "Longest word absent: perambulated, 12 letters\n", "159 unused letters\n", "Longest makeable word: perambulated, 12\n", "\n", "wordsearch15.txt\n", "Longest word present: undisciplined, 13 letters\n", "Longest word absent: noncontagious, 13 letters\n", "128 unused letters\n", "Longest makeable word: noncontagious, 13\n", "\n", "wordsearch16.txt\n", "Longest word present: intergalactic, 13 letters\n", "Longest word absent: beautification, 14 letters\n", "107 unused letters\n", "Longest makeable word: pharmacopeias, 13\n", "\n", "wordsearch17.txt\n", "Longest word present: undershirts, 11 letters\n", "Longest word absent: photographing, 13 letters\n", "138 unused letters\n", "Longest makeable word: photographing, 13\n", "\n", "wordsearch18.txt\n", "Longest word present: humanitarians, 13 letters\n", "Longest word absent: environmentalists, 17 letters\n", "120 unused letters\n", "Longest makeable word: proportionality, 15\n", "\n", "wordsearch19.txt\n", "Longest word present: regurgitates, 12 letters\n", "Longest word absent: unsatisfactory, 14 letters\n", "122 unused letters\n", "Longest makeable word: unsatisfactory, 14\n" ] } ], "source": [ "for fn in sorted(os.listdir()):\n", " if re.match('wordsearch\\d\\d\\.txt', fn):\n", " do_wordsearch_tasks(fn)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2+" } }, "nbformat": 4, "nbformat_minor": 0 }