g | x | w | all
Bytes Lang Time Link
051Vim250717T221525ZDLosc
174Google Sheets250711T065418Zdoubleun
053Vyxal m250716T160038Zpacman25
050Vyxal 3250716T184225ZThemooni
084Python 3250714T040353Zcd_woomy
167Python250714T211404Zcorvus_1
099JavaScript V8250711T065253ZArnauld
106Ruby250712T005826ZLevel Ri
098Python250711T121559ZAlbert.L
045Japt250711T140856ZShaggy
020Wolfram Language Mathematica250711T150610ZGreg Mar
081Charcoal250711T083130ZNeil
05205AB1E250711T082036ZKevin Cr
426Vyxal 3250711T042407Zlyxal

Vim, 63 51 bytes

-12 bytes (and -2 dependencies) thanks to Aaroneous Miller

:h.
153YZZp:%s/\s\+/\r/g
:sor iu|v/^\w\{3,\}$/d
d2k

Try it online!

Explanation

Uses a variant of this technique for retrieving the alphabet from the Vim help file.

:h.

Open the built-in help file to the section on the . command.

153Y

Copy the next 153 lines.

ZZp

Exit the help file and paste.

:%s/\s\+/\r/g

Replace all runs of whitespace with newlines.

:sor iu

Apply the sort command to all lines, case-insensitive, and uniquify the results.

|v/^\w\{3,\}$/d'

Also apply the vglobal command to all lines: match all lines that do not match the regex ^\w{3,}$ (i.e. that do not consist of 3 or more word characters), and delete them.

This results in 203 words and leaves the cursor on the last line, so:

d2k

Delete the last line and the two lines above it.

Google Sheets, 174 bytes

=sortn(let(c,mid("bcdfghjklmnpqrstvwxyz",row(1:21),1),t,map(tocol(torow(c&split("a0e0i0o0u",0))&c),lambda(w,googletranslate(w))),filter(t,regexmatch(t,"^[a-w]{4,}$"))),200,2)

Generates 2205 three-letter gibberish words like bab, bac, bad...zux, zuy, zuz, translates them from "any language" to English, weeds out translations that have less than four letters, or contain uppercase, whitespace, punctuation or [xyz], and finally takes the first 200 uniques. Requires an English spreadsheet locale.

The first ten words in the result are access, accident, adult, afraid, again, against, alien, alone, also, although and the last ten are little, live, load, look, loop, magic, make, male, market, matter. All 200 words appear in the Wordnik list.

Ungolfed:

=sortn(
  let(
    letters, char(row(97:122)),
    vowels, split("a0e0i0o0u", 0),
    consonants, filter(letters, isna(match(letters, vowels,))),
    words, tocol(torow(consonants & vowels) & consonants),
    translated, map(words, lambda(word, googletranslate(word))),
    filter(translated, regexmatch(translated, "^[a-w]{4,}$"))
  ),
  200, 2
)

Alternative method, using a Cartesian product of Arnauld's prefixes and suffixes in revision 9 (108 bytes):

=sort(mid(" babebibobucodofafegagihahojulimamemomupepuraresoa",2*row(1:25),2)&split("d0g0n0s0t0ds0gs0ts",0))

Outputs an 8 x 25 array of (more boring) short words like bad, bads, bag, bags, ban, bas, bat, bats. This latter formula is non-competing because Cartesian product is easy and the real work was to find this close to optimal list of prefixes and suffixes.

Vyxal m, 53 bytes (invalid)

₀dʀ₀₀v*J₆~₃↵J₍∆ċ∆o⌈fU:¤vøP⌈fꜝ‛ys‛↲∷vV‛xs«F8«vVJ‛↔⁰¦ḢJ

Try it Online!

I figured since the comment got some upvotes, I would explain it and post an answer with the new method. It is non-competing due to several words not being in the wordnik list, as wordnik is missing ordinals past quintillionth(s) but has cardinals up to vigintillion(s). If it was 250,000 words this would likely be a valid answer. The m flag makes implicit ranges start at 0 and end at n inclusive.

