regex = / ^.( e[ ^r] | ic) | x.| ..me | ia| ti| .l ..| nn$| [ ^u] s$$/ # test: anything ending with "s"
singular = [ "car" ,
"boat" ,
"man" ,
"woman" ,
"omen" ,
"bus" ,
"cactus" ,
"spy" ,
"pie" ,
"louse" ,
"mouse" ,
"amice" ,
"goose" ,
"creese" ,
"person" ,
"child" ,
"siren" ,
"ox" ,
"foot" ,
"tooth" ,
"formula" ,
"minx" ,
"sphinx" ,
"wife" ,
"knife" ,
"ion" ,
"criterion" ,
"jinni" ,
"zero" ,
"hero" ]
plural = [ "cars" ,
"boats" ,
"men" ,
"women" ,
"omens" ,
"buses" ,
"cacti" ,
"spies" ,
"pies" ,
"lice" ,
"mice" ,
"amices" ,
"geese" ,
"creeses" ,
"people" ,
"children" ,
"sirens" ,
"oxen" ,
"feet" ,
"teeth" ,
"formulae" ,
"minxes" ,
"sphinges" ,
"wives" ,
"knives" ,
"ions" ,
"criteria" ,
"jinn" ,
"zeros" ,
"heroes" ]
singular.zip ( plural) { | s,p |
puts " #{s=~regex ? " X" : " "} #{s.ljust(9)} #{p=~regex ? " X" : " "} " + p
}
# match_singular = singular.select { |word| word =~ regex }
# puts "MATCHED #{match_singular.size}/#{singular.size} singular nouns:"
# puts match_singular
# puts
# match_plural = plural.select { |word| word =~ regex }
# puts "MATCHED #{match_plural.size}/#{plural.size} plural nouns:"
# puts match_plural
cmVnZXggPSAvXi4oZVtecl18aWMpfHgufC4ubWV8aWF8dGl8LmwuLnxubiR8W151XXMkJC8gICMgdGVzdDogYW55dGhpbmcgZW5kaW5nIHdpdGggInMiCgpzaW5ndWxhciA9IFsgImNhciIsCiAgICAgICAgICAgICAiYm9hdCIsCiAgICAgICAgICAgICAibWFuIiwKICAgICAgICAgICAgICJ3b21hbiIsCiAgICAgICAgICAgICAib21lbiIsCiAgICAgICAgICAgICAiYnVzIiwKICAgICAgICAgICAgICJjYWN0dXMiLAogICAgICAgICAgICAgInNweSIsCiAgICAgICAgICAgICAicGllIiwKICAgICAgICAgICAgICJsb3VzZSIsCiAgICAgICAgICAgICAibW91c2UiLAogICAgICAgICAgICAgImFtaWNlIiwKICAgICAgICAgICAgICJnb29zZSIsCiAgICAgICAgICAgICAiY3JlZXNlIiwKICAgICAgICAgICAgICJwZXJzb24iLAogICAgICAgICAgICAgImNoaWxkIiwKICAgICAgICAgICAgICJzaXJlbiIsCiAgICAgICAgICAgICAib3giLAogICAgICAgICAgICAgImZvb3QiLAogICAgICAgICAgICAgInRvb3RoIiwKICAgICAgICAgICAgICJmb3JtdWxhIiwKICAgICAgICAgICAgICJtaW54IiwKICAgICAgICAgICAgICJzcGhpbngiLAogICAgICAgICAgICAgIndpZmUiLAogICAgICAgICAgICAgImtuaWZlIiwKICAgICAgICAgICAgICJpb24iLAogICAgICAgICAgICAgImNyaXRlcmlvbiIsCiAgICAgICAgICAgICAiamlubmkiLAogICAgICAgICAgICAgInplcm8iLAogICAgICAgICAgICAgImhlcm8iIF0KCnBsdXJhbCA9IFsgImNhcnMiLAogICAgICAgICAgICJib2F0cyIsCiAgICAgICAgICAgIm1lbiIsCiAgICAgICAgICAgIndvbWVuIiwKICAgICAgICAgICAib21lbnMiLAogICAgICAgICAgICJidXNlcyIsCiAgICAgICAgICAgImNhY3RpIiwKICAgICAgICAgICAic3BpZXMiLAogICAgICAgICAgICJwaWVzIiwKICAgICAgICAgICAibGljZSIsCiAgICAgICAgICAgIm1pY2UiLAogICAgICAgICAgICJhbWljZXMiLAogICAgICAgICAgICJnZWVzZSIsCiAgICAgICAgICAgImNyZWVzZXMiLAogICAgICAgICAgICJwZW9wbGUiLAogICAgICAgICAgICJjaGlsZHJlbiIsCiAgICAgICAgICAgInNpcmVucyIsCiAgICAgICAgICAgIm94ZW4iLAogICAgICAgICAgICJmZWV0IiwKICAgICAgICAgICAidGVldGgiLAogICAgICAgICAgICJmb3JtdWxhZSIsCiAgICAgICAgICAgIm1pbnhlcyIsCiAgICAgICAgICAgInNwaGluZ2VzIiwKICAgICAgICAgICAid2l2ZXMiLAogICAgICAgICAgICJrbml2ZXMiLAogICAgICAgICAgICJpb25zIiwKICAgICAgICAgICAiY3JpdGVyaWEiLAogICAgICAgICAgICJqaW5uIiwKICAgICAgICAgICAiemVyb3MiLAogICAgICAgICAgICJoZXJvZXMiIF0gCgpzaW5ndWxhci56aXAocGx1cmFsKSB7IHxzLHB8CiAgcHV0cyAiICN7cz1+cmVnZXggPyAiWCIgOiAiICJ9ICN7cy5sanVzdCg5KX0gICAje3A9fnJlZ2V4ID8gIlgiIDogIiAifSAiK3AKfQoKCiMgbWF0Y2hfc2luZ3VsYXIgPSBzaW5ndWxhci5zZWxlY3QgeyB8d29yZHwgd29yZCA9fiByZWdleCB9CiMgcHV0cyAiTUFUQ0hFRCAje21hdGNoX3Npbmd1bGFyLnNpemV9LyN7c2luZ3VsYXIuc2l6ZX0gc2luZ3VsYXIgbm91bnM6IgojIHB1dHMgbWF0Y2hfc2luZ3VsYXIKIyBwdXRzCiMgbWF0Y2hfcGx1cmFsID0gcGx1cmFsLnNlbGVjdCB7IHx3b3JkfCB3b3JkID1+IHJlZ2V4IH0KIyBwdXRzICJNQVRDSEVEICN7bWF0Y2hfcGx1cmFsLnNpemV9LyN7cGx1cmFsLnNpemV9IHBsdXJhbCBub3VuczoiCiMgcHV0cyBtYXRjaF9wbHVyYWwK