大文字と小文字の両方が異なる2つの隣接する文字を含む単語を削除するにはどうすればよいですか?

Aug 24 2020

の順列のリストがありABCabc、大文字と小文字の両方が異なる2つの隣接する文字の順列を削除したいと思います。

例えば、

  • ABCcab 保持されます。
  • ABCacb大文字と小文字Caが異なる2つの隣接する文字が含まれているため、削除する必要があります。
  • AbBcaC 同様に削除する必要があります。

試みる

これが私の試みですが、フィルタリングはしていません。

Select[StringJoin /@ Permutations[Characters@"ABCabc"],....]

回答

9 kglr Aug 23 2020 at 23:56
slist = StringJoin /@ Permutations[Characters@"ABCabc"]; 

pat =  a_ ~~ b_ /; ToUpperCase[a] != ToUpperCase[b] && UpperCaseQ[a] != UpperCaseQ[b];

Select[StringFreeQ[pat]]@slist
{"ABCcab", "ABCcba", "ABbacC", "ACBbac", "ACBbca", "ACcabB", 
"AabBCc", "AabcCB", "AacCBb", "AacbBC", "BACcab", "BACcba", "BAabcC", 
"BCAabc", "BCAacb", "BCcbaA", "BbaACc", "BbacCA", "BbcCAa", "BbcaAC", 
"CABbac", "CABbca", "CAacbB", "CBAabc", "CBAacb", "CBbcaA", "CcaABb", 
"CcabBA", "CcbBAa", "CcbaAB", "aABCcb", "aABbcC", "aACBbc", "aACcbB", 
"abBACc", "abcCAB", "abcCBA", "acCABb", "acbBAC", "acbBCA", "bBACca", 
"bBAacC", "bBCAac", "bBCcaA", "baABCc", "bacCAB", "bacCBA", "bcCBAa", 
"bcaABC", "bcaACB", "cCABba", "cCAabB", "cCBAab", "cCBbaA", "caACBb", 
"cabBAC", "cabBCA", "cbBCAa", "cbaABC", "cbaACB"}
4 MichaelE2 Aug 23 2020 at 23:45

多分これ?:

DeleteCases[StringJoin /@ Permutations[Characters@"ABCabc"], 
 s_String /; 
  StringMatchQ[s,
    ___ ~~ a_ ~~ b_ ~~ ___ /;
     ! LowerCaseQ[a <> b] &&
     ! UpperCaseQ[a <> b] && 
     ToLowerCase[a] =!= ToLowerCase[b]]]