The Jan. 3 2020 Riddler is about the popular NY Times Spelling Bee puzzle:
In this game, seven letters are arranged in a honeycomb lattice, with one letter in the center. Here’s the lattice from Dec. 24, 2019:
The goal is to identify as many words that meet the following criteria:
(1) The word must be at least four letters long.
(2) The word must include the central letter.
(3) The word cannot include any letter beyond the seven given letters.
Note that letters can be repeated. For example, the words GAME and AMALGAM are both acceptable words. Four-letter words are worth 1 point each, while five-letter words are worth 5 points, six-letter words are worth 6 points, seven-letter words are worth 7 points, etc. Words that use all of the seven letters in the honeycomb are known as “pangrams” and earn 7 bonus points (in addition to the points for the length of the word). So in the above example, MEGAPLEX is worth 15 points.
*Which seven-letter honeycomb results in the highest possible game score?* To be a valid choice of seven letters, no letter can be repeated, it must not contain the letter S (that would be too easy) and there must be at least one pangram.
For consistency, please use this word list to check your game score.
Since the referenced word list came from my web site (I didn't make up the list; it is a standard Scrabble word list that I happen to host a copy of), I felt somewhat compelled to solve this one.
Other word puzzles are hard because there are so many possibilities to consider. But fortunately the honeycomb puzzle (unlike Boggle or Scrabble) deals with unordered sets of letters, not ordered permutations of letters. So, once we exclude the "S", there are only (25 choose 7) = 480,700 sets of seven letters to consider. A brute force approach could evaluate all of them (probably over the course of multiple hours).
Fortunately, I noticed a better trick. The rules say that every valid honeycomb must contain a pangram. Therefore, it must be the case that every valid honeycomb is a pangram. How many pangrams could there be in the word list—maybe 10,000? It must be a lot less than the number of sets of 7 letters.
So here's a broad sketch of my approach:
(Note: I could have used a frozenset
to represent a set of letters, but a sorted string seemed simpler, and for debugging purposes, I'd rather be looking at 'AEGLMPX'
than at frozenset({'A', 'E', 'G', 'L', 'M', 'P', 'X'})
).
Each of these concepts can be implemented in a couple lines of code:
def best_honeycomb(words) -> tuple:
"""Return (score, honeycomb) for the honeycomb with highest game score on these words."""
return max((game_score(h, words), h) for h in candidate_honeycombs(words))
def candidate_honeycombs(words):
"""The pangram lettersets, each with all 7 centers."""
pangrams = {letterset(w) for w in words if is_pangram(w)}
return (Honeycomb(pangram, center) for pangram in pangrams for center in pangram)
def is_pangram(word) -> bool:
"""Does a word have exactly 7 distinct letters?"""
return len(set(word)) == 7
def game_score(honeycomb, words) -> int:
"""The total score for this honeycomb; the sum of the word scores."""
return sum(word_score(word) for word in words if can_make(honeycomb, word))
def word_score(word) -> int:
"""The points for this word, including bonus for pangram."""
bonus = (7 if is_pangram(word) else 0)
return (1 if len(word) == 4 else len(word) + bonus)
def can_make(honeycomb, word) -> bool:
"""Can the honeycomb make this word?"""
(letters, center) = honeycomb
return center in word and all(L in letters for L in word)
def letterset(word) -> str:
"""The set of letters in a word, as a sorted string.
For example, letterset('GLAM') == letterset('AMALGAM') == 'AGLM'."""
return ''.join(sorted(set(word)))
def Honeycomb(letters, center) -> tuple: return (letters, center)
def wordlist(text) -> list:
"""A list of all the valid whitespace-separated words in text."""
return [w for w in text.upper().split()
if len(w) >= 4 and 'S' not in w and len(set(w)) <= 7]
I'll make a tiny word list and start experimenting with it:
words = wordlist('amalgam amalgamation game games gem glam megaplex cacciatore erotica I me')
words
['AMALGAM', 'GAME', 'GLAM', 'MEGAPLEX', 'CACCIATORE', 'EROTICA']
Note that I
, me
and gem
are too short, games
has an S
which is not allowed, and amalgamation
has too many distinct letters (8). We're left with six valid words out of the original eleven. Here are examples of the functions in action:
{w: word_score(w) for w in words}
{'AMALGAM': 7, 'GAME': 1, 'GLAM': 1, 'MEGAPLEX': 15, 'CACCIATORE': 17, 'EROTICA': 14}
{w for w in words if is_pangram(w)}
{'CACCIATORE', 'EROTICA', 'MEGAPLEX'}
{w: letterset(w) for w in words}
{'AMALGAM': 'AGLM', 'GAME': 'AEGM', 'GLAM': 'AGLM', 'MEGAPLEX': 'AEGLMPX', 'CACCIATORE': 'ACEIORT', 'EROTICA': 'ACEIORT'}
Note that AMALGAM and GLAM have the same letterset, as do CACCIATORE and EROTICA.
honeycomb = Honeycomb('AEGLMPX', 'G')
{w: word_score(w) for w in words if can_make(honeycomb, w)}
{'AMALGAM': 7, 'GAME': 1, 'GLAM': 1, 'MEGAPLEX': 15}
game_score(honeycomb, words)
24
best_honeycomb(words)
(31, ('ACEIORT', 'T'))
We're done! We know how to find the best honeycomb. But so far, we've only done it for the tiny word list. Let's look at the real word list.
! [ -e enable1.txt ] || curl -O http://norvig.com/ngrams/enable1.txt
! wc -w enable1.txt
172820 enable1.txt
enable1 = wordlist(open('enable1.txt').read())
len(enable1)
44585
pangrams = [w for w in enable1 if is_pangram(w)]
len(pangrams)
14741
pangram_sets = {letterset(w) for w in pangrams}
len(pangram_sets)
7986
_ * 7
55902
So to recap on the number of words of various types in enable1:
172,820 total words
44,585 valid words (eliminating "S" words, short words, 8+ letter words)
14,741 pangram words
7,986 unique pangram lettersets
55,902 candidate honeycombs
How long will it take to run best_honeycomb(enable1)
? Let's estimate by checking how long it takes to compute the game score of a single honeycomb:
%time game_score(honeycomb, enable1)
CPU times: user 10.5 ms, sys: 286 µs, total: 10.8 ms Wall time: 10.8 ms
153
That's to compute one game_score
. Multiply by 55,902 candidate honeycombs and we get somewhere in the 10 minute range. I could run best_honeycomb(enable1)
right now and take a coffee break until it completes, but I'm predisposed to think that a puzzle like this deserves a more elegant solution. I know that Project Euler designs their puzzles so that a good solution runs in less than a minute, so I'll make that my goal here.
Here's how I think about making a more efficient program:
game_score
for each of the 55,902 candidate_honeycombs
.game_score
has to look at each word in the wordlist, and test if it is a subset of the honeycomb.Honeycomb('ACEIORT', 'T')
the letter subsets are ['T', 'AT', 'CT', 'ET', 'IT', 'OT', 'RT', 'ACT', 'AET', ...]
'AGLM'
corresponds to both GLAM
and AMALGAM
).{letter_subset: total_points}
giving the total number of word score points for all the words that correspond to the letter subset. I call this a points_table
.game_score
, just take the sum of the 64 letter subset entries in the points table.Here's the code. Notice I didn't want to redefine the global function game_score
with a different signature, so instead I made it be a local function that references the local pts_table
,
from collections import Counter, defaultdict
from itertools import combinations
def best_honeycomb(words) -> tuple:
"""Return (score, honeycomb) for the honeycomb with highest score on these words."""
pts_table = points_table(words)
def game_score(honeycomb) -> int:
return sum(pts_table[s] for s in letter_subsets(honeycomb))
return max((game_score(h), h) for h in candidate_honeycombs(words))
def points_table(words) -> dict:
"""Return a dict of {letterset: points} from words."""
table = Counter()
for w in words:
table[letterset(w)] += word_score(w)
return table
def letter_subsets(honeycomb) -> list:
"""The 64 subsets of the letters in the honeycomb (that must contain the center letter)."""
(letters, center) = honeycomb
return [''.join(subset)
for n in range(1, 8)
for subset in combinations(letters, n)
if center in subset]
Let's get a feel for how this works. First the letter_subsets
:
# A 4-letter honeycomb makes 2**3 = 8 subsets; 7-letter honeycombs make 2**7 == 64
letter_subsets(('ABCD', 'C'))
['C', 'AC', 'BC', 'CD', 'ABC', 'ACD', 'BCD', 'ABCD']
Now the points_table
:
words # Remind me again what the words are?
['AMALGAM', 'GAME', 'GLAM', 'MEGAPLEX', 'CACCIATORE', 'EROTICA']
points_table(words)
Counter({'AGLM': 8, 'AEGM': 1, 'AEGLMPX': 15, 'ACEIORT': 31})
The letterset 'ACEIORT'
gets 31 points, 17 for CACCIATORE and 14 for EROTICA, and the letterset 'AGLM'
gets 8 points, 7 for AMALGAM and 1 for GLAM. The other lettersets represent one word each.
Let's test that best_honeycomb(words)
gets the same answer as before, and that the points table has the same set of pangrams as before.
assert best_honeycomb(words) == (31, ('ACEIORT', 'T'))
assert pangram_sets == {s for s in points_table(enable1) if len(s) == 7}
Finally, the solution to the puzzle:
%time best_honeycomb(enable1)
CPU times: user 1.84 s, sys: 4.03 ms, total: 1.84 s Wall time: 1.85 s
(3898, ('AEGINRT', 'R'))
Wow! 3898 is a high score! And it took only 2 seconds to find it!
OK, that was 30 times faster than my goal of one minute. It was a nice optimization to look at only 64 letter subsets rather than 44,585 words. But I'm still looking at 103,187 honeycombs, and I feel that some of them are a waste of time. Consider the pangram "JUKEBOX". With the uncommon letters J, K, and X, it does not look like a high-scoring honeycomb, no matter what center we choose. So why waste time trying all seven centers? Here's the outline of a faster best_honeycomb
:
game_score('')
, where again game_score
is a local function,this time with access to both pts_table
and subsets
.)
game_score('')
is better than the best score found so far, then evaluate game_score(C)
for each of the seven possible centers C
.def best_honeycomb(words) -> tuple:
"""Return (score, honeycomb) for the honeycomb with highest score on these words."""
best_score, best_honeycomb = 0, None
pts_table = points_table(words)
pangrams = (s for s in pts_table if len(s) == 7)
for pangram in pangrams:
subsets = string_subsets(pangram)
def game_score(center): return sum(pts_table[s] for s in subsets if center in s)
if game_score('') > best_score:
for C in pangram:
if game_score(C) > best_score:
best_score, best_honeycomb = game_score(C), Honeycomb(pangram, C)
return (best_score, best_honeycomb)
def string_subsets(letters) -> list:
"""All subsets of a string."""
return [''.join(s)
for n in range(len(letters) + 1)
for s in combinations(letters, n)]
%time best_honeycomb(enable1)
CPU times: user 439 ms, sys: 1.93 ms, total: 441 ms Wall time: 441 ms
(3898, ('AEGINRT', 'R'))
Looking good! We get the same answer, and in about half a second, four times faster than before.
max(enable1, key=word_score)
'ANTITOTALITARIAN'
What are some of the pangrams?
pangrams[::1000] # Every thousandth one
['AARDWOLF', 'BABBLEMENT', 'CABEZON', 'COLLOGUING', 'DEMERGERING', 'ETYMOLOGY', 'GARROTTING', 'IDENTIFY', 'LARVICIDAL', 'MORTGAGEE', 'OVERHELD', 'PRAWNED', 'REINITIATED', 'TOWHEAD', 'UTOPIAN']
What's the breakdown of reasons why words are invalid?
Counter('S' if 'S' in w else '<4' if len(w) < 4 else '>7' if len(set(w)) > 7 else 'valid'
for w in open('enable1.txt').read().upper().split()).most_common()
[('S', 103913), ('valid', 44585), ('>7', 23400), ('<4', 922)]
There are more than twice as many words with an 'S' as there are valid words.
About the points_table
: How many different letter subsets are there?
pts = points_table(enable1)
len(pts)
21661
That means there's about two valid words for each letterset.
Which lettersets score the most? The least?
pts.most_common(20)
[('AEGINRT', 832), ('ADEGINR', 486), ('ACILNOT', 470), ('ACEINRT', 465), ('CEINORT', 398), ('AEGILNT', 392), ('AGINORT', 380), ('ADEINRT', 318), ('CENORTU', 318), ('ACDEIRT', 307), ('AEGILNR', 304), ('AEILNRT', 283), ('AEGINR', 270), ('ACINORT', 266), ('ADENRTU', 265), ('EGILNRT', 259), ('AILNORT', 252), ('DEGINR', 251), ('AEIMNRT', 242), ('ACELORT', 241)]
pts.most_common()[-20:]
[('IRY', 1), ('AGOY', 1), ('GHOY', 1), ('GIOY', 1), ('EKOY', 1), ('ORUY', 1), ('EOWY', 1), ('ANUY', 1), ('AGUY', 1), ('ELUY', 1), ('ANYZ', 1), ('BEUZ', 1), ('EINZ', 1), ('EKRZ', 1), ('ILZ', 1), ('CIOZ', 1), ('KNOZ', 1), ('NOZ', 1), ('IORZ', 1), ('EMYZ', 1)]
I'd like to see the actual words that each honeycomb can make, in addition to the total score, and I'm curious about how the words are divided up by letterset. Here's a function to provide such a report. I remembered that there is a fill
function in Python (it is in the textwrap
module) but this all turned out to be more complicated than I expected. I guess it is difficult to create a practical extraction and reporting tool. I feel you, Larry Wall.
from textwrap import fill
def report(words, honeycomb=None):
"""Print stats, words, and word scores for the given honeycomb (or
for the best honeycomb if no honeycomb is given) over the given word list."""
optimal = ("" if honeycomb else "optimal ")
if honeycomb is None:
_, honeycomb = best_honeycomb(words)
subsets = letter_subsets(honeycomb)
bins = group_by(words, letterset)
score = sum(word_score(w) for w in words if letterset(w) in subsets)
nwords = sum(len(bins[s]) for s in subsets)
print(f'For this list of {Ns(len(words), "word")}:')
print(f'The {optimal}honeycomb {honeycomb} forms '
f'{Ns(nwords, "word")} for {Ns(score, "point")}.')
print(f'Here are the words formed by each subset, with pangrams first:\n')
for s in sorted(subsets, key=lambda s: (-len(s), s)):
if bins[s]:
pts = sum(word_score(w) for w in bins[s])
print(f'{s} forms {Ns(len(bins[s]), "word")} for {Ns(pts, "point")}:')
words = [f'{w}({word_score(w)})' for w in sorted(bins[s])]
print(fill(' '.join(words), width=80,
initial_indent=' ', subsequent_indent=' '))
def Ns(n, thing, plural=None):
"""Ns(3, 'bear') => '3 bears'; Ns(1, 'world') => '1 world'"""
return f"{n:,d} {thing if n == 1 else plurtal}"
def group_by(items, key):
"Group items into bins of a dict, each bin keyed by key(item)."
bins = defaultdict(list)
for item in items:
bins[key(item)].append(item)
return bins
report(words, honeycomb)
For this list of 6 words: The honeycomb ('AEGLMPX', 'G') forms 4 words for 24 points. Here are the words formed by each subset, with pangrams first: AEGLMPX forms 1 word for 15 points: MEGAPLEX(15) AEGM forms 1 word for 1 point: GAME(1) AGLM forms 2 words for 8 points: AMALGAM(7) GLAM(1)
report(enable1)
For this list of 44,585 words: The optimal honeycomb ('AEGINRT', 'R') forms 537 words for 3,898 points. Here are the words formed by each subset, with pangrams first: AEGINRT forms 50 words for 832 points: AERATING(15) AGGREGATING(18) ARGENTINE(16) ARGENTITE(16) ENTERTAINING(19) ENTRAINING(17) ENTREATING(17) GARNIERITE(17) GARTERING(16) GENERATING(17) GNATTIER(15) GRANITE(14) GRATINE(14) GRATINEE(15) GRATINEEING(18) GREATENING(17) INGRATE(14) INGRATIATE(17) INTEGRATE(16) INTEGRATING(18) INTENERATING(19) INTERAGE(15) INTERGANG(16) INTERREGNA(17) INTREATING(17) ITERATING(16) ITINERATING(18) NATTERING(16) RATTENING(16) REAGGREGATING(20) REATTAINING(18) REGENERATING(19) REGRANTING(17) REGRATING(16) REINITIATING(19) REINTEGRATE(18) REINTEGRATING(20) REITERATING(18) RETAGGING(16) RETAINING(16) RETARGETING(18) RETEARING(16) RETRAINING(17) RETREATING(17) TANGERINE(16) TANGIER(14) TARGETING(16) TATTERING(16) TEARING(14) TREATING(15) AEGINR forms 35 words for 270 points: AGINNER(7) AGREEING(8) ANEARING(8) ANERGIA(7) ANGERING(8) ANGRIER(7) ARGININE(8) EARING(6) EARNING(7) EARRING(7) ENGRAIN(7) ENGRAINING(10) ENRAGING(8) GAINER(6) GANGRENING(10) GARNERING(9) GEARING(7) GRAINER(7) GRAINIER(8) GRANNIE(7) GREGARINE(9) NAGGIER(7) NEARING(7) RANGIER(7) REAGIN(6) REARING(7) REARRANGING(11) REEARNING(9) REENGAGING(10) REGAIN(6) REGAINER(8) REGAINING(9) REGEARING(9) REGINA(6) REGINAE(7) AEGIRT forms 5 words for 34 points: AIGRET(6) AIGRETTE(8) GAITER(6) IRRIGATE(8) TRIAGE(6) AEGNRT forms 13 words for 94 points: ARGENT(6) GARNET(6) GENERATE(8) GRANTEE(7) GRANTER(7) GREATEN(7) NEGATER(7) REAGENT(7) REGENERATE(10) REGNANT(7) REGRANT(7) TANAGER(7) TEENAGER(8) AEINRT forms 30 words for 232 points: ARENITE(7) ATTAINER(8) ENTERTAIN(9) ENTERTAINER(11) ENTRAIN(7) ENTRAINER(9) INERRANT(8) INERTIA(7) INERTIAE(8) INTENERATE(10) INTREAT(7) ITERANT(7) ITINERANT(9) ITINERATE(9) NATTIER(7) NITRATE(7) RATINE(6) REATTAIN(8) REINITIATE(10) RETAIN(6) RETAINER(8) RETINA(6) RETINAE(7) RETIRANT(8) RETRAIN(7) TERRAIN(7) TERTIAN(7) TRAINEE(7) TRAINER(7) TRIENNIA(8) AGINRT forms 21 words for 167 points: AIRTING(7) ATTIRING(8) GRANITA(7) GRANTING(8) GRATIN(6) GRATING(7) INGRATIATING(12) INTRIGANT(9) IRRIGATING(10) IRRITATING(10) NARRATING(9) NITRATING(9) RANTING(7) RATING(6) RATTING(7) TARING(6) TARRING(7) TARTING(7) TITRATING(9) TRAINING(8) TRIAGING(8) EGINRT forms 26 words for 218 points: ENGIRT(6) ENTERING(8) GETTERING(9) GITTERN(7) GREETING(8) IGNITER(7) INTEGER(7) INTERNING(9) INTERRING(9) REENTERING(10) REGREETING(10) REGRETTING(10) REIGNITE(8) REIGNITING(10) REINTERRING(11) RENTING(7) RETINTING(9) RETIRING(8) RETTING(7) RINGENT(7) TEETERING(9) TENTERING(9) TIERING(7) TITTERING(9) TREEING(7) TRIGGERING(10) AEGNR forms 18 words for 120 points: ANGER(5) ARRANGE(7) ARRANGER(8) ENGAGER(7) ENRAGE(6) GANGER(6) GANGRENE(8) GARNER(6) GENERA(6) GRANGE(6) GRANGER(7) GREENGAGE(9) NAGGER(6) RANGE(5) RANGER(6) REARRANGE(9) REENGAGE(8) REGNA(5) AEGRT forms 19 words for 123 points: AGGREGATE(9) ERGATE(6) ETAGERE(7) GARGET(6) GARRET(6) GARTER(6) GRATE(5) GRATER(6) GREAT(5) GREATER(7) REAGGREGATE(11) REGATTA(7) REGRATE(7) RETAG(5) RETARGET(8) TAGGER(6) TARGE(5) TARGET(6) TERGA(5) AEINR forms 3 words for 19 points: INANER(6) NARINE(6) RAINIER(7) AEIRT forms 20 words for 135 points: ARIETTA(7) ARIETTE(7) ARTIER(6) ATTIRE(6) ATTRITE(7) IRATE(5) IRATER(6) IRRITATE(8) ITERATE(7) RATITE(6) RATTIER(7) REITERATE(9) RETIA(5) RETIARII(8) TARRIER(7) TATTIER(7) TEARIER(7) TERAI(5) TERRARIA(8) TITRATE(7) AENRT forms 19 words for 132 points: ANTEATER(8) ANTRE(5) ENTERA(6) ENTRANT(7) ENTREAT(7) ERRANT(6) NARRATE(7) NARRATER(8) NATTER(6) NEATER(6) RANTER(6) RATTEEN(7) RATTEN(6) RATTENER(8) REENTRANT(9) RETREATANT(10) TANNER(6) TERNATE(7) TERRANE(7) AGINR forms 19 words for 138 points: AGRARIAN(8) AIRING(6) ANGARIA(7) ARRAIGN(7) ARRAIGNING(10) ARRANGING(9) GARAGING(8) GARNI(5) GARRING(7) GNARRING(8) GRAIN(5) GRAINING(8) INGRAIN(7) INGRAINING(10) RAGGING(7) RAGING(6) RAINING(7) RANGING(7) RARING(6) AGIRT forms 1 word for 5 points: TRAGI(5) AGNRT forms 1 word for 5 points: GRANT(5) AINRT forms 9 words for 64 points: ANTIAIR(7) ANTIAR(6) ANTIARIN(8) INTRANT(7) IRRITANT(8) RIANT(5) TITRANT(7) TRAIN(5) TRINITARIAN(11) EGINR forms 24 words for 186 points: ENGINEER(8) ENGINEERING(11) ERRING(6) GINGER(6) GINGERING(9) GINNER(6) GINNIER(7) GREEING(7) GREENIE(7) GREENIER(8) GREENING(8) GRINNER(7) NIGGER(6) REENGINEER(10) REENGINEERING(13) REGREENING(10) REIGN(5) REIGNING(8) REINING(7) RENEGING(8) RENIG(5) RENIGGING(9) RERIGGING(9) RINGER(6) EGIRT forms 4 words for 27 points: GRITTIER(8) TERGITE(7) TIGER(5) TRIGGER(7) EGNRT forms 2 words for 12 points: GERENT(6) REGENT(6) EINRT forms 29 words for 190 points: ENTIRE(6) INERT(5) INTER(5) INTERN(6) INTERNE(7) INTERNEE(8) INTERTIE(8) NETTIER(7) NITER(5) NITERIE(7) NITRE(5) NITRITE(7) NITTIER(7) REINTER(7) RENITENT(8) RENTIER(7) RETINE(6) RETINENE(8) RETINITE(8) RETINT(6) TEENIER(7) TENTIER(7) TERRINE(7) TINIER(6) TINNER(6) TINNIER(7) TINTER(6) TRIENE(6) TRINE(5) GINRT forms 6 words for 43 points: GIRTING(7) GRITTING(8) RINGGIT(7) TIRING(6) TRIGGING(8) TRINING(7) AEGR forms 17 words for 84 points: AGER(1) AGGER(5) AGREE(5) ARREARAGE(9) EAGER(5) EAGERER(7) EAGRE(5) EGGAR(5) GAGER(5) GAGGER(6) GARAGE(6) GEAR(1) RAGE(1) RAGEE(5) RAGGEE(6) REGEAR(6) REGGAE(6) AEIR forms 4 words for 22 points: AERIE(5) AERIER(6) AIRER(5) AIRIER(6) AENR forms 9 words for 40 points: ANEAR(5) ARENA(5) EARN(1) EARNER(6) NEAR(1) NEARER(6) RANEE(5) REEARN(6) RERAN(5) AERT forms 24 words for 127 points: AERATE(6) ARETE(5) EATER(5) ERRATA(6) RATE(1) RATER(5) RATTER(6) REATA(5) RETEAR(6) RETREAT(7) RETREATER(9) TARE(1) TARRE(5) TARTER(6) TARTRATE(8) TATER(5) TATTER(6) TEAR(1) TEARER(6) TERRA(5) TERRAE(6) TETRA(5) TREAT(5) TREATER(7) AGIR forms 2 words for 6 points: AGRIA(5) RAGI(1) AGNR forms 5 words for 13 points: GNAR(1) GNARR(5) GRAN(1) GRANA(5) RANG(1) AGRT forms 3 words for 13 points: GRAT(1) RAGTAG(6) TAGRAG(6) AINR forms 4 words for 8 points: AIRN(1) NAIRA(5) RAIN(1) RANI(1) AIRT forms 5 words for 21 points: AIRT(1) ATRIA(5) RIATA(5) TIARA(5) TRAIT(5) ANRT forms 10 words for 50 points: ANTRA(5) ARRANT(6) RANT(1) RATAN(5) RATTAN(6) TANTARA(7) TANTRA(6) TARN(1) TARTAN(6) TARTANA(7) EGIR forms 3 words for 17 points: GREIGE(6) RERIG(5) RIGGER(6) EGNR forms 6 words for 37 points: GENRE(5) GREEN(5) GREENER(7) REGREEN(7) RENEGE(6) RENEGER(7) EGRT forms 7 words for 45 points: EGRET(5) GETTER(6) GREET(5) GREETER(7) REGREET(7) REGRET(6) REGRETTER(9) EINR forms 4 words for 17 points: INNER(5) REIN(1) RENIN(5) RENNIN(6) EIRT forms 17 words for 87 points: RETIE(5) RETIRE(6) RETIREE(7) RETIRER(7) RITE(1) RITTER(6) TERRIER(7) TERRIT(6) TIER(1) TIRE(1) TITER(5) TITRE(5) TITTER(6) TITTERER(8) TRIER(5) TRITE(5) TRITER(6) ENRT forms 19 words for 104 points: ENTER(5) ENTERER(7) ENTREE(6) ETERNE(6) NETTER(6) REENTER(7) RENNET(6) RENT(1) RENTE(5) RENTER(6) RETENE(6) TEENER(6) TENNER(6) TENTER(6) TERN(1) TERNE(5) TERREEN(7) TERRENE(7) TREEN(5) GINR forms 9 words for 44 points: GIRN(1) GIRNING(7) GRIN(1) GRINNING(8) IRING(5) RIGGING(7) RING(1) RINGING(7) RINNING(7) GIRT forms 3 words for 3 points: GIRT(1) GRIT(1) TRIG(1) AER forms 7 words for 25 points: AREA(1) AREAE(5) ARREAR(6) RARE(1) RARER(5) REAR(1) REARER(6) AGR forms 2 words for 2 points: AGAR(1) RAGA(1) AIR forms 2 words for 2 points: ARIA(1) RAIA(1) ART forms 5 words for 24 points: ATTAR(5) RATATAT(7) TART(1) TARTAR(6) TATAR(5) EGR forms 4 words for 15 points: EGER(1) EGGER(5) GREE(1) GREEGREE(8) EIR forms 2 words for 11 points: EERIE(5) EERIER(6) ENR forms 1 word for 1 point: ERNE(1) ERT forms 7 words for 27 points: RETE(1) TEETER(6) TERETE(6) TERRET(6) TETTER(6) TREE(1) TRET(1) GIR forms 2 words for 7 points: GRIG(1) GRIGRI(6)
What if we allowed honeycombs (and words) to have an S?
def S_words(text) -> list:
"""A list of all the valid space-separated words, including words with an S."""
return [w for w in text.upper().split()
if len(w) >= 4 and len(set(w)) <= 7]
report(S_words(open('enable1.txt').read()))
For this list of 98,141 words: The optimal honeycomb ('AEINRST', 'E') forms 1,179 words for 8,681 points. Here are the words formed by each subset, with pangrams first: AEINRST forms 86 words for 1,381 points: ANESTRI(14) ANTISERA(15) ANTISTRESS(17) ANTSIER(14) ARENITES(15) ARSENITE(15) ARSENITES(16) ARTINESS(15) ARTINESSES(17) ATTAINERS(16) ENTERTAINERS(19) ENTERTAINS(17) ENTRAINERS(17) ENTRAINS(15) ENTREATIES(17) ERRANTRIES(17) INERTIAS(15) INSTANTER(16) INTENERATES(18) INTERSTATE(17) INTERSTATES(18) INTERSTRAIN(18) INTERSTRAINS(19) INTRASTATE(17) INTREATS(15) IRATENESS(16) IRATENESSES(18) ITINERANTS(17) ITINERARIES(18) ITINERATES(17) NASTIER(14) NITRATES(15) RAINIEST(15) RATANIES(15) RATINES(14) REATTAINS(16) REINITIATES(18) REINSTATE(16) REINSTATES(17) RESINATE(15) RESINATES(16) RESISTANT(16) RESISTANTS(17) RESTRAIN(15) RESTRAINER(17) RESTRAINERS(18) RESTRAINS(16) RESTRAINT(16) RESTRAINTS(17) RETAINERS(16) RETAINS(14) RETINAS(14) RETIRANTS(16) RETRAINS(15) RETSINA(14) RETSINAS(15) SANITARIES(17) SEATRAIN(15) SEATRAINS(16) STAINER(14) STAINERS(15) STANNARIES(17) STEARIN(14) STEARINE(15) STEARINES(16) STEARINS(15) STRAINER(15) STRAINERS(16) STRAITEN(15) STRAITENS(16) STRAITNESS(17) STRAITNESSES(19) TANISTRIES(17) TANNERIES(16) TEARSTAIN(16) TEARSTAINS(17) TENANTRIES(17) TERNARIES(16) TERRAINS(15) TERTIANS(15) TRAINEES(15) TRAINERS(15) TRANSIENT(16) TRANSIENTS(17) TRISTEARIN(17) TRISTEARINS(18) AEINRS forms 16 words for 124 points: AIRINESS(8) AIRINESSES(10) ANSERINE(8) ANSERINES(9) ARISEN(6) ARSINE(6) ARSINES(7) INSANER(7) INSNARE(7) INSNARER(8) INSNARERS(9) INSNARES(8) SENARII(7) SIERRAN(7) SIRENIAN(8) SIRENIANS(9) AEINRT forms 30 words for 232 points: ARENITE(7) ATTAINER(8) ENTERTAIN(9) ENTERTAINER(11) ENTRAIN(7) ENTRAINER(9) INERRANT(8) INERTIA(7) INERTIAE(8) INTENERATE(10) INTREAT(7) ITERANT(7) ITINERANT(9) ITINERATE(9) NATTIER(7) NITRATE(7) RATINE(6) REATTAIN(8) REINITIATE(10) RETAIN(6) RETAINER(8) RETINA(6) RETINAE(7) RETIRANT(8) RETRAIN(7) TERRAIN(7) TERTIAN(7) TRAINEE(7) TRAINER(7) TRIENNIA(8) AEINST forms 80 words for 713 points: ANISETTE(8) ANISETTES(9) ANTISENSE(9) ANTISTATE(9) ANTSIEST(8) ASININITIES(11) ASSASSINATE(11) ASSASSINATES(12) ASTATINE(8) ASTATINES(9) ENTASIA(7) ENTASIAS(8) ENTASIS(7) ETESIAN(7) ETESIANS(8) INANEST(7) INANITIES(9) INITIATES(9) INNATENESS(10) INNATENESSES(12) INSANEST(8) INSANITIES(10) INSATIATE(9) INSATIATENESS(13) INSATIATENESSES(15) INSENSATE(9) INSTANTANEITIES(15) INSTANTIATE(11) INSTANTIATES(12) INSTANTNESS(11) INSTANTNESSES(13) INSTATE(7) INSTATES(8) INTESTATE(9) INTESTATES(10) ISATINE(7) ISATINES(8) NASTIES(7) NASTIEST(8) NASTINESS(9) NASTINESSES(11) NATTIEST(8) NATTINESS(9) NATTINESSES(11) SANITATE(8) SANITATES(9) SANITIES(8) SANITISE(8) SANITISES(9) SATINET(7) SATINETS(8) SENTENTIA(9) SENTENTIAE(10) SESTINA(7) SESTINAS(8) STANINE(7) STANINES(8) STANNITE(8) STANNITES(9) TAENIAS(7) TAENIASES(9) TAENIASIS(9) TANSIES(7) TASTINESS(9) TASTINESSES(11) TATTINESS(9) TATTINESSES(11) TENIAS(6) TENIASES(8) TENIASIS(8) TETANIES(8) TETANISE(8) TETANISES(9) TINEAS(6) TISANE(6) TISANES(7) TITANATES(9) TITANESS(8) TITANESSES(10) TITANITES(9) AEIRST forms 60 words for 473 points: AERIEST(7) AIREST(6) AIRIEST(7) ARIETTAS(8) ARIETTES(8) ARISTAE(7) ARISTATE(8) ARTERIES(8) ARTERITIS(9) ARTIEST(7) ARTISTE(7) ARTISTES(8) ARTISTRIES(10) ARTSIER(7) ARTSIEST(8) ASSISTER(8) ASSISTERS(9) ASTERIA(7) ASTERIAS(8) ATRESIA(7) ATRESIAS(8) ATTIRES(7) EATERIES(8) IRATEST(7) IRRITATES(9) ITERATES(8) RARITIES(8) RATITES(7) RATTIEST(8) REITERATES(10) SATIRE(6) SATIRES(7) SATIRISE(8) SATIRISES(9) SERIATE(7) SERIATES(8) SESTERTIA(9) STARRIER(8) STARRIEST(9) STRAITER(8) STRAITEST(9) STRIAE(6) STRIATE(7) STRIATES(8) TARRIERS(8) TARRIES(7) TARRIEST(8) TARSIER(7) TARSIERS(8) TASTIER(7) TEARIEST(8) TERAIS(6) TERTIARIES(10) TITRATES(8) TRAITRESS(9) TRAITRESSES(11) TREATIES(8) TREATISE(8) TREATISES(9) TRISTATE(8) AENRST forms 40 words for 336 points: ANTEATERS(9) ANTRES(6) ARRESTANT(9) ARRESTANTS(10) ARSENATE(8) ARSENATES(9) ASSENTER(8) ASSENTERS(9) ASTERN(6) EARNEST(7) EARNESTNESS(11) EARNESTNESSES(13) EARNESTS(8) EASTERN(7) EASTERNER(9) EASTERNERS(10) ENTRANTS(8) ENTREATS(8) ERRANTS(7) NARRATERS(9) NARRATES(8) NATTERS(7) NEAREST(7) RANTERS(7) RATTEENS(8) RATTENERS(9) RATTENS(7) REENTRANTS(10) RETREATANTS(11) SARSENET(8) SARSENETS(9) SERENATA(8) SERENATAS(9) SERENATE(8) STERNA(6) TANNERS(7) TARANTASES(10) TARTNESS(8) TARTNESSES(10) TERRANES(8) EINRST forms 70 words for 582 points: ENTERITIS(9) ENTERITISES(11) ENTIRENESS(10) ENTIRENESSES(12) ENTIRES(7) ENTIRETIES(10) ENTRIES(7) ESTRIN(6) ESTRINS(7) ETERNISE(8) ETERNISES(9) ETERNITIES(10) INERTNESS(9) INERTNESSES(11) INERTS(6) INSERT(6) INSERTER(8) INSERTERS(9) INSERTS(7) INSETTER(8) INSETTERS(9) INSISTER(8) INSISTERS(9) INTENSER(8) INTEREST(8) INTERESTS(9) INTERNEES(9) INTERNES(8) INTERNIST(9) INTERNISTS(10) INTERNS(7) INTERS(6) INTERTIES(9) NITERIES(8) NITERS(6) NITRES(6) NITRITES(8) REENTRIES(9) REINSERT(8) REINSERTS(9) REINTERS(8) RENTIERS(8) RETINENES(9) RETINES(7) RETINITES(9) RETINITIS(9) RETINTS(7) SENTRIES(8) SERENITIES(10) SINISTER(8) SINISTERNESS(12) SINISTERNESSES(14) SINTER(6) SINTERS(7) STERNITE(8) STERNITES(9) STINTER(7) STINTERS(8) TEENSIER(8) TEENTSIER(9) TERRINES(8) TINNERS(7) TINTERS(7) TRIENES(7) TRIENS(6) TRIENTES(8) TRINES(6) TRINITIES(9) TRITENESS(9) TRITENESSES(11) AEINR forms 3 words for 19 points: INANER(6) NARINE(6) RAINIER(7) AEINS forms 17 words for 129 points: ANISE(5) ANISES(6) ASININE(7) EASINESS(8) EASINESSES(10) INANENESS(9) INANENESSES(11) INANES(6) INSANE(6) INSANENESS(10) INSANENESSES(12) NANNIES(7) SANIES(6) SANSEI(6) SANSEIS(7) SIENNA(6) SIENNAS(7) AEINT forms 10 words for 64 points: ENTIA(5) INITIATE(8) INNATE(6) TAENIA(6) TAENIAE(7) TENIA(5) TENIAE(6) TINEA(5) TITANATE(8) TITANITE(8) AEIRS forms 17 words for 106 points: AERIES(6) AIRERS(6) ARISE(5) ARISES(6) ARRISES(7) EASIER(6) RAISE(5) RAISER(6) RAISERS(7) RAISES(6) RERAISE(7) RERAISES(8) SASSIER(7) SERAI(5) SERAIS(6) SIERRA(6) SIERRAS(7) AEIRT forms 20 words for 135 points: ARIETTA(7) ARIETTE(7) ARTIER(6) ATTIRE(6) ATTRITE(7) IRATE(5) IRATER(6) IRRITATE(8) ITERATE(7) RATITE(6) RATTIER(7) REITERATE(9) RETIA(5) RETIARII(8) TARRIER(7) TATTIER(7) TEARIER(7) TERAI(5) TERRARIA(8) TITRATE(7) AEIST forms 15 words for 112 points: EASIEST(7) ETATIST(7) SASSIEST(8) SATIATE(7) SATIATES(8) SATIETIES(9) SIESTA(6) SIESTAS(7) STEATITE(8) STEATITES(9) TASSIE(6) TASSIES(7) TASTIEST(8) TATTIES(7) TATTIEST(8) AENRS forms 25 words for 172 points: ANEARS(6) ARENAS(6) EARNERS(7) EARNS(5) ENSNARE(7) ENSNARER(8) ENSNARERS(9) ENSNARES(8) NARES(5) NEARNESS(8) NEARNESSES(10) NEARS(5) RANEES(6) RARENESS(8) RARENESSES(10) REEARNS(7) RENNASE(7) RENNASES(8) SANER(5) SARSEN(6) SARSENS(7) SNARE(5) SNARER(6) SNARERS(7) SNARES(6) AENRT forms 19 words for 132 points: ANTEATER(8) ANTRE(5) ENTERA(6) ENTRANT(7) ENTREAT(7) ERRANT(6) NARRATE(7) NARRATER(8) NATTER(6) NEATER(6) RANTER(6) RATTEEN(7) RATTEN(6) RATTENER(8) REENTRANT(9) RETREATANT(10) TANNER(6) TERNATE(7) TERRANE(7) AENST forms 32 words for 217 points: ANATASE(7) ANATASES(8) ANENST(6) ANNATES(7) ANSATE(6) ANTENNAS(8) ANTES(5) ASSENT(6) ASSENTS(7) ENATES(6) ENTASES(7) ETNAS(5) NATES(5) NEATENS(7) NEATEST(7) NEATNESS(8) NEATNESSES(10) NEATS(5) SANEST(6) SATEEN(6) SATEENS(7) SENATE(6) SENATES(7) SENSATE(7) SENSATES(8) SETENANT(8) SETENANTS(9) STANE(5) STANES(6) TANNATES(8) TANNEST(7) TENANTS(7) AERST forms 85 words for 604 points: AERATES(7) ARETES(6) ARREST(6) ARRESTEE(8) ARRESTEES(9) ARRESTER(8) ARRESTERS(9) ARRESTS(7) ASSERT(6) ASSERTER(8) ASSERTERS(9) ASSERTS(7) ASTER(5) ASTERS(6) ATTESTER(8) ATTESTERS(9) EASTER(6) EASTERS(7) EATERS(6) ERRATAS(7) ESTERASE(8) ESTERASES(9) ESTREAT(7) ESTREATS(8) RAREST(6) RASTER(6) RASTERS(7) RATERS(6) RATES(5) RATTERS(7) REARREST(8) REARRESTS(9) REASSERT(8) REASSERTS(9) REATAS(6) RESEAT(6) RESEATS(7) RESTART(7) RESTARTS(8) RESTATE(7) RESTATES(8) RETASTE(7) RETASTES(8) RETEARS(7) RETREATERS(10) RETREATS(8) SEAREST(7) SEATER(6) SEATERS(7) SERRATE(7) SERRATES(8) STARE(5) STARER(6) STARERS(7) STARES(6) STARETS(7) STARTER(7) STARTERS(8) STATER(6) STATERS(7) STEARATE(8) STEARATES(9) STRASSES(8) STRETTA(7) STRETTAS(8) TARES(5) TARRES(6) TARTEST(7) TARTRATES(9) TASTER(6) TASTERS(7) TATERS(6) TATTERS(7) TEARERS(7) TEARS(5) TEASER(6) TEASERS(7) TERRAS(6) TERRASES(8) TESSERA(7) TESSERAE(8) TETRAS(6) TRASSES(7) TREATERS(8) TREATS(6) EINRS forms 29 words for 184 points: EERINESS(8) EERINESSES(10) ESERINE(7) ESERINES(8) INNERS(6) NEREIS(6) REINS(5) RENINS(6) RENNINS(7) RERISEN(7) RESIN(5) RESINS(6) RINSE(5) RINSER(6) RINSERS(7) RINSES(6) RISEN(5) SEINER(6) SEINERS(7) SEREIN(6) SEREINS(7) SERIN(5) SERINE(6) SERINES(7) SERINS(6) SINNER(6) SINNERS(7) SIREN(5) SIRENS(6) EINRT forms 29 words for 190 points: ENTIRE(6) INERT(5) INTER(5) INTERN(6) INTERNE(7) INTERNEE(8) INTERTIE(8) NETTIER(7) NITER(5) NITERIE(7) NITRE(5) NITRITE(7) NITTIER(7) REINTER(7) RENITENT(8) RENTIER(7) RETINE(6) RETINENE(8) RETINITE(8) RETINT(6) TEENIER(7) TENTIER(7) TERRINE(7) TINIER(6) TINNER(6) TINNIER(7) TINTER(6) TRIENE(6) TRINE(5) EINST forms 58 words for 469 points: EINSTEIN(8) EINSTEINS(9) ENTITIES(8) INSENTIENT(10) INSET(5) INSETS(6) INSISTENT(9) INTENSE(7) INTENSENESS(11) INTENSENESSES(13) INTENSEST(9) INTENSITIES(11) INTENTNESS(10) INTENTNESSES(12) INTENTS(7) INTESTINE(9) INTESTINES(10) INTINES(7) NEIST(5) NETTIEST(8) NINETEENS(9) NINETIES(8) NITES(5) NITTIEST(8) SENITI(6) SENNIT(6) SENNITS(7) SENSITISE(9) SENSITISES(10) SENTI(5) SENTIENT(8) SENTIENTS(9) SESTINE(7) SESTINES(8) SIENITE(7) SIENITES(8) SITTEN(6) STEIN(5) STEINS(6) TEENIEST(8) TEENSIEST(9) TEENTSIEST(10) TENNIES(7) TENNIS(6) TENNISES(8) TENNIST(7) TENNISTS(8) TENSITIES(9) TENTIEST(8) TESTINESS(9) TESTINESSES(11) TINES(5) TINIEST(7) TININESS(8) TININESSES(10) TINNIEST(8) TINNINESS(9) TINNINESSES(11) EIRST forms 38 words for 262 points: EERIEST(7) IRITISES(8) RESIST(6) RESISTER(8) RESISTERS(9) RESISTS(7) RESITE(6) RESITES(7) RETIES(6) RETIREES(8) RETIRERS(8) RETIRES(7) RETRIES(7) RITES(5) RITTERS(7) SISTER(6) SISTERS(7) SITTER(6) SITTERS(7) STIRRER(7) STIRRERS(8) STRETTI(7) TERRIERS(8) TERRIES(7) TERRITS(7) TESTIER(7) TIERS(5) TIRES(5) TITERS(6) TITRES(6) TITTERERS(9) TITTERS(7) TRESSIER(8) TRESSIEST(9) TRIERS(6) TRIES(5) TRISTE(6) TRITEST(7) ENRST forms 35 words for 246 points: ENTERERS(8) ENTERS(6) ENTREES(7) NERTS(5) NESTER(6) NESTERS(7) NETTERS(7) REENTERS(8) RENEST(6) RENESTS(7) RENNETS(7) RENTERS(7) RENTES(6) RENTS(5) RESENT(6) RESENTS(7) RETENES(7) SERENEST(8) STERN(5) STERNER(7) STERNEST(8) STERNNESS(9) STERNNESSES(11) STERNS(6) TEENERS(7) TENNERS(7) TENSER(6) TENTERS(7) TERNES(6) TERNS(5) TERREENS(8) TERRENES(8) TERSENESS(9) TERSENESSES(11) TREENS(6) AEIN forms 2 words for 11 points: INANE(5) NANNIE(6) AEIR forms 4 words for 22 points: AERIE(5) AERIER(6) AIRER(5) AIRIER(6) AEIS forms 2 words for 13 points: EASIES(6) SASSIES(7) AEIT forms 1 word for 6 points: TATTIE(6) AENR forms 9 words for 40 points: ANEAR(5) ARENA(5) EARN(1) EARNER(6) NEAR(1) NEARER(6) RANEE(5) REEARN(6) RERAN(5) AENS forms 9 words for 46 points: ANES(1) ANSAE(5) SANE(1) SANENESS(8) SANENESSES(10) SANES(5) SENNA(5) SENNAS(6) SENSA(5) AENT forms 13 words for 63 points: ANENT(5) ANTAE(5) ANTE(1) ANTENNA(7) ANTENNAE(8) ATTENT(6) EATEN(5) ENATE(5) ETNA(1) NEAT(1) NEATEN(6) TANNATE(7) TENANT(6) AERS forms 26 words for 121 points: AREAS(5) ARES(1) ARREARS(7) ARSE(1) ARSES(5) EARS(1) ERAS(1) ERASE(5) ERASER(6) ERASERS(7) ERASES(6) RARES(5) RASE(1) RASER(5) RASERS(6) RASES(5) REARERS(7) REARS(5) REASSESS(8) REASSESSES(10) SAREE(5) SAREES(6) SEAR(1) SEARER(6) SEARS(5) SERA(1) AERT forms 24 words for 127 points: AERATE(6) ARETE(5) EATER(5) ERRATA(6) RATE(1) RATER(5) RATTER(6) REATA(5) RETEAR(6) RETREAT(7) RETREATER(9) TARE(1) TARRE(5) TARTER(6) TARTRATE(8) TATER(5) TATTER(6) TEAR(1) TEARER(6) TERRA(5) TERRAE(6) TETRA(5) TREAT(5) TREATER(7) AEST forms 35 words for 164 points: ASSET(5) ASSETS(6) ATES(1) ATTEST(6) ATTESTS(7) EAST(1) EASTS(5) EATS(1) ESTATE(6) ESTATES(7) ETAS(1) SATE(1) SATES(5) SEAT(1) SEATS(5) SETA(1) SETAE(5) STASES(6) STATE(5) STATES(6) TASSE(5) TASSES(6) TASSET(6) TASSETS(7) TASTE(5) TASTES(6) TATES(5) TEAS(1) TEASE(5) TEASES(6) TEATS(5) TESTA(5) TESTAE(6) TESTATE(7) TESTATES(8) EINR forms 4 words for 17 points: INNER(5) REIN(1) RENIN(5) RENNIN(6) EINS forms 10 words for 53 points: NINES(5) NINNIES(7) NISEI(5) NISEIS(6) SEINE(5) SEINES(6) SEISIN(6) SEISINS(7) SINE(1) SINES(5) EINT forms 6 words for 28 points: INTENT(6) INTINE(6) NINETEEN(8) NITE(1) TENTIE(6) TINE(1) EIRS forms 20 words for 101 points: IRES(1) IRISES(6) REIS(1) RERISE(6) RERISES(7) RISE(1) RISER(5) RISERS(6) RISES(5) SEISER(6) SEISERS(7) SERIES(6) SERRIES(7) SIRE(1) SIREE(5) SIREES(6) SIRES(5) SIRREE(6) SIRREES(7) SISSIER(7) EIRT forms 17 words for 87 points: RETIE(5) RETIRE(6) RETIREE(7) RETIRER(7) RITE(1) RITTER(6) TERRIER(7) TERRIT(6) TIER(1) TIRE(1) TITER(5) TITRE(5) TITTER(6) TITTERER(8) TRIER(5) TRITE(5) TRITER(6) EIST forms 8 words for 41 points: SISSIEST(8) SITE(1) SITES(5) STIES(5) TESTIEST(8) TESTIS(6) TIES(1) TITTIES(7) ENRS forms 12 words for 80 points: ERNES(5) ERNS(1) RESEEN(6) SERENE(6) SERENENESS(10) SERENENESSES(12) SERENER(7) SERENES(7) SNEER(5) SNEERER(7) SNEERERS(8) SNEERS(6) ENRT forms 19 words for 104 points: ENTER(5) ENTERER(7) ENTREE(6) ETERNE(6) NETTER(6) REENTER(7) RENNET(6) RENT(1) RENTE(5) RENTER(6) RETENE(6) TEENER(6) TENNER(6) TENTER(6) TERN(1) TERNE(5) TERREEN(7) TERRENE(7) TREEN(5) ENST forms 18 words for 94 points: ENTENTES(8) NEST(1) NESTS(5) NETS(1) NETTS(5) SENNET(6) SENNETS(7) SENT(1) SENTE(5) TEENS(5) TENETS(6) TENS(1) TENSE(5) TENSENESS(9) TENSENESSES(11) TENSES(6) TENSEST(7) TENTS(5) ERST forms 44 words for 266 points: ERST(1) ESTER(5) ESTERS(6) REEST(5) REESTS(6) RESET(5) RESETS(6) RESETTER(8) RESETTERS(9) REST(1) RESTER(6) RESTERS(7) RESTRESS(8) RESTRESSES(10) RESTS(5) RETEST(6) RETESTS(7) RETS(1) SEREST(6) SETTER(6) SETTERS(7) STEER(5) STEERER(7) STEERERS(8) STEERS(6) STERE(5) STERES(6) STREET(6) STREETS(7) STRESS(6) STRESSES(8) STRETTE(7) TEETERS(7) TERRETS(7) TERSE(5) TERSER(6) TERSEST(7) TESTER(6) TESTERS(7) TETTERS(7) TREES(5) TRESS(5) TRESSES(7) TRETS(5) AER forms 7 words for 25 points: AREA(1) AREAE(5) ARREAR(6) RARE(1) RARER(5) REAR(1) REARER(6) AES forms 8 words for 33 points: ASEA(1) ASSES(5) ASSESS(6) ASSESSES(8) EASE(1) EASES(5) SASSES(6) SEAS(1) AET forms 2 words for 2 points: TATE(1) TEAT(1) EIN forms 1 word for 1 point: NINE(1) EIR forms 2 words for 11 points: EERIE(5) EERIER(6) EIS forms 7 words for 35 points: ISSEI(5) ISSEIS(6) SEIS(1) SEISE(5) SEISES(6) SISES(5) SISSIES(7) EIT forms 1 word for 6 points: TITTIE(6) ENR forms 1 word for 1 point: ERNE(1) ENS forms 6 words for 20 points: NESS(1) NESSES(6) SEEN(1) SENE(1) SENSE(5) SENSES(6) ENT forms 5 words for 15 points: ENTENTE(7) NETT(1) TEEN(1) TENET(5) TENT(1) ERS forms 13 words for 52 points: ERRS(1) ERSES(5) REES(1) RESEE(5) RESEES(6) SEER(1) SEERESS(7) SEERESSES(9) SEERS(5) SERE(1) SERER(5) SERES(5) SERS(1) ERT forms 7 words for 27 points: RETE(1) TEETER(6) TERETE(6) TERRET(6) TETTER(6) TREE(1) TRET(1) EST forms 18 words for 79 points: SESTET(6) SESTETS(7) SETS(1) SETT(1) SETTEE(6) SETTEES(7) SETTS(5) STET(1) STETS(5) TEES(1) TEST(1) TESTEE(6) TESTEES(7) TESTES(6) TESTS(5) TETS(1) TSETSE(6) TSETSES(7) EN forms 1 word for 1 point: NENE(1) ES forms 3 words for 7 points: ESES(1) ESSES(5) SEES(1)
Here are pictures for the highest-scoring honeycombs, with and without an S: