विलय (int * स्ट्रिंग) सूची ओकंपल

मेरे पास यह कार्य है:

let encode list =
let rec aux count acc = function
 | [] -> [] (* Caso a lista esteja vazia*)
 | [x] -> (count+1, x) :: acc
 | a :: (b :: _ as t) -> 
    if a = b then aux (count + 1) acc t
            else aux 0 ((count+1,a) :: acc) t in
        List.rev (aux 0 [] list)
;;

और इस इनपुट के साथ:

let test = encode ["a";"a";"a";"a";"b";"f";"f";"c";"c";"a";"a";"d";"e";"e";"e";"e"];;

और मेरे पास यह आउटपुट है:

val test : (int * string) list =
[(4, "a"); (1, "b"); (2, "f"); (2, "c"); (2, "a"); (1, "d"); (4, "e")]

लेकिन "ए" एक दोहराया गया है और "एफ" को अंतिम रूप में होना चाहिए! मुझे आउटपुट की आवश्यकता है जैसे:

val test : (int * string) list =
[(6, "a"); (1, "b"); (2, "c"); (1, "d"); (4, "e"); (2, "f")]

क्या कोई मदद कर सकता है, कृपया ?! धन्यवाद!

0

2 उत्तर

आप बार-बार आसन्न मूल्यों को गिन रहे हैं, तथाकथित रन-लम्बाई एन्कोडिंग। ऐसा प्रतीत होता है कि आप पूरे इनपुट में घटनाओं को गिनना चाहते हैं। आप पहले से इनपुट को सॉर्ट कर सकते हैं, या आप अपनी गणना का ट्रैक रखने के लिए एक और जटिल डेटा संरचना (जैसे मानचित्र) का उपयोग कर सकते हैं।

0
जोड़ा

कुछ इस तरह:

let encode xs = 
  let f acc x = 
    let n = try M.find x acc  with Not_found -> 0 in 
    M.add x (n+1) acc in
  let ans = (List.fold_left f M.empty) xs in 
  M.bindings ans ;;

# encode ["a";"a";"a";"a";"b";"f";"f";"c";"c";"a";"a";"d";"e";"e";"e";"e"];;
- : (M.key * int) list =
[("a", 6); ("b", 1); ("c", 2); ("d", 1); ("e", 4); ("f", 2)]
0
जोड़ा