Filter words: Difference between revisions

From Rosetta Code
Content added Content deleted
(Merge dictionary tasks)
 
(Blanked the page)
 
Line 1: Line 1:
{{Draft task}}

;Task
Using [https://web.archive.org/web/20180611003215/http://www.puzzlers.org/pub/wordlists/unixdict.txt unixdict.txt],
filter words in as many boring, unimaginative, and useless ways that you can think of. (tee hee)

Wherever possible use generic parameterised and potentially useful routines rather than being specific to one inane petty little task.

;Extra credit

Replace as many entries as you can in the following tasks with "<nowiki>see [[Filter_words#</nowiki><i>Lang</i><nowiki>]]</nowiki>"<br>

[[Alternade_words]]<br>
[[Prime_words]]<br>
[[ABC_words]]<br>
[[Odd_words]]<br>
[[Changeable_words]]<br>
[[Words_containing_%22the%22_substring]]<br>
[[Find_words_with_alternating_vowels_and_consonants]]<br>
[[Words_from_neighbour_ones]]<br>
[[Find_words_which_contains_more_than_3_e_vowels]]<br>
[[Find_words_which_first_and_last_three_letters_are_equals]]<br>
[[Change_e_letters_to_i_in_words]]<br>
[[Find_words_which_contains_all_the_vowels]]<br>
[[Find_words_which_contains_most_consonants]]<br>

=={{header|Phix}}==
Draft. All of the very task-specific routines below have simply been copied; they should/will be merged where possible.
<lang Phix>sequence words = get_text("demo/unixdict.txt",GT_LF_STRIPPED)

procedure filter_words(string desc, integer rid, len=3, sequence args={})
sequence res = call_func(rid,args),
sres = shorten(res,"",abs(len)),
shres = iff(len<0?join(sres):sprintf("%v",{sres}))
printf(1,"%d %s words: %s\n",{length(res),desc,shres})
end procedure
function plain(integer rid) return filter(words,rid) end function

function alternade()
sequence res = {}
for i=1 to length(words) do
string word = words[i]
if length(word)>=6 then
sequence sn = repeat("",2)
for j=1 to length(word) do
sn[mod(j-1,2)+1] &= word[j]
end for
if sum(sq_gt(apply(true,binary_search,{sn,{words}}),0))=2 then
res = append(res,sprintf("%s (%s,%s)",{word,sn[1],sn[2]}))
end if
end if
end for
return res
end function
function sap(string word) return sum(apply(word,is_prime))==length(word) end function
function abc(string word)
sequence idii = apply(true,find,{"abc",{word}})
return find(0,idii)==0 and idii==sort(idii)
end function
function oddx(integer /*ch*/, idx) return remainder(idx,2)=1 end function
function oddch(string word) return filter(word,oddx) end function
function over4(string word) return length(word)>4 end function
function oddwords() return filter(filter(apply(words,oddch),over4),"in",words) end function
function over11(string word) return length(word)>11 end function
function changeable()
sequence w11 = filter(words,over11),
res = {}
for i=1 to length(w11) do
for j=i+1 to length(w11) do
if length(w11[i])=length(w11[j])
and sum(sq_ne(w11[i],w11[j]))=1 then
res = append(res,w11[i]&" <=> "&w11[j])
end if
end for
end for
return res
end function
function the(string word) return length(word)>11 and match("the",word) end function
function odd(integer idx) return remainder(idx,2)=1 end function
function vowel(integer ch) return find(ch,"aeiou")!=0 end function
function oddeven(string word)
if length(word)<=9 then return false end if
sequence consonants = apply(word,vowel),
ohoneohone = apply(tagset(length(word)),odd)
return find(consonants,{ohoneohone,sq_not(ohoneohone)})
end function
function over9(string word) return length(word)>=9 end function
sequence dictionary = filter(words,over9)
function slicen(integer n) return vslice(dictionary,n)[n..-10+n] end function
function neighwords()
return unique(filter(columnize(apply(tagset(9),slicen)),"in",dictionary))
end function
function note(string word) return find_any("aiou",word)=0 and length(find_all('e',word))>3 end function
function flaste(string word) return length(word)>5 and word[1..3]=word[-3..-1] end function
function chei(string word) return substitute(word,"e","i") end function
function cheti(string word) return length(word)>5 and find('e',word) and find(chei(word),words) end function
function chetei() sequence chetie = filter(words,cheti) return columnize({chetie,apply(chetie,chei)}) end function
function onev(string word, integer vowel) return length(find_all(vowel,word))=1 end function
function allv(string word) return length(word)>10 and sum(apply(true,onev,{{word},"aeiou"}))=5 end function
function consonant(integer ch) return find(ch,"aeiou")=0 end function
function over10(string word) return length(word)>10 end function
function mostc()
sequence w10 = filter(words,over10),
res = {}
for i=1 to length(w10) do
string c = filter(w10[i],consonant)
if length(unique(c))=length(c) then
res = append(res,{length(c),w10[i]})
end if
end for
return sort_columns(res,{-1,2})
end function

constant tests = {
{"alternade",alternade,2},
{"prime",plain,7,{sap}},
{"abc",plain,4,{abc}},
{"odd",oddwords,5},
{"changeable",changeable,1},
{"the",plain,3,{the}},
{"alternating vowel",plain,3,{oddeven}},
{"neighbour",neighwords,-4},
{"> 3 e",plain,3,{note}},
{"first3=last3",plain,3,{flaste}},
{"e to i",chetei,2},
{"all vowels",plain,3,{allv}},
{"most consonant",mostc,2}}
papply(false,filter_words,tests)</lang>
{{out}}
<pre>
58 alternade words: {"accost (acs,cot)","accuse (acs,cue)","...","truant (tun,rat)","twirly (til,wry)"}
36 prime words: {"a","aaa","age","agee","ak","am","ama","...","magma","make","mamma","me","meek","meg","q"}
55 abc words: {"aback","abacus","abc","abdicate","...","strabismic","syllabic","tabernacle","tablecloth"}
14 odd words: {"brain","cider","cried","grata","hades","...","sight","saute","spree","spree","trial"}
26 changeable words: {"aristotelean <=> aristotelian","...","upperclassman <=> upperclassmen"}
32 the words: {"authenticate","chemotherapy","chrysanthemum","...","weatherproof","weatherstrip","weatherstripping"}
67 alternating vowel words: aboriginal apologetic bimolecular ... unimodular uninominal verisimilitude
24 neighbour words: applicate architect astronomy christine ... telephone transcend transport transpose
16 words with>3 e: {"belvedere","dereference","elsewhere","...","seventeenth","telemeter","tennessee"}
8 first3=last3 words: {"antiperspirant","calendrical","einstein","hotshot","murmur","oshkosh","tartar","testes"}
26 e to i words: {{"analyses","analysis"},{"atlantes","atlantis"},"...",{"vector","victor"},{"welles","willis"}}
25 all vowels words: {"ambidextrous","bimolecular","cauliflower","...","praseodymium","stupefaction","sulfonamide"}
347 most consonant words: {{9,"comprehensible"},{8,"administrable"},"...",{4,"bourgeoisie"},{4,"onomatopoeia"}}
</pre>

Latest revision as of 13:35, 15 February 2021