/* Count how many vowels and consonants occur in a string in Picat. http://rosettacode.org/wiki/Count_how_many_vowels_and_consonants_occur_in_a_string """ Count how many vowels and consonants occur in a string """ This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go => S = "Count how many vowels and consonants occur in a string", vowels(Vowels), consonants(Consonants), CountVowels = [C : C in S, membchk(C,Vowels)].len, CountConsonants = [C : C in S, membchk(C,Consonants)].len, println([vowels=CountVowels,consonants=CountConsonants,rest=(S.len-CountVowels-CountConsonants)]), % Occurrences of each character println(all=count_chars(S)), println(vowels=count_chars(S,Vowels)), println(consonants=count_chars(S,Consonants)), nl. vowels("aeiouAEIOU"). consonants("bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"). count_chars(S) = count_chars(S,""). count_chars(S,Cs) = Map => Map = new_map(), foreach(C in S, (Cs != "" -> membchk(C,Cs) ; true)) Map.put(C,Map.get(C,0)+1) end. % recursive go2 => S = "Count how many vowels and consonants occur in a string", vowels(Vowels), consonants(Consonants), NumVowels = count_set(Vowels,S), NumConsonants = count_set(Consonants,S), NumRest = S.len - NumVowels - NumConsonants, println([vowels=NumVowels,consontants=NumConsonants,rest=NumRest]), nl. count_set(Set,S) = Vs => count_set(Set,S,0,Vs). count_set(_Set,[],Vs,Vs). count_set(Set,[C|Cs],Vs0,Vs) :- (membchk(C,Set) -> Vs1 = Vs0 + 1 ; Vs1 = Vs0 ), count_set(Set,Cs,Vs1,Vs).