lab 6 task 7

main
Artem-Darius Weber 6 months ago
parent c5c2f7f3db
commit c5e570d1b3

@ -1,4 +1,4 @@
.PHONY: run build clean task1 build-task1 clean-task1 task2 build-task2 clean-task2 task3 build-task3 clean-task3 task4 build-task4 clean-task4 task5 build-task5 clean-task5 task6 build-task6 clean-task6
.PHONY: run build clean task1 build-task1 clean-task1 task2 build-task2 clean-task2 task3 build-task3 clean-task3 task4 build-task4 clean-task4 task5 build-task5 clean-task5 task6 build-task6 clean-task6 task7 build-task7 clean-task7
# task1
run:
@ -71,3 +71,13 @@ build-task6:
clean-task6:
cd task6 && dotnet clean
# task7
task7:
cd task7 && dotnet run --project task7.fsproj
build-task7:
cd task7 && dotnet build
clean-task7:
cd task7 && dotnet clean

@ -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…
Cancel
Save