import collections
from dataclasses import dataclass
import itertools
-
-
-def only_letters(text):
- return ''.join([c.lower() for c in text if c in string.ascii_letters])
-
-
-only_letters('Hell!o')
-
-with open('/usr/share/dict/british-english') as f:
- words = [line.rstrip() for line in f]
-len(words)
+import cProfile
with open('enable1.txt') as f:
- words = [line.rstrip() for line in f]
-len(words)
+ words = [line.strip() for line in f]
-words = set(only_letters(w)
- for w in words
- if len(only_letters(w)) >= 4
- if len(frozenset(only_letters(w))) <= 7
+words = set(w for w in words
+ if len(w) >= 4
+ if len(frozenset(w)) <= 7
if 's' not in w)
-len(words)
-
word_sets = collections.defaultdict(set)
for w in words:
letters = frozenset(w)
word_sets[letters].add(w)
-len(word_sets)
-
-word_sets[frozenset('elephant')]
@dataclass(frozen=True)
return f'{self.mandatory}|{"".join(sorted(self.letters - set(self.mandatory)))}'
-honeycomb = Honeycomb(mandatory='g', letters=frozenset('apxmelg'))
-honeycomb
-
-
-def present(honeycomb, target):
- return (honeycomb.mandatory in target) and target.issubset(honeycomb.letters)
-
-
-present_sets = [s for s in word_sets if present(honeycomb, s)]
-len(present_sets)
-
-present_sets
-
-for s in present_sets:
- print(word_sets[s])
+def present(target, honeycomb):
+ return ( (honeycomb.mandatory in target)
+ and target.issubset(honeycomb.letters)
+ )
def score(present_set):
return score
-sum(score(present_set) for present_set in present_sets)
-
-set('megaplex') in words
-
-scored_sets = {s: score(s) for s in word_sets}
-
-for s in present_sets:
- print(s, word_sets[s], score(s), scored_sets[s])
-
-
def score_honeycomb(honeycomb):
return sum(sc for letters, sc in scored_sets.items()
- if honeycomb.mandatory in letters
- if letters.issubset(honeycomb.letters)
-# if present(honeycomb, letters)
+ # if honeycomb.mandatory in letters
+ # if letters.issubset(honeycomb.letters)
+ if present(letters, honeycomb)
)
-score_honeycomb(honeycomb)
-
-# +
-# hcs = []
-
-# for mand in 'abcde':
-# remaining = set('abcde') - set(mand)
-# for others in itertools.combinations(remaining, r=3):
-# hcs.append(Honeycomb(mandatory=mand, letters=frozenset(others) | frozenset(mand)))
-
-# print(len(hcs))
-
-# +
-# hcs
-
-# +
-# honeycombs = []
-
-# for mand in string.ascii_lowercase:
-# remaining = set(string.ascii_lowercase) - set(mand)
-# for others in itertools.combinations(remaining, r=6):
-# honeycombs.append(Honeycomb(mandatory=mand, letters=frozenset(others) | frozenset(mand)))
-
-# print(len(honeycombs))
-
-# +
-# honeycombs = []
-
-# candidate_letters = set(string.ascii_lowercase)
-# candidate_letters.remove('s')
-# candidate_letters = frozenset(candidate_letters)
-
-# for mand in candidate_letters:
-# remaining = candidate_letters - set(mand)
-# for others in itertools.combinations(remaining, r=6):
-# honeycombs.append(Honeycomb(mandatory=mand, letters=frozenset(others) | frozenset(mand)))
-
-# print(len(honeycombs))
-
-# +
-# [(h, score_honeycomb(h)) for h in honeycombs[:5]]
-
-# +
-# # %%timeit
-# max(honeycombs, key=score_honeycomb)
-# -
-
pangram_sets = [s for s in word_sets.keys() if len(s) == 7 if 's' not in s]
-len(pangram_sets)
+print("pangram sets:", len(pangram_sets))
-# +
-ps_honeycombs = []
-
-for ps in pangram_sets:
- for mand in ps:
- ps_honeycombs.append(Honeycomb(mandatory=mand, letters=ps))
-
-print(len(ps_honeycombs))
+with open('pangaram_words.txt', 'w') as f:
+ for s in pangram_sets:
+ for w in word_sets[s]:
+ f.write(f'{w}\n')
# +
-# # %%timeit
-# max(ps_honeycombs, key=score_honeycomb)
-
-# +
-## 1 a,e,g,i,n,r,t r 3898
-## 2 a,e,g,i,n,r,t n 3782
-## 3 a,e,g,i,n,r,t e 3769
-# -
-
-score_honeycomb(Honeycomb('r', frozenset('aeginrt')))
+# ps_honeycombs = []
-score_honeycomb(Honeycomb('n', frozenset('aeginrtn')))
+# for ps in pangram_sets:
+# for mand in ps:
+# ps_honeycombs.append(Honeycomb(mandatory=mand, letters=ps))
-score_honeycomb(Honeycomb('e', frozenset('aeginrte')))
+ps_honeycombs = [Honeycomb(mandatory=mand, letters=ps)
+ for ps in pangram_sets
+ for mand in ps]
+print(len(ps_honeycombs), "honeycombs")
+# -
partitioned_scored_sets = {l: {s: scored_sets[s] for s in scored_sets if l in s}
for l in string.ascii_lowercase}
-len(partitioned_scored_sets)
def partitioned_score_honeycomb(honeycomb):
)
+# +
+# # # %%timeit
+best_honyecomb = max(ps_honeycombs, key=partitioned_score_honeycomb)
+print(best_honyecomb, partitioned_score_honeycomb(best_honyecomb))
+# -
+
# # %%timeit
-print(max(ps_honeycombs, key=partitioned_score_honeycomb))
+# best_honyecomb = max(ps_honeycombs, key=score_honeycomb)
+# print(best_honyecomb, partitioned_score_honeycomb(best_honyecomb))
# +
-# partitioned_score_honeycomb(Honeycomb('a', 'abc'))
+# cProfile.run('max(ps_honeycombs, key=score_honeycomb)')
-# +
-# max(len(partitioned_scored_sets[k]) for k in partitioned_scored_sets)
# +
-# len(scored_sets)
+# cProfile.run('max(ps_honeycombs, key=partitioned_score_honeycomb)')
# -
+