Elementology
Wednesday, December 28, 2011
Question: What do the words bamboo, crunchy, finance, genius, and tenacious have in common? I’ll give you a hint: its the same thing they have in common with the words who, what, when, where, and how?
Stumped? Well, it’s not that these are all English words.
Answer: All of these words can be spelled using elements from the periodic table!
I was recently inspired by the Periodic GeNiUS T-shirt from ThinkGeek and a website that can “make any words out of elements in the periodic table”. I thought it would be fun to use Factor to see how many other words can be spelled using the symbols for chemical elements.
First, we need a list of elements:
: elements ( -- assoc )
H{
{ "H" "Hydrogen" }
{ "He" "Helium" }
{ "Li" "Lithium" }
{ "Be" "Beryllium" }
{ "B" "Boron" }
{ "C" "Carbon" }
...
{ "Uut" "Ununtrium" }
{ "Uuq" "Ununquadium" }
{ "Uup" "Ununpentium" }
{ "Uuh" "Ununhexium" }
{ "Uus" "Ununseptium" }
{ "Uuo" "Ununoctium" }
} [ [ >lower ] dip ] assoc-map ;
Next, a word that checks if a particular substring is the symbol of an element:
: element? ( from to word -- ? )
2dup length > [ 3drop f ] [ subseq elements key? ] if ;
We know that symbols are only ever one, two, or three characters. A word is considered “periodic” if it can be composed of any number of (possibly repeating) element symbols. We build a recursive solution that starts with the first character and continues as long as element symbols are a match or until the end of the word is reached:
: (periodic?) ( word from -- ? )
{
[ swap length = ]
[
{ 1 2 3 } [
dupd + [ pick element? ] keep
'[ dup _ (periodic?) ] [ f ] if
] with any? nip
]
} 2|| ;
: periodic? ( word -- ? )
>lower 0 (periodic?) ;
It’s easy to get a list of dictionary words from most Unix systems:
: dict-words ( -- words )
"/usr/share/dict/words" ascii file-lines ;
And then a list of all “periodic words”:
: periodic-words ( -- words )
dict-words [ periodic? ] filter ;
So, how many words are “periodic words”? About 13.7% of them.
IN: scratchpad dict-words length .
235886
IN: scratchpad periodic-words length .
32407
The code for this is on my GitHub.