164 lines
3.0 KiB
Python
164 lines
3.0 KiB
Python
#! /usr/bin/python3
|
|
|
|
import re
|
|
from string import ascii_lowercase
|
|
|
|
letterscore = {
|
|
"s": 26,
|
|
"e": 25,
|
|
"a": 24,
|
|
"o": 23,
|
|
"r": 22,
|
|
"i": 21,
|
|
"l": 20,
|
|
"t": 19,
|
|
"n": 18,
|
|
"u": 17,
|
|
"d": 16,
|
|
"c": 15,
|
|
"y": 14,
|
|
"p": 13,
|
|
"m": 12,
|
|
"h": 11,
|
|
"g": 10,
|
|
"b": 9,
|
|
"k": 8,
|
|
"f": 7,
|
|
"w": 6,
|
|
"v": 5,
|
|
"z": 4,
|
|
"x": 3,
|
|
"j": 2,
|
|
"q": 1,
|
|
}
|
|
|
|
def trimWordList(toRemove, words):
|
|
for word in toRemove:
|
|
try:
|
|
words.pop(word)
|
|
except(KeyError):
|
|
pass
|
|
|
|
def rankWord(word, words):
|
|
score = sum(letterscore.get(letter, 0) for letter in word.lower())
|
|
|
|
multiplier=len(set(word))
|
|
|
|
words[word] = score*multiplier
|
|
return score*multiplier
|
|
|
|
def rankLetters(words):
|
|
|
|
lettercount = {
|
|
"\n": 0
|
|
}
|
|
for word in words:
|
|
for letter in word:
|
|
if letter in lettercount.keys():
|
|
lettercount[letter]=lettercount[letter]+1
|
|
else:
|
|
lettercount[letter]=1
|
|
sort_letters = sorted(lettercount.items(), key=lambda x: x[1])
|
|
|
|
for key in letterscore:
|
|
letterscore[key] = 0
|
|
|
|
rank=0
|
|
|
|
for i in sort_letters:
|
|
letterscore[i[0]] = rank
|
|
rank+=1
|
|
|
|
def matchKnown(mask, words):
|
|
toRemove = [word for word in words if not re.search(mask, word)]
|
|
(words.remove(word) for word in toRemove)
|
|
|
|
|
|
def removeExcluded(mask, words):
|
|
toRemove = []
|
|
for word in words:
|
|
for letter in mask:
|
|
if re.search(letter, word):
|
|
toRemove.append(word)
|
|
trimWordList(toRemove, words)
|
|
|
|
|
|
def matchIncluded(mask, words):
|
|
toRemove = []
|
|
for word in words:
|
|
for letter in mask:
|
|
if not re.search(letter, word):
|
|
toRemove.append(word)
|
|
trimWordList(toRemove, words)
|
|
|
|
|
|
|
|
def removeMask(masks, words):
|
|
toRemove = []
|
|
for word in words:
|
|
index=0
|
|
for letter in word:
|
|
for excluded in masks[index]:
|
|
if letter == excluded:
|
|
toRemove.append(word)
|
|
index+=1
|
|
|
|
|
|
trimWordList(toRemove, words)
|
|
|
|
|
|
|
|
def countDistinct(str):
|
|
s = set(str)
|
|
return len(s)
|
|
|
|
def loadWords(file, words):
|
|
with open(file) as f:
|
|
for line in f:
|
|
words[line.rstrip()]=0;
|
|
|
|
def parseMask(mask, masks):
|
|
index=0
|
|
for letter in mask:
|
|
if letter != ".":
|
|
masks[index].append(letter)
|
|
index+=1
|
|
else:
|
|
index+=1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
|
|
words = {}
|
|
|
|
|
|
loadWords(sys.argv[1], words)
|
|
|
|
masks=[]
|
|
maskList=[[]]
|
|
for index in range(0,len(next(iter(words)))-1):
|
|
new=[]
|
|
maskList.append(new)
|
|
|
|
matchKnown(sys.argv[2], words)
|
|
removeExcluded(sys.argv[4], words)
|
|
matchIncluded(sys.argv[3], words)
|
|
|
|
for index in range(5, len(sys.argv)):
|
|
masks.append(sys.argv[index])
|
|
for mask in masks:
|
|
parseMask(mask, maskList)
|
|
|
|
removeMask(maskList, words)
|
|
|
|
rankLetters(words)
|
|
|
|
for word in words:
|
|
words[word] = rankWord(word, words)
|
|
|
|
|
|
for word in words:
|
|
print(str(words[word]) + " " + word)
|
|
|