Problem 28.b

Sort list of lists by the frequency of the list length.

Solution 1

sortByLengthFrequency : List (List a) -> List (List a)
sortByLengthFrequency xs =
    xs
     |> List.map (\ys -> freq ys xs )
     |> List.sortBy Tuple.first
     |> List.map Tuple.second


freq: List a -> List (List a) -> (Int, List a)
freq xs list =
  ( list 
      |> List.filter (\ys -> List.length ys == List.length xs)
      |> List.length
  , xs
  )

Solution 2

This solution is similar to the first, but replaces the list of length/frequency pairs with a Dict. Lengths are the dictionary keys, and frequencies are the value.


sortByLengthFrequency : List (List a) -> List (List a)
sortByLengthFrequency xs =
    let
        freqs =
            lenFreq xs Dict.empty
    in
        List.sortBy (sortLenFreq freqs) xs


sortLenFreq : Dict.Dict Int Int -> List a -> Int
sortLenFreq lenFreqs xs =
    case Dict.get (List.length xs) lenFreqs of
        -- should never get Nothing
        Nothing ->
            -1

        Just freq ->
            freq


lenFreq : List (List a) -> Dict.Dict Int Int -> Dict.Dict Int Int
lenFreq xs d =
    case xs of
        [] ->
            Dict.empty

        l :: ls ->
            let
                len =
                    List.length l

                ( sameLength, otherLengths ) =
                    List.partition (\x -> List.length x == len) xs

                freq =
                    List.length sameLength
            in
                if List.isEmpty otherLengths then
                    Dict.insert len freq d
                else
                    lenFreq otherLengths (Dict.insert len freq d)

Back to problem

results matching ""

    No results matching ""