5
$\begingroup$

I have this code to generate the anagrams for a 6 letters word:

letters = {"P", "E", "R", "I", "T", "O"};
perms = Permutations[letters, {6}];
list = StringJoin /@ perms;

Which gives me 720 possible combinations as expected. I'd like to select among those only the ones for which the vowels (i.e.: E, I and O) occur in alphabetical order. For instance:

"PERITO", "PERIOT" and "PERTIO" would be valid cases but "PERTOI", "PEROIT" and "PEROTI" would not. How can that be done?

$\endgroup$

4 Answers 4

5
$\begingroup$

Using StringMatchQ:

letters = {"P", "E", "R", "I", "T", "O"};
perms = Permutations[letters, {6}];
list = StringJoin /@ perms;

Select[StringMatchQ[
   StringExpression[___, "E", ___, "I", ___, "O", ___]]][list]

Same command with recognizable syntaxes:

Select[list, 
 StringMatchQ[___ ~~ "E" ~~ ___ ~~ "I" ~~ ___ ~~ "O" ~~ ___]]

Select[StringMatchQ[___ ~~ "E" ~~ ___ ~~ "I" ~~ ___ ~~ 
    "O" ~~ ___]][list]

Using StringDelete:

vowels = {"E", "I", "O"};
StringDelete[Except[Alternatives @@ vowels]] /@ list // 
  Position["EIO"] // Extract[list, #] &

{"PERITO", "PERIOT", "PERTIO", "PEIRTO", "PEIROT", "PEITRO",
"PEITOR", "PEIORT", "PEIOTR", "PETRIO", "PETIRO", "PETIOR", "PREITO", \ "PREIOT", "PRETIO", "PRTEIO", "PTERIO", "PTEIRO", "PTEIOR", "PTREIO", \ "EPRITO", "EPRIOT", "EPRTIO", "EPIRTO", "EPIROT", "EPITRO", "EPITOR", \ "EPIORT", "EPIOTR", "EPTRIO", "EPTIRO", "EPTIOR", "ERPITO", "ERPIOT", \ "ERPTIO", "ERIPTO", "ERIPOT", "ERITPO", "ERITOP", "ERIOPT", "ERIOTP", \ "ERTPIO", "ERTIPO", "ERTIOP", "EIPRTO", "EIPROT", "EIPTRO", "EIPTOR", \ "EIPORT", "EIPOTR", "EIRPTO", "EIRPOT", "EIRTPO", "EIRTOP", "EIROPT",
"EIROTP", "EITPRO", "EITPOR", "EITRPO", "EITROP", "EITOPR", "EITORP", \ "EIOPRT", "EIOPTR", "EIORPT", "EIORTP", "EIOTPR", "EIOTRP", "ETPRIO", \ "ETPIRO", "ETPIOR", "ETRPIO", "ETRIPO", "ETRIOP", "ETIPRO", "ETIPOR", \ "ETIRPO", "ETIROP", "ETIOPR", "ETIORP", "RPEITO", "RPEIOT", "RPETIO", \ "RPTEIO", "REPITO", "REPIOT", "REPTIO", "REIPTO", "REIPOT", "REITPO", \ "REITOP", "REIOPT", "REIOTP", "RETPIO", "RETIPO", "RETIOP", "RTPEIO", \ "RTEPIO", "RTEIPO", "RTEIOP", "TPERIO", "TPEIRO", "TPEIOR", "TPREIO",
"TEPRIO", "TEPIRO", "TEPIOR", "TERPIO", "TERIPO", "TERIOP", "TEIPRO", \ "TEIPOR", "TEIRPO", "TEIROP", "TEIOPR", "TEIORP", "TRPEIO", "TREPIO", \ "TREIPO", "TREIOP"}

These are 120 in total.

$\endgroup$
4
$\begingroup$
letters = {"P", "E", "R", "I", "T", "O"};

perms = Permutations[letters, {6}];

Using Cases

Cases[perms, x : {___, "E", ___, "I", ___, "O", ___} :> StringJoin[x]]

{"PERITO", "PERIOT", "PERTIO", "PEIRTO", "PEIROT", "PEITRO",
"PEITOR", "PEIORT", "PEIOTR", "PETRIO", "PETIRO", "PETIOR", "PREITO",
"PREIOT", "PRETIO", "PRTEIO", "PTERIO", "PTEIRO", "PTEIOR", "PTREIO",
"EPRITO", "EPRIOT", "EPRTIO", "EPIRTO", "EPIROT", "EPITRO", "EPITOR",
"EPIORT", "EPIOTR", "EPTRIO", "EPTIRO", "EPTIOR", "ERPITO", "ERPIOT",
"ERPTIO", "ERIPTO", "ERIPOT", "ERITPO", "ERITOP", "ERIOPT", "ERIOTP",
"ERTPIO", "ERTIPO", "ERTIOP", "EIPRTO", "EIPROT", "EIPTRO", "EIPTOR",
"EIPORT", "EIPOTR", "EIRPTO", "EIRPOT", "EIRTPO", "EIRTOP", "EIROPT",
"EIROTP", "EITPRO", "EITPOR", "EITRPO", "EITROP", "EITOPR", "EITORP",
"EIOPRT", "EIOPTR", "EIORPT", "EIORTP", "EIOTPR", "EIOTRP", "ETPRIO",
"ETPIRO", "ETPIOR", "ETRPIO", "ETRIPO", "ETRIOP", "ETIPRO", "ETIPOR",
"ETIRPO", "ETIROP", "ETIOPR", "ETIORP", "RPEITO", "RPEIOT", "RPETIO",
"RPTEIO", "REPITO", "REPIOT", "REPTIO", "REIPTO", "REIPOT", "REITPO",
"REITOP", "REIOPT", "REIOTP", "RETPIO", "RETIPO", "RETIOP", "RTPEIO",
"RTEPIO", "RTEIPO", "RTEIOP", "TPERIO", "TPEIRO", "TPEIOR", "TPREIO",
"TEPRIO", "TEPIRO", "TEPIOR", "TERPIO", "TERIPO", "TERIOP", "TEIPRO",
"TEIPOR", "TEIRPO", "TEIROP", "TEIOPR", "TEIORP", "TRPEIO", "TREPIO",
"TREIPO", "TREIOP"}

