Compare commits

...

3 Commits

  1. 20
      hangman.py
  2. 11
      test_mp.py

20
hangman.py

@ -1,10 +1,11 @@
from string import ascii_lowercase as alphabet
import codecs import codecs
import hashlib import hashlib
import json import json
import multiprocessing
import os import os
import pickle import pickle
import re import re
from string import ascii_lowercase as alphabet
import sys import sys
#32 or 64 bit platform? #32 or 64 bit platform?
if sys.maxsize > 2**32: if sys.maxsize > 2**32:
@ -70,9 +71,20 @@ def generate_letter_frequency(word_list):
if cached is None: if cached is None:
save_freq_cache(word_list,ret) save_freq_cache(word_list,ret)
return ret return ret
def filter_wordlist(input,remaining_letters,word_list):
class bool_regex:
def __init__(self,expr):
self.expr = expr
def __call__(self,arg):
return bool(self.expr.match(arg))
def filter_wordlist(input,remaining_letters,word_list,mp=True):
regex = re.compile(input.replace('.','[{}]'.format(''.join(remaining_letters))) + '$') regex = re.compile(input.replace('.','[{}]'.format(''.join(remaining_letters))) + '$')
if mp and len(word_list) > 1000:
regex = bool_regex(regex)
pool = multiprocessing.Pool()
matches = pool.map(regex,word_list,100_000)
pool.close()
pool.join()
else:
matches = map(regex.match,word_list) matches = map(regex.match,word_list)
remaining_words = (group[1] for group in filter(lambda group: group[0],zip(matches,word_list))) remaining_words = (group[1] for group in filter(lambda group: group[0],zip(matches,word_list)))
return list(remaining_words) return list(remaining_words)
@ -156,7 +168,7 @@ def iterate(word_list,let_freq,prev_word = None):
entered_letters.update(re.findall('[a-z]',word)) entered_letters.update(re.findall('[a-z]',word))
remaining_letters = (ALPHABET & set(let_freq.keys())) - entered_letters - negatives remaining_letters = (ALPHABET & set(let_freq.keys())) - entered_letters - negatives
for i,word in enumerate(entered_words): for i,word in enumerate(entered_words):
remaining_possibilities = filter_wordlist(word,remaining_letters,word_list[i])
remaining_possibilities = filter_wordlist(word,remaining_letters,word_list[i],mp=True)
word_list[i] = remaining_possibilities word_list[i] = remaining_possibilities
print('Matches found:', '\n'.join(multi_word(word_list,10)),sep='\n') print('Matches found:', '\n'.join(multi_word(word_list,10)),sep='\n')
print_likely_chars(remaining_letters,let_freq) print_likely_chars(remaining_letters,let_freq)

11
test_mp.py

@ -0,0 +1,11 @@
import time
from hangman import load_words,filter_wordlist,ALPHABET
words = load_words('words.txt')
def test(input):
s = time.perf_counter()
filter_wordlist('.....',ALPHABET,words,True)
times_mp = time.perf_counter() - s
s = time.perf_counter()
filter_wordlist('.....',ALPHABET,words,False)
times_sc = time.perf_counter() - s
return dict(time_mp=times_mp,times_sc=times_sc)
Loading…
Cancel
Save