Bir dizenin belirli sayıda ünsüz ve sesli harf içerip içermediği nasıl kontrol edilir?

Aug 17 2020

Aşağıdaki sorunun cevabını programlı olarak kontrol etmeye çalışıyorum. Elle hesaplama yapmak mümkün olmalı ama bu benim sorum değil.

"aeeiuchklpr"11 uzunluğunda bir dizi verildiğinde . "E" karakteri iki kez geçer. Bu bir yazım hatası değildir. Verilen dizenin kaç tane 6-permütasyonu var? Kısıtlamalar aşağıdaki gibi verilmiştir

  • ilk karakter "h" olmalıdır
  • son karakter sesli harf olmalıdır
  • ünsüzlerin sayısı tam olarak 4 olmalıdır
  • ünlülerin sayısı tam olarak 2 olmalıdır

Girişim

Yukarıdaki son iki gereksinimi nasıl kontrol edeceğimi bilmiyorum. İşte benim girişimim

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

Yanıtlar

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

Kısıtlı bir model kullanarak, tek satırlık olarak biraz farklı uygulama:

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

verim

3120