Intro
Every now and then the weekend puzzle is particularly amenable to partial solution by use of simple Linux commands. I suspected such was the case for this week’s, and I was right.
The challenge for this week
Take a seven letter word of one syllable, add the consecutive letters “it” somewhere in the middle to create a nine letter word of four syllables.
The Linux command-line method of solution
On a CentOS system there is a file with words, lots of words. It’s /usr/share/dict/linux.words:
$ cd /usr/share/dict; wc linux.words
479829 479829 4953699 linux.words |
So, 479829 words! A lot of them are junk words however, but it has the real ones in there too. This file comes from the RPM package words-3.0-17.el6.noarch.
So here’s a sort of stream-of-consciousness of a Unix person solving the puzzle without doing too much work or too much thinking:
How many seven-letter words are there? First what’s an expression that can answer that? I think this is it but let’s check:
$ egrep '^[a‐z]{7}$' linux.words|more
aaronic aarrghh abacate abacaxi abacist abactor abaculi abaddon abadejo abaised abaiser abaisse abalone abandon abandum abasers abashed abashes abasias abasing abatage abaters abating abators abattis abattue abature abaxial ... |
OK, that egrep expresison is right. So the seven-letter word count is then:
$ egrep '^[a‐z]{7}$' linux.words|wc ‐l
40230 |
That’s a lot – too many to eyeball. OK, so how many nine-letter words are there?
$ egrep '^[a‐z]{9}$' linux.words|wc ‐l
50748 |
Wow, even more.
OK, we have an idea, based not on what may be the best approach, but based on which Linux commands we know inside and out. The idea is to start from the nine-letter words which contain “it”, remove the “it” and then match the resulting seven-letter character strings against our dictionary to see which are actually words. We know how to do that. The hope is the resulting list will be small enough we can review by hand.
How many nine-letter words contain the consecutive characters “it”?
$ egrep '^[a‐z]{9}$' linux.words|grep it|wc ‐l
3245 |
They look like this:
abilities abnormity aboiteaus aboiteaux abolition abrazitic absurdity academite acanthite accipiter acclivity accredits accubitum accubitus acetosity acidities acinacity aconitine aconitums acquisita ... |
so it would take forever to go through. If we had a dictionary with the syllable count we coul really narrow it down. I think I’ve seen that, but I’d have to dig that up. We introduce the sed operator to remove the “it” from these words:
$ egrep '^[a‐z]{9}$' linux.words|grep it|sed 's/it//'|more
abilies abnormy aboeaus aboeaux abolion abrazic absurdy academe acanthe acciper acclivy accreds accubum accubus acetosy acidies acinacy aconine aconums acquisa ... |
There are more efficient ways to loop through these results using xargs, but I’m old school and have memorized this older construct which I use:
$ egrep '^[a‐z]{9}$' linux.words|grep it|sed 's/it//'|while read line; do
> grep $line linux.words >> /tmp/lw
> done
We look at the resulting file and found we made a little goof – we didn’t limit the resulting matches to seven characters:
$ more /tmp/lw
academe academes Pleuracanthea vacanthearted vacantheartedness aconine japaconine pseudaconine adderspit affidavit affidavits affidavy preaffidavit divagating extravagating indagating propagating self-propagating ... |
But that’s easily corrected:
$ cd /tmp; egrep '^[a‐z]{7}$' lw > lw2
$ wc -l lw2
376 lw2 |
Now that’s a number we can review by hand. Very few of these have only one syllable:
$ more lw2
academe aconine alumine alveole ammonic barbary barbone basting bauxite berline bethank boraces bullion capella carbone carmele carmine cascade catline cavated celeste ceruses chloric chondre chromes cations claries cockney coenobe compose ... |
I quickly reviewed the list and the answer popped out, somewhere towards the end – you can’t miss it.
Friday update – the solution
The 7-letter word that pops out at you? Reigned, which you immediately see becomes reignited – nine letters and four syllables!
Want to do this on your Raspberry Pi?
The dictionary file there is /usr/share/dictd/wn.index, but you probably don’t have it by default so you’ll need to install a few packages to get it which is simple enough. This post about Words with Friends explains the packages I used to provide that dictionary. Aside from the location of the dictionary, and that it contains fewer(?) words, everything else should be the same.
Conclusion
We have solved this week’s NPR puzzle without any complex programming just by using some simple Linux commands.
References and related
This link is nice because it has a transcription of the puzzle so you don’t have to waste time listening to the whole six-minute segment.
Another NPR puzzle we solved in a similar way.