Comment vérifier si une chaîne contient un certain nombre de consonnes et de voyelles?

Aug 17 2020

J'essaie de vérifier la réponse au problème suivant par programme. Un calcul manuel à la main doit être possible mais ce n'est pas ma question.

Étant donné une chaîne "aeeiuchklpr"de longueur 11. Le caractère "e" apparaît deux fois. Ce n'est pas une faute de frappe. Combien y a-t-il de 6 permutations de la chaîne donnée? Les contraintes sont données comme suit

  • le premier caractère doit être "h"
  • le dernier caractère doit être une voyelle
  • le nombre de consonnes doit être exactement 4
  • le nombre de voyelles doit être exactement 2

Tentative

Je ne sais pas comment vérifier les deux dernières exigences ci-dessus. Voici ma tentative

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

Réponses

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

Implémentation légèrement différente en tant que one-liner, utilisant un motif restreint:

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

rendements

3120