diff --git a/lab6/Makefile b/lab6/Makefile index 363b63a..bea93cc 100644 --- a/lab6/Makefile +++ b/lab6/Makefile @@ -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 diff --git a/lab6/task7/Program.fs b/lab6/task7/Program.fs new file mode 100644 index 0000000..79c51fa --- /dev/null +++ b/lab6/task7/Program.fs @@ -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 + +[] +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 \ No newline at end of file diff --git a/lab6/task7/task7.fsproj b/lab6/task7/task7.fsproj new file mode 100644 index 0000000..1cddbd7 --- /dev/null +++ b/lab6/task7/task7.fsproj @@ -0,0 +1,8 @@ + + + + Exe + net7.0 + + + \ No newline at end of file