Sha256: c40db50d335cc23e84b7c538aac2bec4d4ba3fdcf56e9f21068043a9926dd78d

Contents?: true

Size: 971 Bytes

Versions: 80

Compression:

Stored size: 971 Bytes

Contents

open Core.Std

let (>|>) f g x = g (f x)

let repeat n ch = 
  Array.init n ~f:(fun _ -> ch) 
  |> Array.to_list
  |> String.of_char_list

let collapse = function
| [] -> failwith "empty string not expected here"
| [x] -> Char.to_string x
| (x::_) as g -> sprintf "%d%c" (List.length g) x

let to_int = String.of_char_list >|> Int.of_string

let decode_to_tuple (s: 'a list): ((int * 'a) * 'a list) = 
  match List.split_while ~f:Char.is_digit s with
  | ([], (x::xs)) -> ((1, x), xs)
  | (ds, (x::xs)) -> let count = to_int ds in ((count, x), xs)
  | _ -> failwith "case not expected"

let encode =
  String.to_list
  >|> List.group ~break:((<>))
  >|> List.map ~f:collapse
  >|> String.concat ~sep:""

let decode = 
  let rec go acc input =
    if List.is_empty input then acc
    else let (t, rest) = decode_to_tuple input in go (t :: acc) rest in
  String.to_list
  >|> go []
  >|> List.rev
  >|> List.map ~f:(fun (cnt, c) -> repeat cnt c)
  >|> String.concat ~sep:""

Version data entries

80 entries across 80 versions & 1 rubygems

Version Path
trackler-2.1.0.21 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.20 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.19 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.18 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.17 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.16 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.15 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.14 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.13 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.12 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.11 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.10 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.9 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.8 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.7 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.6 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.5 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.4 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.3 tracks/ocaml/exercises/run-length-encoding/example.ml
trackler-2.1.0.2 tracks/ocaml/exercises/run-length-encoding/example.ml