₀dʀ₀₀v*J₆~₃↵J₍∆ċ∆o⌈fU:¤vøP⌈fꜝ‛ys‛↲∷vV‛xs«F8«vVJ‛↔⁰¦ḢJ­⁡​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏⁠‎⁡⁠⁣‏⁠‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁣⁡‏⁠‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁣⁤‏⁠⁠⁠⁠‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁤⁢‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁢⁡⁡‏⁠‎⁡⁠⁢⁡⁢‏‏​⁡⁠⁡‌⁣⁢​‎‎⁡⁠⁢⁡⁣‏⁠‎⁡⁠⁢⁡⁤‏⁠‎⁡⁠⁢⁢⁡‏‏​⁡⁠⁡‌⁣⁣​‎‎⁡⁠⁢⁢⁢‏⁠‎⁡⁠⁢⁢⁣‏⁠‎⁡⁠⁢⁢⁤‏⁠‎⁡⁠⁢⁣⁡‏⁠‎⁡⁠⁢⁣⁢‏‏​⁡⁠⁡‌⁣⁤​‎‎⁡⁠⁢⁣⁣‏⁠‎⁡⁠⁢⁣⁤‏⁠‎⁡⁠⁢⁤⁡‏‏​⁡⁠⁡‌⁤⁡​‎‎⁡⁠⁢⁤⁢‏⁠‎⁡⁠⁢⁤⁣‏⁠‎⁡⁠⁢⁤⁤‏⁠⁠‎⁡⁠⁣⁡⁤‏⁠‎⁡⁠⁣⁢⁡‏‏​⁡⁠⁡‌⁤⁢​‎‎⁡⁠⁣⁡⁡‏⁠‎⁡⁠⁣⁡⁢‏⁠‎⁡⁠⁣⁡⁣‏‏​⁡⁠⁡‌⁤⁣​‎‎⁡⁠⁣⁢⁢‏⁠‎⁡⁠⁣⁢⁣‏⁠‎⁡⁠⁣⁢⁤‏⁠‎⁡⁠⁣⁤⁡‏⁠‎⁡⁠⁣⁤⁢‏‏​⁡⁠⁡‌⁤⁤​‎‎⁡⁠⁣⁣⁡‏⁠‎⁡⁠⁣⁣⁢‏⁠‎⁡⁠⁣⁣⁣‏⁠‎⁡⁠⁣⁣⁤‏‏​⁡⁠⁡‌⁢⁡⁡​‎‎⁡⁠⁣⁤⁣‏‏​⁡⁠⁡‌⁢⁡⁢​‎‎⁡⁠⁣⁤⁤‏⁠‎⁡⁠⁤⁡⁡‏⁠‎⁡⁠⁤⁡⁢‏‏​⁡⁠⁡‌⁢⁡⁣​‎‎⁡⁠⁤⁡⁣‏⁠‎⁡⁠⁤⁡⁤‏‏​⁡⁠⁡‌⁢⁡⁤​‎‎⁡⁠⁤⁢⁡‏‏​⁡⁠⁡‌­
₀dʀ                                                    # ‎⁡range 0-20
   ₀₀v*                                                # ‎⁢multiples of 10 up to 100
       J                                               # ‎⁣join as one list
        ₆~₃                                            # ‎⁤all multiples of 3 less than or equal to 64
           ↵                                           # ‎⁢⁡10^n for each of those
       J                                               # ‎⁢⁢join to list
             ₍                                         # ‎⁢⁣parallel apply wrap
              ∆ċ                                       # ‎⁢⁤number to cardinal (one, two, three...)
                ∆o                                     # ‎⁣⁡number to ordinal (first, second, third...)
                  ⌈fU                                  # ‎⁣⁢split on spaces and get unique values to remove leading "one"s
                     :¤vøP                             # ‎⁣⁣duplicate that list and pluralize everything with empty string prefix (one -> " ones")
                          ⌈fꜝ                          # ‎⁣⁤split on spaces and remove empty strings
                             ‛ys   vV                  # ‎⁤⁡replace 'ys' with
                                ‛↲∷                    # ‎⁤⁢compressed string 'ies'
                                     ‛xs    vV         # ‎⁤⁣replace 'xs' with
                                        «F8«           # ‎⁤⁤compressed string `xes`
                                              J        # ‎⁢⁡⁡join it to get 196 different ordinals, cardinals, and their plurals. (
                                               ‛↔⁰     # ‎⁢⁡⁢compressed string "hands"
                                                  ¦Ḣ   # ‎⁢⁡⁣headless prefixes ["ha","han","hand","hands"]
                                                    J  # ‎⁢⁡⁤join that for 200
💎

Created with the help of Luminespire.

Vyxal 3, 50 bytes

"ʎIMDξB‹2Ġ∻Þr=⌊W“ka⊢ƛᏐ$⏚kv⊢mi&w"dgts":ƵX“&'n&fX¨f“

Vyxal 3 port of Arnaud's answer, golfed.

Vyxal It Online!

