parent
c5c2f7f3db
commit
c5e570d1b3
@ -0,0 +1,128 @@
|
|||||||
|
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
|
@ -0,0 +1,8 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
Loading…
Reference in new issue