Skip to content

Instantly share code, notes, and snippets.

@jeffdonahue
Last active January 4, 2020 06:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeffdonahue/3b091a30bf67106165cf069d94ee1369 to your computer and use it in GitHub Desktop.
Save jeffdonahue/3b091a30bf67106165cf069d94ee1369 to your computer and use it in GitHub Desktop.
#!/usr/local/bin/python3
import itertools
import string
class Node:
"""A trie node."""
def __init__(self, char, parent=None):
self._char = char
self._parent = parent
self.children = {}
self.is_terminal = False
def add_child(self, char):
if char not in self.children:
self.children[char] = Node(char, parent=self)
return self.children[char]
def add_sequence(self, chars):
if chars:
self.add_child(chars[0]).add_sequence(chars[1:])
else:
# I'm the last node in the sequence, mark myself terminal.
self.is_terminal = True
def has_sequence(self, chars):
if not chars:
return self.is_terminal
try:
child = self.children[chars[0]]
except KeyError:
return False
return child.has_sequence(chars[1:])
def get_prefix(self):
parent = self._parent
return (parent.get_prefix() if parent else '') + self._char
def get_words_with_chars(self, available_chars, words=None):
if words is None:
words = []
if self.is_terminal:
words.append(self.get_prefix())
for char in available_chars:
try:
child = self.children[char]
except KeyError:
continue
child.get_words_with_chars(available_chars, words)
return words
def build_trie(words):
root = Node('')
for word in words:
root.add_sequence(word)
return root
def get_wordlist(filename='wordlist.txt'):
with open(filename, 'r') as f:
words = [l.strip().lower() for l in f.readlines()]
return words
def prnow(*args, **kwargs):
kwargs['flush'] = True
return print(*args, **kwargs)
def points_for_word(rs, os, word):
is_good = (
len(word) >= 4 and
all(r in word for r in rs) and
all(w in os for w in word)
)
if not is_good:
return 0
length_points = 1 if len(word) == 4 else len(word)
pangram_points = 7 if all(o in word for o in os) else 0
return length_points + pangram_points
def words_in_circle(required_letters, optional_letters, words):
"""Slow version using brute force."""
os = set(required_letters) | set(optional_letters)
for word in words:
points = points_for_word(required_letters, os, word)
if points:
yield points, word
def words_in_circle_trie(required_letters, optional_letters, trie):
"""Fast version using a prebuilt trie."""
os = set(required_letters) | set(optional_letters)
words = trie.get_words_with_chars(list(os))
for word in words:
points = points_for_word(required_letters, os, word)
if points:
yield points, word
def sort_words_and_points(words_and_points):
"""Ranks the [(word, points)] list by points, then len(word), then ABC."""
words_and_points.sort(key=lambda p_w: (-p_w[0], -len(p_w[1]), p_w[1]))
def go(letters=string.ascii_lowercase, circle_num=7, words=None, trie=None,
limit=None):
num = 0
best_score = -1
best_result = None
if trie:
f_words_in_circle = lambda c, o: words_in_circle_trie(c, o, trie)
else:
assert words is not None, 'Must specify either `words` or `tree`.'
f_words_in_circle = lambda c, o: words_in_circle(c, o, words)
for circle_letters in itertools.combinations(letters, circle_num):
for center_index, center_letter in enumerate(circle_letters):
if limit is not None and num >= limit:
prnow(f'Reached limit of {limit} combinations; quitting.')
return best_result
optional_letters = (circle_letters[:center_index] +
circle_letters[center_index+1:])
found_words = list(f_words_in_circle(center_letter, optional_letters))
sort_words_and_points(found_words)
total_score = sum(p for p, w in found_words)
puzzle_disp = f'({center_letter}){"".join(optional_letters)}'
if total_score > best_score:
prnow(f'!!!! NEW HIGH SCORE !!!! {puzzle_disp} -> {total_score} (> {best_score})')
best_score = total_score
best_result = dict(center_letter=center_letter,
optional_letters=optional_letters,
score=total_score,
words=found_words)
prnow(f'{puzzle_disp} score={total_score} (best={best_score}) '
f'({len(found_words)} words): {found_words[:10]}')
num += 1
return best_result
if __name__ == '__main__':
if True:
# Sanity checks.
assert points_for_word('g', 'alpgexm', 'meg') == 0
assert points_for_word('g', 'alpgexm', 'meal') == 0
assert points_for_word('g', 'alpgexm', 'megapler') == 0
assert points_for_word('g', 'alpgexm', 'mega') == 1
assert points_for_word('g', 'alpgexm', 'megap') == 5
assert points_for_word('g', 'alpgexm', 'megapp') == 6
assert points_for_word('g', 'alpgexm', 'megaplee') == 8
assert points_for_word('g', 'alpgexm', 'megaplex') == 15
prnow('Loading wordlist.')
all_words = get_wordlist()
prnow('Done loading wordlist.')
words = [w for w in all_words if len(w) >= 4]
letters = string.ascii_lowercase
disallow_chars = {'s'} # disallow 's'
for disallow_char in disallow_chars:
words = [w for w in words if disallow_char not in w]
letters = [l for l in letters if l != disallow_char]
# Check words are all lowercase.
charset = set(letters)
for word in words:
if not all(w in charset for w in word):
raise ValueError(f'Word has unexpected chars: {word}')
use_trie = True
if use_trie:
prnow(f'Building trie from {len(words)} words.')
trie = build_trie(words)
prnow(f'Done building trie.')
else:
trie = None
prnow('Running search.')
# limit = 100 # quick test
limit = None # forrealz
best_result = go(letters=letters, trie=trie, words=words, limit=limit)
prnow('Done.')
best_score = best_result['score']
center = best_result['center_letter']
optional = best_result['optional_letters']
words_and_points = best_result['words']
prnow(f'Best circle: ({center}){"".join(optional)}')
prnow(f'It scored {best_score}, from {len(words_and_points)} words.')
prnow(f'Words and points:')
prnow('\n'.join(f'\t{w} ({p})' for p, w in words_and_points))
Loading wordlist.
Done loading wordlist.
Building trie from 67985 words.
Done building trie.
Running search.
[...]
Done.
Best circle: (r)aegint
It scored 3898, from 537 words.
Words and points:
reaggregating (20)
reintegrating (20)
entertaining (19)
intenerating (19)
regenerating (19)
reinitiating (19)
aggregating (18)
gratineeing (18)
integrating (18)
itinerating (18)
reattaining (18)
reintegrate (18)
reiterating (18)
retargeting (18)
entraining (17)
entreating (17)
garnierite (17)
generating (17)
greatening (17)
ingratiate (17)
interregna (17)
intreating (17)
regranting (17)
retraining (17)
retreating (17)
argentine (16)
argentite (16)
gartering (16)
integrate (16)
intergang (16)
iterating (16)
nattering (16)
rattening (16)
regrating (16)
retagging (16)
retaining (16)
retearing (16)
tangerine (16)
targeting (16)
tattering (16)
aerating (15)
gnattier (15)
gratinee (15)
interage (15)
treating (15)
granite (14)
gratine (14)
ingrate (14)
tangier (14)
tearing (14)
reengineering (13)
ingratiating (12)
engineering (11)
entertainer (11)
reaggregate (11)
rearranging (11)
reinterring (11)
trinitarian (11)
arraigning (10)
engraining (10)
gangrening (10)
ingraining (10)
intenerate (10)
irrigating (10)
irritating (10)
reengaging (10)
reengineer (10)
reentering (10)
regenerate (10)
regreening (10)
regreeting (10)
regretting (10)
reigniting (10)
reinitiate (10)
retreatant (10)
triggering (10)
aggregate (9)
arranging (9)
arrearage (9)
entertain (9)
entrainer (9)
garnering (9)
gettering (9)
gingering (9)
greengage (9)
gregarine (9)
interning (9)
interring (9)
intrigant (9)
itinerant (9)
itinerate (9)
narrating (9)
nitrating (9)
rearrange (9)
reearning (9)
reentrant (9)
regaining (9)
regearing (9)
regretter (9)
reiterate (9)
renigging (9)
rerigging (9)
retinting (9)
retreater (9)
teetering (9)
tentering (9)
titrating (9)
tittering (9)
agrarian (8)
agreeing (8)
aigrette (8)
anearing (8)
angering (8)
anteater (8)
antiarin (8)
arginine (8)
arranger (8)
attainer (8)
attiring (8)
engineer (8)
enraging (8)
entering (8)
gangrene (8)
garaging (8)
generate (8)
gnarring (8)
grainier (8)
graining (8)
granting (8)
greegree (8)
greenier (8)
greening (8)
greeting (8)
grinning (8)
grittier (8)
gritting (8)
inerrant (8)
inertiae (8)
internee (8)
intertie (8)
irrigate (8)
irritant (8)
irritate (8)
narrater (8)
rattener (8)
reattain (8)
reengage (8)
regainer (8)
reigning (8)
reignite (8)
reneging (8)
renitent (8)
retainer (8)
retarget (8)
retiarii (8)
retinene (8)
retinite (8)
retirant (8)
retiring (8)
tartrate (8)
teenager (8)
terraria (8)
titterer (8)
training (8)
triaging (8)
triennia (8)
trigging (8)
aginner (7)
airting (7)
anergia (7)
angaria (7)
angrier (7)
antiair (7)
arenite (7)
arietta (7)
ariette (7)
arraign (7)
arrange (7)
attrite (7)
eagerer (7)
earning (7)
earring (7)
engager (7)
engrain (7)
enterer (7)
entrain (7)
entrant (7)
entreat (7)
etagere (7)
garring (7)
gearing (7)
ginnier (7)
girning (7)
girting (7)
gittern (7)
grainer (7)
granger (7)
granita (7)
grannie (7)
grantee (7)
granter (7)
grating (7)
greaten (7)
greater (7)
greeing (7)
greener (7)
greenie (7)
greeter (7)
grinner (7)
igniter (7)
inertia (7)
ingrain (7)
integer (7)
interne (7)
intrant (7)
intreat (7)
iterant (7)
iterate (7)
naggier (7)
narrate (7)
nattier (7)
nearing (7)
negater (7)
nettier (7)
niterie (7)
nitrate (7)
nitrite (7)
nittier (7)
ragging (7)
rainier (7)
raining (7)
rangier (7)
ranging (7)
ranting (7)
ratatat (7)
ratteen (7)
rattier (7)
ratting (7)
reagent (7)
rearing (7)
reenter (7)
regatta (7)
reginae (7)
regnant (7)
regrant (7)
regrate (7)
regreen (7)
regreet (7)
reining (7)
reinter (7)
reneger (7)
rentier (7)
renting (7)
retinae (7)
retiree (7)
retirer (7)
retrain (7)
retreat (7)
retting (7)
rigging (7)
ringent (7)
ringgit (7)
ringing (7)
rinning (7)
tanager (7)
tantara (7)
tarrier (7)
tarring (7)
tartana (7)
tarting (7)
tattier (7)
tearier (7)
teenier (7)
tentier (7)
tergite (7)
ternate (7)
terrain (7)
terrane (7)
terreen (7)
terrene (7)
terrier (7)
terrine (7)
tertian (7)
tiering (7)
tinnier (7)
titrant (7)
titrate (7)
trainee (7)
trainer (7)
treater (7)
treeing (7)
trigger (7)
trining (7)
aerate (6)
aerier (6)
aigret (6)
airier (6)
airing (6)
antiar (6)
argent (6)
arrant (6)
arrear (6)
artier (6)
attire (6)
earing (6)
earner (6)
eerier (6)
engirt (6)
enrage (6)
entera (6)
entire (6)
entree (6)
ergate (6)
errant (6)
errata (6)
erring (6)
eterne (6)
gagger (6)
gainer (6)
gaiter (6)
ganger (6)
garage (6)
garget (6)
garner (6)
garnet (6)
garret (6)
garter (6)
genera (6)
gerent (6)
getter (6)
ginger (6)
ginner (6)
grange (6)
grater (6)
gratin (6)
greige (6)
grigri (6)
inaner (6)
intern (6)
irater (6)
nagger (6)
narine (6)
natter (6)
nearer (6)
neater (6)
netter (6)
nigger (6)
raggee (6)
raging (6)
ragtag (6)
ranger (6)
ranter (6)
raring (6)
ratine (6)
rating (6)
ratite (6)
rattan (6)
ratten (6)
ratter (6)
reagin (6)
rearer (6)
reearn (6)
regain (6)
regear (6)
regent (6)
reggae (6)
regina (6)
regret (6)
renege (6)
rennet (6)
rennin (6)
renter (6)
retain (6)
retear (6)
retene (6)
retina (6)
retine (6)
retint (6)
retire (6)
rigger (6)
ringer (6)
ritter (6)
tagger (6)
tagrag (6)
tanner (6)
tantra (6)
target (6)
taring (6)
tartan (6)
tartar (6)
tarter (6)
tatter (6)
tearer (6)
teener (6)
teeter (6)
tenner (6)
tenter (6)
terete (6)
terrae (6)
terret (6)
territ (6)
tetter (6)
tinier (6)
tinner (6)
tinter (6)
tiring (6)
titter (6)
triage (6)
triene (6)
triter (6)
aerie (5)
agger (5)
agree (5)
agria (5)
airer (5)
anear (5)
anger (5)
antra (5)
antre (5)
areae (5)
arena (5)
arete (5)
atria (5)
attar (5)
eager (5)
eagre (5)
eater (5)
eerie (5)
eggar (5)
egger (5)
egret (5)
enter (5)
gager (5)
garni (5)
genre (5)
gnarr (5)
grain (5)
grana (5)
grant (5)
grate (5)
great (5)
green (5)
greet (5)
inert (5)
inner (5)
inter (5)
irate (5)
iring (5)
naira (5)
niter (5)
nitre (5)
ragee (5)
ranee (5)
range (5)
rarer (5)
ratan (5)
rater (5)
reata (5)
regna (5)
reign (5)
renig (5)
renin (5)
rente (5)
reran (5)
rerig (5)
retag (5)
retia (5)
retie (5)
riant (5)
riata (5)
targe (5)
tarre (5)
tatar (5)
tater (5)
terai (5)
terga (5)
terne (5)
terra (5)
tetra (5)
tiara (5)
tiger (5)
titer (5)
titre (5)
tragi (5)
train (5)
trait (5)
treat (5)
treen (5)
trier (5)
trine (5)
trite (5)
agar (1)
ager (1)
airn (1)
airt (1)
area (1)
aria (1)
earn (1)
eger (1)
erne (1)
gear (1)
girn (1)
girt (1)
gnar (1)
gran (1)
grat (1)
gree (1)
grig (1)
grin (1)
grit (1)
near (1)
raga (1)
rage (1)
ragi (1)
raia (1)
rain (1)
rang (1)
rani (1)
rant (1)
rare (1)
rate (1)
rear (1)
rein (1)
rent (1)
rete (1)
ring (1)
rite (1)
tare (1)
tarn (1)
tart (1)
tear (1)
tern (1)
tier (1)
tire (1)
tree (1)
tret (1)
trig (1)
Loading wordlist.
Done loading wordlist.
Building trie from 171752 words.
Done building trie.
Running search.
[...]
Done.
Best circle: (e)ainrst
It scored 8681, from 1179 words.
Words and points:
entertainers (19)
interstrains (19)
straitnesses (19)
intenerates (18)
interstates (18)
interstrain (18)
iratenesses (18)
itineraries (18)
reinitiates (18)
restrainers (18)
tristearins (18)
antistress (17)
artinesses (17)
entertains (17)
entrainers (17)
entreaties (17)
errantries (17)
interstate (17)
intrastate (17)
itinerants (17)
itinerates (17)
reinstates (17)
resistants (17)
restrainer (17)
restraints (17)
sanitaries (17)
stannaries (17)
straitness (17)
tanistries (17)
tearstains (17)
tenantries (17)
transients (17)
tristearin (17)
arsenites (16)
attainers (16)
instanter (16)
irateness (16)
reattains (16)
reinstate (16)
resinates (16)
resistant (16)
restrains (16)
restraint (16)
retainers (16)
retirants (16)
seatrains (16)
stearines (16)
strainers (16)
straitens (16)
tanneries (16)
tearstain (16)
ternaries (16)
transient (16)
insatiatenesses (15)
instantaneities (15)
antisera (15)
arenites (15)
arsenite (15)
artiness (15)
entrains (15)
inertias (15)
intreats (15)
nitrates (15)
rainiest (15)
ratanies (15)
resinate (15)
restrain (15)
retrains (15)
retsinas (15)
seatrain (15)
stainers (15)
stearine (15)
stearins (15)
strainer (15)
straiten (15)
terrains (15)
tertians (15)
trainees (15)
trainers (15)
sinisternesses (14)
anestri (14)
antsier (14)
nastier (14)
ratines (14)
retains (14)
retinas (14)
retsina (14)
stainer (14)
stearin (14)
earnestnesses (13)
insatiateness (13)
instantnesses (13)
intensenesses (13)
assassinates (12)
entirenesses (12)
innatenesses (12)
insanenesses (12)
instantiates (12)
intentnesses (12)
serenenesses (12)
sinisterness (12)
asininities (11)
assassinate (11)
earnestness (11)
enteritises (11)
entertainer (11)
inanenesses (11)
inertnesses (11)
instantiate (11)
instantness (11)
intenseness (11)
intensities (11)
nastinesses (11)
nattinesses (11)
retreatants (11)
sternnesses (11)
tastinesses (11)
tattinesses (11)
tensenesses (11)
tersenesses (11)
testinesses (11)
tinninesses (11)
traitresses (11)
tritenesses (11)
airinesses (10)
arrestants (10)
artistries (10)
easinesses (10)
easterners (10)
eerinesses (10)
entireness (10)
entireties (10)
eternities (10)
innateness (10)
insaneness (10)
insanities (10)
insentient (10)
intenerate (10)
intentness (10)
internists (10)
intestates (10)
intestines (10)
nearnesses (10)
neatnesses (10)
rarenesses (10)
reassesses (10)
reentrants (10)
reinitiate (10)
reiterates (10)
restresses (10)
retreatant (10)
retreaters (10)
sanenesses (10)
sensitises (10)
sententiae (10)
sereneness (10)
serenities (10)
tarantases (10)
tartnesses (10)
teentsiest (10)
tertiaries (10)
tininesses (10)
titanesses (10)
anisettes (9)
anserines (9)
anteaters (9)
antisense (9)
antistate (9)
arrestant (9)
arrestees (9)
arresters (9)
arsenates (9)
arteritis (9)
assenters (9)
asserters (9)
assisters (9)
astatines (9)
attesters (9)
easterner (9)
einsteins (9)
ensnarers (9)
enteritis (9)
entertain (9)
entrainer (9)
esterases (9)
eternises (9)
inaneness (9)
inanities (9)
inertness (9)
initiates (9)
insatiate (9)
insensate (9)
inserters (9)
insetters (9)
insistent (9)
insisters (9)
insnarers (9)
intensest (9)
interests (9)
internees (9)
internist (9)
interties (9)
intestate (9)
intestine (9)
irritates (9)
itinerant (9)
itinerate (9)
narraters (9)
nastiness (9)
nattiness (9)
nineteens (9)
ratteners (9)
rearrests (9)
reasserts (9)
reentrant (9)
reentries (9)
reinserts (9)
reiterate (9)
resetters (9)
resisters (9)
retinenes (9)
retinites (9)
retinitis (9)
retreater (9)
sanitates (9)
sanitises (9)
sarsenets (9)
satieties (9)
satirises (9)
seeresses (9)
sensitise (9)
sententia (9)
sentients (9)
serenatas (9)
sestertia (9)
setenants (9)
sirenians (9)
stannites (9)
starriest (9)
stearates (9)
steatites (9)
sternites (9)
sternness (9)
straitest (9)
taeniases (9)
taeniasis (9)
tartrates (9)
tastiness (9)
tattiness (9)
teensiest (9)
teentsier (9)
tenseness (9)
tensities (9)
terseness (9)
testiness (9)
tetanises (9)
tinniness (9)
titanates (9)
titanites (9)
titterers (9)
traitress (9)
treatises (9)
tressiest (9)
trinities (9)
triteness (9)
airiness (8)
anatases (8)
anisette (8)
anserine (8)
anteater (8)
antennae (8)
antennas (8)
antsiest (8)
ariettas (8)
ariettes (8)
aristate (8)
arrestee (8)
arrester (8)
arsenate (8)
arteries (8)
artistes (8)
artsiest (8)
assenter (8)
asserter (8)
assesses (8)
assister (8)
astatine (8)
asterias (8)
atresias (8)
attainer (8)
attester (8)
earnests (8)
easiness (8)
eateries (8)
eeriness (8)
einstein (8)
ensnarer (8)
ensnares (8)
entasias (8)
ententes (8)
enterers (8)
entities (8)
entrants (8)
entreats (8)
eserines (8)
esterase (8)
estreats (8)
eternise (8)
etesians (8)
inerrant (8)
inertiae (8)
initiate (8)
insanest (8)
inserter (8)
insetter (8)
insister (8)
insnarer (8)
insnares (8)
instates (8)
intenser (8)
interest (8)
internee (8)
internes (8)
intertie (8)
iritises (8)
irritate (8)
isatines (8)
iterates (8)
narrater (8)
narrates (8)
nastiest (8)
nattiest (8)
nearness (8)
neatness (8)
nettiest (8)
nineteen (8)
nineties (8)
niteries (8)
nitrites (8)
nittiest (8)
rareness (8)
rarities (8)
ratteens (8)
rattener (8)
rattiest (8)
rearrest (8)
reassert (8)
reassess (8)
reattain (8)
reenters (8)
reinsert (8)
reinters (8)
renitent (8)
rennases (8)
rentiers (8)
reraises (8)
resetter (8)
resister (8)
restarts (8)
restates (8)
restress (8)
retainer (8)
retastes (8)
retiarii (8)
retinene (8)
retinite (8)
retirant (8)
retirees (8)
retirers (8)
retreats (8)
saneness (8)
sanitate (8)
sanities (8)
sanitise (8)
sarsenet (8)
sassiest (8)
satiates (8)
satinets (8)
satirise (8)
sensates (8)
sentient (8)
sentries (8)
serenata (8)
serenate (8)
serenest (8)
seriates (8)
serrates (8)
sestinas (8)
sestines (8)
setenant (8)
sienites (8)
sinister (8)
sirenian (8)
sissiest (8)
sneerers (8)
stanines (8)
stannite (8)
starrier (8)
starters (8)
stearate (8)
steatite (8)
steerers (8)
sternest (8)
sternite (8)
stinters (8)
stirrers (8)
straiter (8)
strasses (8)
stresses (8)
strettas (8)
striates (8)
tannates (8)
tarriers (8)
tarriest (8)
tarsiers (8)
tartness (8)
tartrate (8)
tastiest (8)
tattiest (8)
teariest (8)
teeniest (8)
teensier (8)
teniases (8)
teniasis (8)
tennises (8)
tennists (8)
tentiest (8)
terranes (8)
terraria (8)
terrases (8)
terreens (8)
terrenes (8)
terriers (8)
terrines (8)
tesserae (8)
testates (8)
testiest (8)
tetanies (8)
tetanise (8)
tininess (8)
tinniest (8)
titanate (8)
titaness (8)
titanite (8)
titrates (8)
titterer (8)
treaters (8)
treaties (8)
treatise (8)
tressier (8)
triennia (8)
trientes (8)
tristate (8)
aerates (7)
aeriest (7)
airiest (7)
anatase (7)
annates (7)
antenna (7)
arenite (7)
arietta (7)
ariette (7)
aristae (7)
arrears (7)
arrests (7)
arrises (7)
arsines (7)
artiest (7)
artiste (7)
artsier (7)
asinine (7)
assents (7)
asserts (7)
asteria (7)
atresia (7)
attests (7)
attires (7)
attrite (7)
earners (7)
earnest (7)
easiest (7)
eastern (7)
easters (7)
eeriest (7)
ensnare (7)
entases (7)
entasia (7)
entasis (7)
entente (7)
enterer (7)
entires (7)
entrain (7)
entrant (7)
entreat (7)
entrees (7)
entries (7)
erasers (7)
errants (7)
erratas (7)
eserine (7)
estates (7)
estreat (7)
estrins (7)
etatist (7)
etesian (7)
inanest (7)
inertia (7)
insaner (7)
inserts (7)
insnare (7)
instate (7)
intense (7)
intents (7)
interne (7)
interns (7)
intines (7)
intreat (7)
iratest (7)
isatine (7)
iterant (7)
iterate (7)
nannies (7)
narrate (7)
nasties (7)
natters (7)
nattier (7)
nearest (7)
neatens (7)
neatest (7)
nesters (7)
netters (7)
nettier (7)
ninnies (7)
niterie (7)
nitrate (7)
nitrite (7)
nittier (7)
rainier (7)
raisers (7)
ranters (7)
rasters (7)
ratites (7)
ratteen (7)
rattens (7)
ratters (7)
rattier (7)
rearers (7)
reearns (7)
reenter (7)
reinter (7)
renests (7)
rennase (7)
rennets (7)
rennins (7)
renters (7)
rentier (7)
reraise (7)
rerisen (7)
rerises (7)
reseats (7)
resents (7)
resists (7)
resites (7)
restart (7)
restate (7)
resters (7)
retaste (7)
retears (7)
retenes (7)
retests (7)
retinae (7)
retines (7)
retints (7)
retiree (7)
retirer (7)
retires (7)
retrain (7)
retreat (7)
retries (7)
rinsers (7)
ritters (7)
sanseis (7)
sarsens (7)
sassier (7)
sassies (7)
sateens (7)
satiate (7)
satinet (7)
satires (7)
searest (7)
seaters (7)
seeress (7)
seiners (7)
seisers (7)
seisins (7)
senarii (7)
senates (7)
sennets (7)
sennits (7)
sensate (7)
sereins (7)
serener (7)
serenes (7)
seriate (7)
serines (7)
serrate (7)
serries (7)
sestets (7)
sestina (7)
sestine (7)
settees (7)
setters (7)
sienite (7)
siennas (7)
sierran (7)
sierras (7)
siestas (7)
sinners (7)
sinters (7)
sirrees (7)
sissier (7)
sissies (7)
sisters (7)
sitters (7)
snarers (7)
sneerer (7)
stanine (7)
starers (7)
starets (7)
starter (7)
staters (7)
steerer (7)
sterner (7)
stinter (7)
stirrer (7)
streets (7)
stretta (7)
strette (7)
stretti (7)
striate (7)
taeniae (7)
taenias (7)
tannate (7)
tanners (7)
tannest (7)
tansies (7)
tarrier (7)
tarries (7)
tarsier (7)
tartest (7)
tassets (7)
tassies (7)
tasters (7)
tastier (7)
tatters (7)
tattier (7)
tatties (7)
tearers (7)
tearier (7)
teasers (7)
teeners (7)
teenier (7)
teeters (7)
tenants (7)
tenners (7)
tennies (7)
tennist (7)
tensest (7)
tenters (7)
tentier (7)
ternate (7)
terrain (7)
terrane (7)
terreen (7)
terrene (7)
terrets (7)
terrier (7)
terries (7)
terrine (7)
territs (7)
tersest (7)
tertian (7)
tessera (7)
testate (7)
testees (7)
testers (7)
testier (7)
tetters (7)
tiniest (7)
tinners (7)
tinnier (7)
tinters (7)
tisanes (7)
titrate (7)
titters (7)
titties (7)
trainee (7)
trainer (7)
trasses (7)
treater (7)
tresses (7)
trienes (7)
tritest (7)
tsetses (7)
aerate (6)
aerier (6)
aeries (6)
airers (6)
airest (6)
airier (6)
anears (6)
anenst (6)
anises (6)
ansate (6)
antres (6)
arenas (6)
aretes (6)
arisen (6)
arises (6)
arrear (6)
arrest (6)
arsine (6)
artier (6)
assent (6)
assert (6)
assess (6)
assets (6)
astern (6)
asters (6)
attent (6)
attest (6)
attire (6)
earner (6)
easier (6)
easies (6)
easter (6)
eaters (6)
eerier (6)
enates (6)
entera (6)
enters (6)
entire (6)
entree (6)
eraser (6)
erases (6)
errant (6)
errata (6)
estate (6)
esters (6)
estrin (6)
eterne (6)
inaner (6)
inanes (6)
inerts (6)
innate (6)
inners (6)
insane (6)
insert (6)
insets (6)
intent (6)
intern (6)
inters (6)
intine (6)
irater (6)
irises (6)
isseis (6)
nannie (6)
narine (6)
natter (6)
nearer (6)
neaten (6)
neater (6)
nereis (6)
nesses (6)
nester (6)
netter (6)
niseis (6)
niters (6)
nitres (6)
raiser (6)
raises (6)
ranees (6)
ranter (6)
rarest (6)
rasers (6)
raster (6)
raters (6)
ratine (6)
ratite (6)
ratten (6)
ratter (6)
rearer (6)
reatas (6)
reearn (6)
reests (6)
renest (6)
renins (6)
rennet (6)
rennin (6)
renter (6)
rentes (6)
rerise (6)
reseat (6)
reseen (6)
resees (6)
resent (6)
resets (6)
resins (6)
resist (6)
resite (6)
rester (6)
retain (6)
retear (6)
retene (6)
retest (6)
reties (6)
retina (6)
retine (6)
retint (6)
retire (6)
rinser (6)
rinses (6)
risers (6)
ritter (6)
sanest (6)
sanies (6)
sansei (6)
sarees (6)
sarsen (6)
sasses (6)
sateen (6)
satire (6)
searer (6)
seater (6)
seiner (6)
seines (6)
seiser (6)
seises (6)
seisin (6)
senate (6)
seniti (6)
sennas (6)
sennet (6)
sennit (6)
senses (6)
serais (6)
serein (6)
serene (6)
serest (6)
series (6)
serine (6)
serins (6)
sestet (6)
settee (6)
setter (6)
sienna (6)
sierra (6)
siesta (6)
sinner (6)
sinter (6)
sirees (6)
sirens (6)
sirree (6)
sister (6)
sitten (6)
sitter (6)
snarer (6)
snares (6)
sneers (6)
stanes (6)
starer (6)
stares (6)
stases (6)
stater (6)
states (6)
steers (6)
steins (6)
steres (6)
sterna (6)
sterns (6)
street (6)
stress (6)
striae (6)
taenia (6)
tanner (6)
tarres (6)
tarter (6)
tasses (6)
tasset (6)
tassie (6)
taster (6)
tastes (6)
taters (6)
tatter (6)
tattie (6)
tearer (6)
teaser (6)
teases (6)
teener (6)
teeter (6)
tenant (6)
tenets (6)
teniae (6)
tenias (6)
tenner (6)
tennis (6)
tenser (6)
tenses (6)
tenter (6)
tentie (6)
terais (6)
terete (6)
ternes (6)
terrae (6)
terras (6)
terret (6)
territ (6)
terser (6)
testae (6)
testee (6)
tester (6)
testes (6)
testis (6)
tetras (6)
tetter (6)
tineas (6)
tinier (6)
tinner (6)
tinter (6)
tisane (6)
titers (6)
titres (6)
titter (6)
tittie (6)
treats (6)
treens (6)
triene (6)
triens (6)
triers (6)
trines (6)
triste (6)
triter (6)
tsetse (6)
aerie (5)
airer (5)
anear (5)
anent (5)
anise (5)
ansae (5)
antae (5)
antes (5)
antre (5)
areae (5)
areas (5)
arena (5)
arete (5)
arise (5)
arses (5)
asses (5)
asset (5)
aster (5)
earns (5)
eases (5)
easts (5)
eaten (5)
eater (5)
eerie (5)
enate (5)
enter (5)
entia (5)
erase (5)
ernes (5)
erses (5)
esses (5)
ester (5)
etnas (5)
inane (5)
inert (5)
inner (5)
inset (5)
inter (5)
irate (5)
issei (5)
nares (5)
nates (5)
nears (5)
neats (5)
neist (5)
nerts (5)
nests (5)
netts (5)
nines (5)
nisei (5)
niter (5)
nites (5)
nitre (5)
raise (5)
ranee (5)
rarer (5)
rares (5)
raser (5)
rases (5)
rater (5)
rates (5)
rears (5)
reata (5)
reest (5)
reins (5)
renin (5)
rente (5)
rents (5)
reran (5)
resee (5)
reset (5)
resin (5)
rests (5)
retia (5)
retie (5)
rinse (5)
risen (5)
riser (5)
rises (5)
rites (5)
saner (5)
sanes (5)
saree (5)
sates (5)
sears (5)
seats (5)
seers (5)
seine (5)
seise (5)
senna (5)
sensa (5)
sense (5)
sente (5)
senti (5)
serai (5)
serer (5)
seres (5)
serin (5)
setae (5)
setts (5)
sines (5)
siree (5)
siren (5)
sires (5)
sises (5)
sites (5)
snare (5)
sneer (5)
stane (5)
stare (5)
state (5)
steer (5)
stein (5)
stere (5)
stern (5)
stets (5)
sties (5)
tares (5)
tarre (5)
tasse (5)
taste (5)
tater (5)
tates (5)
tears (5)
tease (5)
teats (5)
teens (5)
tenet (5)
tenia (5)
tense (5)
tents (5)
terai (5)
terne (5)
terns (5)
terra (5)
terse (5)
testa (5)
tests (5)
tetra (5)
tiers (5)
tinea (5)
tines (5)
tires (5)
titer (5)
titre (5)
treat (5)
treen (5)
trees (5)
tress (5)
trets (5)
trier (5)
tries (5)
trine (5)
trite (5)
anes (1)
ante (1)
area (1)
ares (1)
arse (1)
asea (1)
ates (1)
earn (1)
ears (1)
ease (1)
east (1)
eats (1)
eras (1)
erne (1)
erns (1)
errs (1)
erst (1)
eses (1)
etas (1)
etna (1)
ires (1)
near (1)
neat (1)
nene (1)
ness (1)
nest (1)
nets (1)
nett (1)
nine (1)
nite (1)
rare (1)
rase (1)
rate (1)
rear (1)
rees (1)
rein (1)
reis (1)
rent (1)
rest (1)
rete (1)
rets (1)
rise (1)
rite (1)
sane (1)
sate (1)
sear (1)
seas (1)
seat (1)
seen (1)
seer (1)
sees (1)
seis (1)
sene (1)
sent (1)
sera (1)
sere (1)
sers (1)
seta (1)
sets (1)
sett (1)
sine (1)
sire (1)
site (1)
stet (1)
tare (1)
tate (1)
tear (1)
teas (1)
teat (1)
teen (1)
tees (1)
tens (1)
tent (1)
tern (1)
test (1)
tets (1)
tier (1)
ties (1)
tine (1)
tire (1)
tree (1)
tret (1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment