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

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