I fear that your dictionary must be more extensive than mine! However, here are some answers that seem to work: >! 1. stop (+deter = protested, + mien = nepotism) >! 2. noon (+stop = pontoons, + gild = noodling (based on hint from OP. I originally discounted this one because I couldn't find an answer for 3.)) >! 3. ??? >! I then worked backwards a bit from 8 to get to 4 >! 8. stir (+stop=protists, + said=diarists, +forte=retrofits) >! 7. lace (+stir=recitals, +rots=sectoral) (it could have been "at" or "lace", but lace worked better at 6) >! 6. sips (+mace=escapism,+lace=specials) >! 5. deed (+sips=despises,+name=demeaned (tricky one)) >! 4. trap (+lane=parental,+deed=departed) >! 14. tide (+slam=neediest,+tide=medalist) >! 9. seats (+edit=stateside,+tide=steadiest) >! 13. sear (+tide=readiest,+lung=granules,+tapes=separates,+grab=barrages) >! 12. ruse (+sear=erasures) (I reject tide since it's already at 14) >! 11. seam (+tide=mediates, +ruse=measures,+sort=maestros) >! 10. rut (+seats=statures, +seam=matures) (could also have been tang (magnates,stagnates)) >! 15. roam (+tide=mediator, +lain=manorial) >! 16. need (+roam=demeanor) (there were several possibilities here so I needed to explore a bit to find a reasonable bridge to "taro") >! 17. deep (+need=deepened, +taro=operated) >! 18. ??? A guess would be decor (+tale=relocated, +deep=proceeded) So still two gaps... Methods: I have a short python program. The first part does a subtraction of a small word from a big word. It works recursively to produce a list of possible results. e.g. "lelabc" minus "lab" = ["elc","lec"]. "lelabc" minus "lba" = []. Subtract("lelabc","lab") Out: ['elc', 'lec'] Then the second part takes an input of a small word. It finds all longer words in my dictionary and does a reverse subtraction. It checks whether those reverse subtractions (if any) are in my dictionary. If they are, add them to a set. Return the set. E.g.: findAll("lane") lane iv veinal lane id denial lane it entail lane iv venial lane reg general lane sit entails lane rte eternal lane ret eternal lane deb enabled lane reb enabler lane trap parental lane deem enameled lane muon noumenal lane tarp prenatal lane tiro oriental Out: 'deb','deem','id','it','iv','muon','reb','reg','ret','rte','sit','tarp','tiro','trap'} findAll("evince") Out: set() Finally, I take two small words and take the intersection of the small words in the set. I don't know if this is cheating, but the computer is definitely better at finding intersections of two sets than I am.