# Words by the Numbers 7, Exercise 1 def flesch_ease(words, sentences, syllables): return 206.835 - 1.015 * (words / sentences) - 84.6 * (syllables / words) # The worked example: 100 words, 5 sentences, 140 syllables print(f"100 words, 5 sentences, 140 syllables: ease {flesch_ease(100, 5, 140):.1f}") # A grid: how the score moves with sentence length and word length print() print("ease score " + "".join(f"{spw:>10}" for spw in (1.2, 1.5, 1.8)) + " (syllables per word)") for wps in (10, 20, 30): row = [206.835 - 1.015 * wps - 84.6 * spw for spw in (1.2, 1.5, 1.8)] print(f"{wps:2d} words/sent " + "".join(f"{r:10.1f}" for r in row)) # Solve for the word length that gives ease 60 at 15 words per sentence target, wps = 60, 15 spw = (206.835 - 1.015 * wps - target) / 84.6 print() print(f"for ease {target} at {wps} words per sentence you need {spw:.3f} syllables per word") print(f"check: {206.835 - 1.015 * wps - 84.6 * spw:.1f}") # One more syllable per 10 words costs how many points? print(f"adding 0.1 syllables per word changes the score by {-84.6 * 0.1:.2f}") print(f"adding 1 word to every sentence of 15 changes it by {-1.015:.3f}") # Output when run (Python 3.14; texts from the Project Gutenberg plain-text files): # 100 words, 5 sentences, 140 syllables: ease 68.1 # # ease score 1.2 1.5 1.8 (syllables per word) # 10 words/sent 95.2 69.8 44.4 # 20 words/sent 85.0 59.6 34.3 # 30 words/sent 74.9 49.5 24.1 # # for ease 60 at 15 words per sentence you need 1.556 syllables per word # check: 60.0 # adding 0.1 syllables per word changes the score by -8.46 # adding 1 word to every sentence of 15 changes it by -1.015