"ʎIMDξB‹2Ġ∻Þr=⌊W“ka⊢ƛᏐ$⏚kv⊢mi&w"dgts":ƵX“&'n&fX¨f“­⁡​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏⁠‎⁡⁠⁣‏⁠‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏⁠‎⁡⁠⁣⁡‏⁠‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏⁠‎⁡⁠⁤⁡‏⁠‎⁡⁠⁤⁢‏⁠‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏⁠‎⁡⁠⁢⁡⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢⁡⁢‏⁠‎⁡⁠⁢⁡⁣‏⁠‎⁡⁠⁢⁡⁤‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁢⁡‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁢⁤⁢‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁢⁣⁤‏⁠‎⁡⁠⁢⁤⁡‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁢⁢‏⁠‎⁡⁠⁢⁢⁣‏⁠‎⁡⁠⁢⁢⁤‏⁠‎⁡⁠⁢⁣⁡‏⁠‎⁡⁠⁢⁣⁢‏⁠‎⁡⁠⁢⁣⁣‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁢⁢⁢‏⁠‎⁡⁠⁢⁢⁣‏⁠‎⁡⁠⁢⁢⁤‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁢⁣⁡‏⁠‎⁡⁠⁢⁣⁢‏⁠‎⁡⁠⁢⁣⁣‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁢⁤⁣‏‏​⁡⁠⁡‌⁣⁢​‎‎⁡⁠⁣⁤⁣‏⁠⁠‏​⁡⁠⁡‌⁣⁣​‎‎⁡⁠⁢⁤⁤‏⁠‎⁡⁠⁣⁡⁡‏⁠‎⁡⁠⁣⁡⁢‏⁠‎⁡⁠⁣⁡⁣‏⁠‎⁡⁠⁣⁡⁤‏⁠‎⁡⁠⁣⁢⁡‏⁠‎⁡⁠⁣⁢⁢‏⁠‎⁡⁠⁣⁢⁣‏⁠‎⁡⁠⁣⁢⁤‏⁠‎⁡⁠⁣⁣⁡‏⁠‎⁡⁠⁣⁣⁢‏⁠‎⁡⁠⁣⁣⁣‏⁠‎⁡⁠⁣⁣⁤‏⁠‎⁡⁠⁣⁤⁡‏⁠‎⁡⁠⁣⁤⁢‏⁠⁠‏​⁡⁠⁡‌⁣⁤​‎‎⁡⁠⁢⁤⁤‏⁠‎⁡⁠⁣⁡⁡‏⁠‎⁡⁠⁣⁡⁢‏⁠‎⁡⁠⁣⁡⁣‏⁠‎⁡⁠⁣⁡⁤‏⁠‎⁡⁠⁣⁢⁡‏⁠‎⁡⁠⁣⁢⁢‏‏​⁡⁠⁡‌⁤⁡​‎⁠‎⁡⁠⁣⁢⁣‏⁠‎⁡⁠⁣⁢⁤‏⁠‎⁡⁠⁣⁣⁡‏‏​⁡⁠⁡‌⁤⁢​‎‎⁡⁠⁣⁣⁢‏‏​⁡⁠⁡‌⁤⁣​‎‎⁡⁠⁣⁣⁣‏⁠‎⁡⁠⁣⁣⁤‏⁠‎⁡⁠⁣⁤⁡‏‏​⁡⁠⁡‌⁤⁤​‎‎⁡⁠⁣⁤⁢‏‏​⁡⁠⁡‌⁢⁡⁡​‎‎⁡⁠⁣⁤⁤‏⁠‎⁡⁠⁤⁡⁡‏⁠‎⁡⁠⁤⁡⁢‏‏​⁡⁠⁡‌­
"ʎIMDξB‹2Ġ∻Þr=⌊W“                                   # ‎⁡compressed integer 9524838950348700701773904696055446
                 ka⊢                                # ‎⁢to base lowercase alphabet
                                                    # ‎⁢yields "bbfbbbcghfgjdmrmlmhtwptpm"
                    ƛ                               # ‎⁣map over each char:
                             &                      # ‎⁤append to that char...
                           mi                       # ‎⁢⁡the vowel indexed by the current char's position in the string
                     Ꮠ$⏚kv⊢                         # ‎⁢⁢vowel generator, yields "oaaeiu"
                     Ꮠ$⏚                            # ‎⁢⁣compressed integer 9414
                        kv⊢                         # ‎⁢⁤to base lowercase vowels
                              w                     # ‎⁣⁡wrap in a list for next part
                                              X     # ‎⁣⁢cartesian product of prefixes and...
                               "dgts":ƵX“&'n&f      # ‎⁣⁣suffixes list, yields ["d", "g", "t", "s", "ds", "gs", "ts", "n"]
                               "dgts":              # ‎⁣⁤literal string "dgts", duplicated
                                      ƵX“           # ‎⁤⁡pop tail of one copy and append it to each letter
                                                    # ‎⁤⁡yields ["ds", "gs", "ts"]
                                         &          # ‎⁤⁢append to the original copy, as a list of characters
                                          'n&       # ‎⁤⁣append a single "n"
                                             f      # ‎⁤⁤flatten the whole thing
                                               ¨f“  # ‎⁢⁡⁡flatten each string generated by the cartesian product and join it for display
