Как проверить, есть ли в строке определенное количество согласных и гласных?

Aug 17 2020

Я пытаюсь программно проверить ответ на следующую проблему. Ручной расчет должен быть возможен, но это не мой вопрос.

Дана строка "aeeiuchklpr"длины 11. Символ «e» встречается дважды. Это не опечатка. Сколько существует 6-перестановок данной строки? Ограничения задаются следующим образом

  • первый символ должен быть "h"
  • последний символ должен быть гласным
  • the number of consonants must be exactly 4
  • the number of vowels must be exactly 2

Attempt

I don't know how to check the last two requirement above. Here is my attempt

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

Slightly different implementation as a one-liner, using a restricted pattern:

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

yields

3120