¿Cómo comprobar si una cadena contiene un cierto número de consonantes y vocales?

Aug 17 2020

Estoy tratando de verificar la respuesta del siguiente problema mediante programación. Un cálculo manual a mano debe ser posible pero no es mi pregunta.

Dada una cadena "aeeiuchklpr"de longitud 11. El carácter "e" aparece dos veces. No es un error tipográfico. ¿Cuántas 6 permutaciones de la cadena dada hay? Las restricciones se dan como sigue

  • el primer carácter debe ser "h"
  • el último carácter debe ser una vocal
  • el número de consonantes debe ser exactamente 4
  • el número de vocales debe ser exactamente 2

Intento

No sé cómo verificar los dos últimos requisitos anteriores. Aqui esta mi intento

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

Respuestas

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

Implementación ligeramente diferente como una sola línea, usando un patrón restringido:

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

rendimientos

3120