💎

Created with the help of Luminespire.

<script type="vyxal3">
"ʎIMDξB‹2Ġ∻Þr=⌊W“ka⊢ƛᏐ$⏚kv⊢mi&w"dgts":ƵX“&'n&fX¨f“
</script>
<script>
    args=[]
</script>
<script src="https://themoonisacheese.github.io/snippeterpreter/snippet.js" type="module"/>

Python 3, 89 84 bytes

-4 Thanks to kg583

-1 Thanks to Neil

84 Byte

l=license;l.MAXLINES=999;print(sorted(filter(str.isalpha,{*str(l).split()}))[-200:])

89 Byte

l=license;l.MAXLINES=999;print(sorted(filter(str.isalpha,set((repr(l)).split())))[-200:])

No TIO link since this solution does not work there :(

Instead of constructing the words from scratch, I wanted to use existing text builtin to the language, and found the license text to be the adequate for this purpose. There are three main components of this solution.

Firstly, the license text is stored in a file, and python does not read in this file by default. To get this file read, the __setup method of the license._Printer object must be called. Calling license._Printer__setup() ourselves is very costly in terms of bytes, but lucky for us, the __repr__ function of license actually calls this setup function.

Secondly, MAXLINES attribute of license must be set to a number higher than the number of lines in the license, otherwise repr will return the string 'Type license() to see the full license text'. The motivation for this behavior of the license builtin is beyond me, but I think it has something to do with how the license will display by pages in the interactive session.

Finally, with the actual text in hand, we need to perform some manipulation to filter down to nonduplicate, valid words.

The output list is:

['origin', 'original', 'other', 'others', 'otherwise', 'out', 'outside', 'outstanding', 'own', 'owner', 'ownership', 'page', 'part', 'patent', 'percent', 'perform', 'permission', 'permissions', 'permit', 'permitted', 'persistent', 'person', 'persons', 'pertain', 'pertaining', 'plainly', 'platform', 'portions', 'possibility', 'possible', 'preferred', 'prepare', 'prepared', 'prepares', 'previously', 'principal', 'prior', 'product', 'products', 'program', 'programs', 'prominent', 'promote', 'property', 'protect', 'provide', 'provided', 'provides', 'proxy', 'publicity', 'publicly', 'purpose', 'purposes', 'readable', 'reason', 'reasonable', 'received', 'recipients', 'redistributing', 'redistribution', 'regard', 'regarding', 'related', 'relationship', 'released', 'releases', 'remain', 'remains', 'reproduce', 'reproducing', 'require', 'required', 'requirements', 'respect', 'respects', 'responsible', 'restrictions', 'result', 'resulting', 'retain', 'retained', 'rights', 'risks', 'royalty', 'run', 'running', 'same', 'see', 'sell', 'sense', 'sent', 'separable', 'separate', 'server', 'service', 'services', 'several', 'shall', 'software', 'sole', 'solely', 'source', 'specific', 'specifically', 'specified', 'sponsoring', 'state', 'stated', 'statement', 'stating', 'subject', 'submit', 'submitted', 'subsequently', 'substantial', 'substitute', 'successor', 'such', 'suggests', 'summarizes', 'summary', 'supersede', 'supporting', 'systems', 'table', 'team', 'technologies', 'terminate', 'terms', 'text', 'than', 'that', 'the', 'their', 'then', 'thereof', 'these', 'they', 'third', 'this', 'those', 'through', 'thru', 'to', 'together', 'told', 'tools', 'tort', 'tracking', 'trade', 'trademark', 'trademarks', 'transfer', 'transformation', 'translation', 'under', 'union', 'unlawful', 'unless', 'unlike', 'upon', 'use', 'used', 'users', 'uses', 'using', 'van', 'various', 'venture', 'verbatim', 'version', 'versions', 'volunteers', 'wants', 'warranties', 'warranty', 'was', 'way', 'web', 'website', 'where', 'wherever', 'whether', 'which', 'who', 'whom', 'will', 'with', 'within', 'without', 'work', 'worked', 'works', 'would', 'writing', 'written', 'wrote', 'yes', 'you', 'your']

On TIO, we get the output ['See']. I'm assuming that the attempt to read in the license file during the call to __setup results in an OSError which then defaults to returning the string, 'See https://www.python.org/psf/license/'.

As Neil points out in a comment, the Attempt This Online! will let us read the license text and produce an output of 200 words. The output is different than the list I get when I run locally, and includes the invalid word 'internet' leaving us at only 199 valid entries with this method.

After checking the diff between the license I have and the one from ATO, the license I have is longer, containing a few extra sections, including "Additional conditions for this windows binary build" and an Apache License, among other things.

I had some failed attempts at using other builtin words, such as those found in the __doc__ attributes of the builtins, the Zen of Python, copyright text, help text, and even the python keywords and names of the builtins. In the end, the license text was the only one I could wrangle to a manageable number of bytes.

Python, 167 bytes

sorted(set([x for x in" ".join(str(v.__doc__)for v in __builtins__.__dict__.values()).split()if str.isalpha(x)and str.islower(x)and 3<len(x)<7and not "f"in x]))[-200:]

Attempt This Online!

JavaScript (V8), 99 bytes

A full program printing 200 words in lower case.

for(n in p="bbfbbbcghfgjdmrmlmhtwptpm")"sdgntdsgsts".replace(/.s?/g,s=>print(p[n]+"oaaeiu"[n%6]+s))

Try it online!

Method

This is the Cartesian product of 25 prefixes and 8 suffixes, chosen in such a way that all resulting words exist in the Wordnik listing.

The prefixes are:

bo ba fa be bi bu co ga ha fe gi ju do ma ra me li mu ho ta wa pe ti pu mo

Only consonants are stored in the outer lookup string "bbfb..pm". Vowels follow the pattern o,a,a,e,i,u.

The suffixes are:

s d g n t ds gs ts

They are are extracted from the inner lookup string "sdgntdsgsts" with the regular expression /.s?/g.

Words

Below are the generated words, along with the line number at which they appear in the file.

bos   19600
bod   18688
bog   18779
bon   19063
bot   19659
bods  18720
bogs  18817
bots  19721
bas   13508
bad   12328
bag   12391
ban   12796
bat   13730
bads  12366
bags  12431
bats  13820
fas   61465
fad   60817
fag   60869
fan   61154
fat   61567
fads  60855
fags  60892
fats  61640
bes   15596
bed   14371
beg   14763
ben   15255
bet   15808
beds  14546
begs  14863
bets  15888
bis   17228
bid   16236
big   16335
bin   16617
bit   17305
bids  16273
bigs  16405
bits  17339
bus   22526
bud   21724
bug   21814
bun   22131
but   22686
buds  21767
bugs  21852
buts  22727
cos   36965
cod   31752
cog   32065
con   33912
cot   37148
cods  31872
cogs  32128
cots  37204
gas   69239
gad   68408
gag   68468
gan   68921
gat   69405
gads  68448
gags  68489
gats  69455
has   76323
had   75026
hag   75115
han   75642
hat   76379
hads  75051
hags  75182
hats  76441
fes   62487
fed   61935
feg   62035
fen   62231
fet   62529
feds  61971
fegs  62036
fets  62595
gis   70925
gid   70605
gig   70646
gin   70769
git   70934
gids  70619
gigs  70690
gits  70941
jus   91178
jud   90894
jug   90947
jun   91070
jut   91217
juds  90945
jugs  90969
juts  91221
dos   50633
dod   49923
dog   49990
don   50335
dot   50674
dods  49971
dogs  50107
dots  50696
mas   101468
mad   99646
mag   99762
man   100522
mat   101704
mads  99719
mags  99926
mats  101870
ras   141090
rad   140225
rag   140482
ran   140838
rat   141151
rads  140444
rags  140535
rats  141280
mes   103330
med   102312
meg   102527
men   102944
met   103534
meds  102477
megs  102657
mets  103990
lis   97215
lid   96367
lig   96472
lin   96805
lit   97269
lids  96377
ligs  96580
lits  97413
mus   109880
mud   109087
mug   109196
mun   109705
mut   110083
muds  109151
mugs  109222
muts  110158
hos   80126
hod   78979
hog   79008
hon   79591
hot   80212
hods  78996
hogs  79043
hots  80276
tas   174440
tad   173572
tag   173607
tan   174028
tat   174503
tads  173575
tags  173634
tats  174520
was   193156
wad   192451
wag   192540
wan   192851
wat   193274
wads  192492
wags  192590
wats  193451
pes   127063
ped   125366
peg   125581
pen   125741
pet   127126
peds  125498
pegs  125597
pets  127246
tis   178237
tid   177704
tig   177789
tin   178009
tit   178248
tids  177744
tigs  177834
tits  178338
pus   138648
pud   137924
pug   137998
pun   138252
put   138725
puds  137958
pugs  138034
puts  138766
mos   108498
mod   107073
mog   107217
mon   107449
mot   108565
mods  107184
mogs  107226
mots  108729

Ruby, 106 bytes

680.times{|i|"e@k@pPI@@Pmf`@N@Fsv"[k=i/36].ord[c=i/6%6]>0&&p((k+66).chr+"aeo"[i%6/2]+'ywtpng'[c]+?s*i%=2)}

Try it online!

Outputs selected groups of three 3 letter words which are identical apart from the vowel (in second position) being a e or o, and also the same three words with an s added at the end (total 6 words in each group, except the last one which is truncated to give exactly 200 words.)

The 3 letter words all end in one of the letters ywtpng. Sufficient words can be found by varying the first letter in the range B..T. The magic string contains one character for each first letter. Its ascii code encodes bitwise for the last letters ywtpng that form valid words with that first letter.

Ruby, 125 bytes

301.times{|i|('swkw7wAyw+wQwwxy.NU%vvwwwW8aud8xw<owwoxxG~w'[i/7].ord+8)[i%7]>0&&(p (66+i/14).chr+'ao'[i/7%2]+'ngwsypt'[i%7])}

Try it online!

Outputs nearly all 3 letter words with a or o as the middle letter and any of ngwsypt as the final letter. A complete list of such words (including those not used) is given below. The ascii code for each character in the magic string encodes bitwise for one column of the table balow. Words alphabetically before B and after Way are not used.

One word in the middle of the table, ios, is skipped for golfing reasons. This is because the characters in the program are 8 less than the actual bitwise encoding, to allow the value 127 (not a printable ascii character) to be encoded for, and to wrap around to some small numbers for eon and vog/vow. Including both ion and ios would requre addition of an offset larger than 8 (specifically at least hex 89-7E = 11 decimal) which would add an extra byte for a 201st word that is not required by the challenge.

        ban bon can con dan don ean eon fan fon gan gon han hon     ion             kan kon         man mon nan non     oon pan             ran     san son tan ton     van     wan won     yon 
        bag bog cag cog dag dog         fag fog gag     hag hog             jag jog         lag log mag mog nag nog                         rag     sag sog tag tog     vag vog wag wog yag     zag 
            bow     cow daw dow         faw     gaw     haw how             jaw jow kaw kow law low maw mow naw now         paw pow         raw row saw sow taw tow     vaw vow waw wow yaw yow
aas     bas bos     cos das dos eas     fas     gas gos has hos     ios             kas kos las los mas mos nas nos     oos pas pos         ras         sos tas         vas     was wos yas     zas zos
        bay boy cay coy day doy         fay foy gay goy hay hoy             jay joy kay     lay loy may moy nay noy         pay             ray     say soy tay toy             way     yay
        bap bop cap cop dap dop         fap fop gap     hap hop             jap         kop lap lop map mop nap         oop pap pop         rap     sap sop tap top             wap wop yap     zap 
        bat bot cat cot     dot eat     fat     gat got hat hot                 jot kat     lat lot mat mot nat not oat oot pat pot  qat    rat rot sat sot tat tot     vat     wat wot

Python, 98 bytes

-5 (@xnor)

*a,="Tn"
for z in"TgtRmdMsgBdtHmpDbegn":a[z>'Z']=z;[print(b:=s.join(a),"\n"+b+"s")for s in"aeiou"]

Attempt This Online!

Python, 103 bytes

*a,="Vg"
for z in"gSnTgtRdmMdgsPptNbDepngFrnGetHmpnBstdgLd":a[z>'Z']=z;[print(*a,sep=s)for s in"aeoui"]

Attempt This Online!

Previous Python, 116 bytes

[print(x+s+y)for x,y in zip('vlnslns'+3*'fgprt'+5*"bdhm",'ggtndbgrttttnnsmngepdgtptssnpmngnggemddb')for s in"aeoui"]

Attempt This Online!

How?

Abuses the fact that there are 40 groups of 3-letter words of the form x + [ieauo] + y in the list, i.e. words like big,beg,bag,bug,bog or nit,net,nat,nut,not.

Japt, 45 bytes

Uses a previous version of Arnauld's prefixes & suffixes with some manual resorting, of the prefixes in particular, to optimise compression.

`n¡gd`
¬c¢ïs¬)ïi`¼¾¿ßðÜ™•—jå)Õ‹a´é)”œè@œa`ò

