You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.0 KiB
128 lines
4.0 KiB
module Task7
|
|
|
|
open System
|
|
open System.Collections.Generic
|
|
|
|
let countFrequencies (lst: 'a list) : ('a * int) list when 'a : equality =
|
|
lst
|
|
|> List.groupBy id
|
|
|> List.map (fun (key, group) -> (key, List.length group))
|
|
|
|
let findMostFrequent (lst: 'a list) : 'a option when 'a : equality =
|
|
if List.isEmpty lst then
|
|
None
|
|
else
|
|
lst
|
|
|> countFrequencies
|
|
|> List.maxBy snd
|
|
|> fst
|
|
|> Some
|
|
|
|
let findMostFrequentWithCount (lst: 'a list) : ('a * int) option when 'a : equality =
|
|
if List.isEmpty lst then
|
|
None
|
|
else
|
|
lst
|
|
|> countFrequencies
|
|
|> List.maxBy snd
|
|
|> Some
|
|
|
|
let findAllMostFrequent (lst: 'a list) : 'a list when 'a : equality =
|
|
if List.isEmpty lst then
|
|
[]
|
|
else
|
|
let frequencies = countFrequencies lst
|
|
let maxCount = frequencies |> List.map snd |> List.max
|
|
frequencies
|
|
|> List.filter (fun (_, count) -> count = maxCount)
|
|
|> List.map fst
|
|
|
|
let getFrequencyStats (lst: 'a list) : Map<'a, int> when 'a : comparison =
|
|
lst
|
|
|> List.groupBy id
|
|
|> List.map (fun (key, group) -> (key, List.length group))
|
|
|> Map.ofList
|
|
|
|
let findLeastFrequent (lst: 'a list) : 'a option when 'a : equality =
|
|
if List.isEmpty lst then
|
|
None
|
|
else
|
|
lst
|
|
|> countFrequencies
|
|
|> List.minBy snd
|
|
|> fst
|
|
|> Some
|
|
|
|
let filterByFrequency (minCount: int) (lst: 'a list) : 'a list when 'a : equality =
|
|
let frequencies = countFrequencies lst
|
|
frequencies
|
|
|> List.filter (fun (_, count) -> count >= minCount)
|
|
|> List.collect (fun (element, count) -> List.replicate count element)
|
|
|
|
let getUniqueElements (lst: 'a list) : 'a list when 'a : equality =
|
|
lst
|
|
|> countFrequencies
|
|
|> List.filter (fun (_, count) -> count = 1)
|
|
|> List.map fst
|
|
|
|
let removeDuplicates (lst: 'a list) : 'a list when 'a : equality =
|
|
lst |> List.distinct
|
|
|
|
let sortByFrequency (ascending: bool) (lst: 'a list) : ('a * int) list when 'a : equality =
|
|
let frequencies = countFrequencies lst
|
|
if ascending then
|
|
frequencies |> List.sortBy snd
|
|
else
|
|
frequencies |> List.sortByDescending snd
|
|
|
|
[<EntryPoint>]
|
|
let main argv =
|
|
let testList1 = [1; 2; 3; 2; 4; 2; 5; 3; 2]
|
|
printfn "Test list 1: %A" testList1
|
|
|
|
match findMostFrequent testList1 with
|
|
| Some element -> printfn "Most frequent element: %A" element
|
|
| None -> printfn "Empty list"
|
|
|
|
match findMostFrequentWithCount testList1 with
|
|
| Some (element, count) -> printfn "Most frequent: %A appears %d times" element count
|
|
| None -> printfn "Empty list"
|
|
|
|
let frequencies1 = countFrequencies testList1
|
|
printfn "All frequencies: %A" frequencies1
|
|
|
|
let testList2 = ["apple"; "banana"; "apple"; "cherry"; "banana"; "apple"]
|
|
printfn "\nTest list 2: %A" testList2
|
|
|
|
match findMostFrequent testList2 with
|
|
| Some element -> printfn "Most frequent string: %A" element
|
|
| None -> printfn "Empty list"
|
|
|
|
let allMostFrequent = findAllMostFrequent [1; 2; 2; 3; 3]
|
|
printfn "\nAll most frequent in [1; 2; 2; 3; 3]: %A" allMostFrequent
|
|
|
|
let stats = getFrequencyStats testList1
|
|
printfn "\nFrequency stats: %A" stats
|
|
|
|
match findLeastFrequent testList1 with
|
|
| Some element -> printfn "Least frequent element: %A" element
|
|
| None -> printfn "Empty list"
|
|
|
|
let filtered = filterByFrequency 2 testList1
|
|
printfn "Elements appearing at least 2 times: %A" filtered
|
|
|
|
let unique = getUniqueElements testList1
|
|
printfn "Unique elements (appearing once): %A" unique
|
|
|
|
let noDuplicates = removeDuplicates testList1
|
|
printfn "List without duplicates: %A" noDuplicates
|
|
|
|
let sortedByFreq = sortByFrequency false testList1
|
|
printfn "Sorted by frequency (descending): %A" sortedByFreq
|
|
|
|
let emptyList = []
|
|
match findMostFrequent emptyList with
|
|
| Some element -> printfn "Should not happen: %A" element
|
|
| None -> printfn "\nEmpty list handled correctly"
|
|
|
|
0 |