文字列に特定の数の子音と母音が含まれているかどうかを確認するにはどうすればよいですか?

Aug 17 2020

次の問題の答えをプログラムで確認しようとしています。手作業による計算が可能でなければなりませんが、それは私の質問ではありません。

"aeeiuchklpr"長さ11の文字列が与えられます。文字「e」は2回出現します。タイプミスではありません。与えられた文字列の6順列はいくつありますか?制約は次のように与えられます

  • 最初の文字は「h」でなければなりません
  • 最後の文字は母音でなければなりません
  • 子音の数は正確に4でなければなりません
  • 母音の数は正確に2でなければなりません

試みる

上記の最後の2つの要件を確認する方法がわかりません。これが私の試みです

Select[Permutations[StringSplit["aeeiuchklpr", ""], {6}],
  First[#] == "h" &&
    (Last[#] == "a" || Last[#] == "e" || Last[#] == "i" || 
      Last[#] == "u") &] // Length

回答

6 Hausdorff Aug 17 2020 at 12:26
VowelQ[s_String] := MatchQ[s, "a" | "e" | "i" | "o" | "u"];   

Select[Permutations[StringSplit["aeeiuchklpr", ""], {6}], 
    First[#] == "h" && VowelQ[Last@#] && Count[VowelQ /@ #, True] == 2 &] // Length
3120
3 ArminVollmer Aug 18 2020 at 18:23

制限されたパターンを使用した、ワンライナーとしてのわずかに異なる実装:

Count[Permutations[
  Characters["aeeiuchklpr"], {6}], {"h", m__, 
   vowels = ("a" | "e" | "i" | "o" | "u")} /; Count[{m}, vowels] == 1]

収量

3120