Test it

`...`\n¬c¢ïs¬)ïi`...`ò
`...`                      :Compressed string "nstgd"
     \n                    :Assign to variable U
       ¬                   :Split U
        c                  :Concat
         ¢                 :  U with first 2 characters removed
          ï                :  Cartesian product with
           s¬              :    "s" split to an array
             )             :End concat
              ï            :Cartesian product with
                `...`      :  Compressed string "bebobubicodofehahojugabalimamegimomupepurasofarea"
                     ò     :  Partitions of length 2, giving us a lone "a" at the end.
               i           :Reduce each pair by prepending

Wolfram Language (Mathematica), 20 bytes

WordList[][[2;;201]]

Takes the 2nd through 201th words from the builtin dictionary WordList[] (the 1st word, "a", isn't in Wordnik). The output is:

{"aah", "aardvark", "aback", "abacus", "abaft", "abalone", "abandon",
"abandoned", "abandonment", "abase", "abasement", "abash", "abashed",
"abashment", "abate", "abatement", "abattoir", "abbe", "abbess",
"abbey", "abbot", "abbreviate", "abbreviated", "abbreviation",
"abdicate", "abdication", "abdomen", "abdominal", "abduct",
"abducting", "abduction", "abductor", "abeam", "abed", "aberrant",
"aberration", "abet", "abettor", "abeyance", "abhor", "abhorrence",
"abhorrent", "abidance", "abide", "abiding", "ability", "abject",
"abjection", "abjectly", "abjuration", "abjure", "ablate", "ablated",
"ablation", "ablative", "ablaze", "able", "abloom", "ablution",
"ably", "abnegate", "abnegation", "abnormal", "abnormality",
"abnormally", "aboard", "abode", "abolish", "abolition",
"abolitionism", "abolitionist", "abominable", "abominably",
"abominate", "abomination", "aboriginal", "aborigine", "abort",
"abortion", "abortionist", "abortive", "abortively", "abound",
"abounding", "about", "above", "aboveboard", "abracadabra", "abrade",
"abrasion", "abrasive", "abrasiveness", "abreast", "abridge",
"abridged", "abridgment", "abroad", "abrogate", "abrogation",
"abrupt", "abruptly", "abruptness", "abscess", "abscessed",
"abscissa", "abscission", "abscond", "absconder", "abseil",
"absence", "absent", "absentee", "absenteeism", "absently",
"absentminded", "absentmindedly", "absentmindedness", "absinthe",
"absolute", "absolutely", "absoluteness", "absolution", "absolutism",
"absolutist", "absolve", "absolved", "absorb", "absorbed",
"absorbency", "absorbent", "absorber", "absorbing", "absorption",
"absorptive", "absorptivity", "abstain", "abstainer", "abstemious",
"abstemiously", "abstemiousness", "abstention", "abstinence",
"abstinent", "abstract", "abstracted", "abstractedly",
"abstractedness", "abstracter", "abstraction", "abstractly",
"abstractness", "abstruse", "abstrusely", "abstruseness", "absurd",
"absurdity", "absurdly", "abundance", "abundant", "abundantly",
"abuse", "abused", "abuser", "abusive", "abusively", "abut",
"abutment", "abuzz", "abysmal", "abysmally", "abyss", "abyssal",
"acacia", "academe", "academia", "academic", "academically",
"academician", "academy", "acanthus", "accede", "accelerate",
"accelerated", "acceleration", "accelerator", "accelerometer",
"accent", "accented", "accenting", "accentual", "accentuate",
"accentuation", "accept", "acceptability", "acceptable",
"acceptableness", "acceptably", "acceptance", "acceptation", "accepted"}

Charcoal, 81 bytes

F⪪”{&^v¡↑Kp⁺#*-J¶AθWΠ⁼≧⁻23⎇zCU⊖↶dζ)⁻>_+↨ξχb…WvAVE9ε⦄7i⟲g|⟦jΦU⬤⁺⪫ιa⪪asaedaing¦a

Try it online! Link is to verbose version of code. Explanation:

F⪪”...”²

Split a compressed 100-letter string into pairs of letters.

⁺⪫ιa⪪asaedaing¦a

Join each pair with an a, then output the string plus with the suffixes s, ed and ing.

Of the words in the list, there are exactly 50 which satisfy the following criteria:

Excluding the rarer letters rather than simply taking the first 50 saved me a byte.

05AB1E, 52 bytes

žĆ99Å12•edôú•₆вǝ7TÌǝ.¥ƵR+èãJ''ì€.VASK“€Ö‚¾‚惖“#Kт·£

Try it online.

Explanation:

žĆ               # Push the 05AB1E codepage string
  99Å1           # Push a list of 99 1s
      2          # Push a 2
       •edôú•    # Push compressed integer 665853189
             ₆в  # Convert it to base-36 as list: [11,0,15,19,21,33]
               ǝ # Replace the 1s in the list at those indices with 2s
      7TÌǝ       # Also replace the 1 at index 12 (10+2) with a 7
      .¥         # Undelta the list
        žy+      # Add constant integer 128 to each
           è     # Get the characters at those indices in the codepage string
ã                # Cartesian product to get all possible pairs
 J               # Join each inner pair of characters together
  ''ì            # Prepend a "'" before each
     €.V         # Evaluate and execute each as 05AB1E code, to get its dictionary strings
AS               # Push the alphabet-string and convert it to a list of characters
  K              # Remove all those single letter words from the list
   “€Ö‚¾‚惖“    # Push dictionary string "jan pm january ebay"
             #   # Split it on spaces: ["jan","pm","january","ebay"]
              K  # Remove those from the list as well
т·               # Push 200 (100*2)
  £              # Only keep that many words from the list
                 # (after which the result is output implicitly)

Note: The 05AB1E dictionary words ["jan","pm","january","ebay"] are among the 204 first generated words, but are not in the provided Wordnik-list, hence why I had to remove those manually before getting the first 200.

See this 05AB1E tip of mine (sections How to use the dictionary?, How to compress large integers?, and How to compress integer lists?) to understand why •edôú• is 665853189; •edôú•₆в is [11,0,15,19,21,33]; and “€Ö‚¾‚惖“ is "jan pm january ebay".

Vyxal 3, 426 bytes

"ƵvϢwξᏜ]:ʎB⌊ḧ⊣≛¤Þt³▲∻X↸⑤⨪»∨+Π⍰⍨£«pdϾJʈ∺⑶⑵+S∨½ℳ3⑴K≛#◌]8ɾ⎊5↜⊠TĠ! √Q⇧ʁᴥĿ†lṪ⇄kɠ¿★⊐⤺≛⁜⧢,z⇩⎙æ⊣~⊍0ᴥ⑶r⁰¿Ꮠ2∨aAᐵϾʈ ▦⊖ξʁ½£⊞O>¤‹Ꮠ÷⇩≥±!÷⎋①^≠Zᛞℂ.∺²*:⧢3★↯Ͼ⍾Jw<⍰B☷'p≤⇧ġ!‰^≥x≠∦▲d⧖l⌹⎙③Sδ⇧+≡H①{Ka,¹★a⌊xs@¶o6⑥⎋o⩔≈XᑂᏐ1γ|B5λ⧢[g⤻±?ᐵlQƵℳ½σ6∪yæℂR&ġ⇄⍨w⑦j⊖⁜℗Ɠ⎋ᐵḧλ<o⊞Ŀ☷≥☷⎄Oσᛞhʁ↝⦰☷ƛ②◌δ≊f℈9⑥⇩ŁWṬ⎄⚅>⍢ᴥĿD≥ᛞ⍨≥≜ɾ⎇-Þ⎘γ③kĿ¤ϢΠU⟒⑥↺{7±Ẅ▲^÷q•④δ*★⍢ᑂ∺øδ!›↝≓Ꮠ¥≊w⊖⎘@⍢℈¬S⍨)ʁƶ⊞ꜝ⧖Ġ u◌¨⇧⇧JVɠɾ⏚※×⎄ᑂṪ⍨γ½0⎙u⊞r(∧yʀĠ£⑷∩ξt⏚¥⍨¥.Q{U↝⌈⎂t⇄ḧᏐR∑Ƶ⎂Fġ⑶⧢j⑧D⊖r^ʁv⧖⑥,⊍↯|⎇ᏜFff∻¤∨Þ⍨<»øʈ«×-bʀƛ”⌈

Vyxal It Online!

Simply a compressed string containing the first 200 words in the short dictionary that also appear in the wordnik list.