$\endgroup$
4
$\begingroup$
letters = {"P", "E", "R", "I", "T", "O"};

perms = Permutations[letters, {6}];

Grabbing the @eldo's pattern and using ReplaceList:

patt = x : {___, "E", ___, "I", ___, "O", ___};

ReplaceList[perms, {___, patt, ___} :> StringJoin[x]]

{"PERITO", "PERIOT", "PERTIO", "PEIRTO", "PEIROT", "PEITRO", "PEITOR", "PEIORT", "PEIOTR", "PETRIO", "PETIRO", "PETIOR", "PREITO", "PREIOT", "PRETIO", "PRTEIO", "PTERIO", "PTEIRO", "PTEIOR", "PTREIO", "EPRITO", "EPRIOT", "EPRTIO", "EPIRTO", "EPIROT", "EPITRO", "EPITOR", "EPIORT", "EPIOTR", "EPTRIO", "EPTIRO", "EPTIOR", "ERPITO", "ERPIOT", "ERPTIO", "ERIPTO", "ERIPOT", "ERITPO", "ERITOP", "ERIOPT", "ERIOTP", "ERTPIO", "ERTIPO", "ERTIOP", "EIPRTO", "EIPROT", "EIPTRO", "EIPTOR", "EIPORT", "EIPOTR", "EIRPTO", "EIRPOT", "EIRTPO", "EIRTOP", "EIROPT", "EIROTP", "EITPRO", "EITPOR", "EITRPO", "EITROP", "EITOPR", "EITORP", "EIOPRT", "EIOPTR", "EIORPT", "EIORTP", "EIOTPR", "EIOTRP", "ETPRIO", "ETPIRO", "ETPIOR", "ETRPIO", "ETRIPO", "ETRIOP", "ETIPRO", "ETIPOR", "ETIRPO", "ETIROP", "ETIOPR", "ETIORP", "RPEITO", "RPEIOT", "RPETIO", "RPTEIO", "REPITO", "REPIOT", "REPTIO", "REIPTO", "REIPOT", "REITPO", "REITOP", "REIOPT", "REIOTP", "RETPIO", "RETIPO", "RETIOP", "RTPEIO", "RTEPIO", "RTEIPO", "RTEIOP", "TPERIO", "TPEIRO", "TPEIOR", "TPREIO", "TEPRIO", "TEPIRO", "TEPIOR", "TERPIO", "TERIPO", "TERIOP", "TEIPRO", "TEIPOR", "TEIRPO", "TEIROP", "TEIOPR", "TEIORP", "TRPEIO", "TREPIO", "TREIPO", "TREIOP"}

$\endgroup$
3
$\begingroup$
Pick[#, StringMatchQ[RegularExpression[".*E.*I.*O.*"]] /@ #] &[list]


{"PERITO", "PERIOT", "PERTIO", "PEIRTO", "PEIROT", "PEITRO", 
 "PEITOR", "PEIORT", "PEIOTR", "PETRIO", "PETIRO", "PETIOR", 
 "PREITO", "PREIOT", "PRETIO", "PRTEIO", "PTERIO", "PTEIRO", 
 "PTEIOR", "PTREIO", "EPRITO", "EPRIOT", "EPRTIO", "EPIRTO", 
 "EPIROT", "EPITRO", "EPITOR", "EPIORT", "EPIOTR", "EPTRIO", 
 "EPTIRO", "EPTIOR", "ERPITO", "ERPIOT", "ERPTIO", "ERIPTO", 
 "ERIPOT", "ERITPO", "ERITOP", "ERIOPT", "ERIOTP", "ERTPIO", 
 "ERTIPO", "ERTIOP", "EIPRTO", "EIPROT", "EIPTRO", "EIPTOR", 
 "EIPORT", "EIPOTR", "EIRPTO", "EIRPOT", "EIRTPO", "EIRTOP", 
 "EIROPT", "EIROTP", "EITPRO", "EITPOR", "EITRPO", "EITROP", 
 "EITOPR", "EITORP", "EIOPRT", "EIOPTR", "EIORPT", "EIORTP", 
 "EIOTPR", "EIOTRP", "ETPRIO", "ETPIRO", "ETPIOR", "ETRPIO", 
 "ETRIPO", "ETRIOP", "ETIPRO", "ETIPOR", "ETIRPO", "ETIROP", 
 "ETIOPR", "ETIORP", "RPEITO", "RPEIOT", "RPETIO", "RPTEIO", 
 "REPITO", "REPIOT", "REPTIO", "REIPTO", "REIPOT", "REITPO", 
 "REITOP", "REIOPT", "REIOTP", "RETPIO", "RETIPO", "RETIOP", 
 "RTPEIO", "RTEPIO", "RTEIPO", "RTEIOP", "TPERIO", "TPEIRO", 
 "TPEIOR", "TPREIO", "TEPRIO", "TEPIRO", "TEPIOR", "TERPIO", 
 "TERIPO", "TERIOP", "TEIPRO", "TEIPOR", "TEIRPO", "TEIROP", 
 "TEIOPR", "TEIORP", "TRPEIO", "TREPIO", "TREIPO", "TREIOP"}
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.