Sha256: b8823ab7e4198500519cb22482063f10b84d7dfad9357236e7e6d2897ced5dee

Contents?: true

Size: 1.64 KB

Versions: 284

Compression:

Stored size: 1.64 KB

Contents

module RunLengthEncoding exposing (version, encode, decode)

import String exposing (fromChar)
import List exposing (head, tail)
import Maybe exposing (withDefault)
import Regex


{-
   To the unaware: this was written by a very green elmer, so don't consider
   it an idiomatic exemplar to emulate.
-}


version =
    2


encode : String -> String
encode string =
    String.toList string
        |> List.foldr countChars []
        |> List.map stringifyCounts
        |> String.join ""


countChars : a -> List ( number, a ) -> List ( number, a )
countChars current counted =
    case head counted of
        Just ( count, previous ) ->
            if previous == current then
                ( count + 1, current ) :: withDefault [] (tail counted)
            else
                ( 1, current ) :: counted

        Nothing ->
            [ ( 1, current ) ]


stringifyCounts : ( comparable, Char ) -> String
stringifyCounts ( count, char ) =
    if count > 1 then
        toString count ++ fromChar char
    else
        fromChar char


decode : String -> String
decode string =
    string
        |> Regex.find Regex.All (Regex.regex "(\\d+)|(\\D)")
        |> List.map .match
        |> List.foldl expandCounts ( "", Nothing )
        |> Tuple.first


expandCounts : String -> ( String, Maybe Int ) -> ( String, Maybe Int )
expandCounts match ( result, count ) =
    case count of
        Just number ->
            ( result ++ String.repeat number match, Nothing )

        Nothing ->
            case String.toInt match of
                Ok number ->
                    ( result, Just number )

                Err _ ->
                    ( result ++ match, Nothing )

Version data entries

284 entries across 284 versions & 1 rubygems

Version Path
trackler-2.2.1.104 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.103 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.102 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.101 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.100 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.99 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.98 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.97 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.96 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.95 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.94 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.93 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.92 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.91 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.90 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.89 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.88 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.87 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.86 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm
trackler-2.2.1.85 tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm