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.

121 lines
5.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

open System
let countSquareElements (lst: int list) : int =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.filter (fun x -> List.contains x squares) |> List.length
let countSquareElementsWithDetails (lst: int list) : int * (int * int) list =
let squares = lst |> List.map (fun x -> x * x)
let squareElements = lst |> List.filter (fun x -> List.contains x squares)
let pairs = squareElements |> List.map (fun x ->
let root = lst |> List.find (fun y -> y * y = x)
(x, root))
(List.length squareElements, pairs)
let findSquareRoots (lst: int list) (element: int) : int list =
lst |> List.filter (fun x -> x * x = element)
let getAllSquarePairs (lst: int list) : (int * int) list =
let squares = lst |> List.map (fun x -> x * x)
lst
|> List.filter (fun x -> List.contains x squares)
|> List.collect (fun square ->
lst
|> List.filter (fun root -> root * root = square)
|> List.map (fun root -> (square, root)))
let getSquareStatistics (lst: int list) : Map<int, int list> =
let squares = lst |> List.map (fun x -> x * x)
lst
|> List.filter (fun x -> List.contains x squares)
|> List.map (fun square ->
let roots = lst |> List.filter (fun root -> root * root = square)
(square, roots))
|> Map.ofList
let hasSquareElements (lst: int list) : bool =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.exists (fun x -> List.contains x squares)
let filterSquareElements (lst: int list) : int list =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.filter (fun x -> List.contains x squares)
let filterNonSquareElements (lst: int list) : int list =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.filter (fun x -> not (List.contains x squares))
let partitionBySquares (lst: int list) : int list * int list =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.partition (fun x -> List.contains x squares)
let countUniqueSquareElements (lst: int list) : int =
let squares = lst |> List.map (fun x -> x * x)
lst |> List.filter (fun x -> List.contains x squares) |> List.distinct |> List.length
let getSquareFrequency (lst: int list) : Map<int, int> =
let squares = lst |> List.map (fun x -> x * x)
lst
|> List.filter (fun x -> List.contains x squares)
|> List.groupBy id
|> List.map (fun (key, values) -> (key, List.length values))
|> Map.ofList
[<EntryPoint>]
let main argv =
let testList1 = [1; 2; 3; 4; 5; 9; 16; 25]
let testList2 = [2; 4; 8; 16; 32]
let testList3 = [1; 4; 9; 16; 25; 36]
let testList4 = [3; 6; 9; 12; 15]
let testList5 = [0; 1; 2; 4; 8; 16]
let testList6 = []
let testList7 = [5; 10; 15; 20]
let testList8 = [-2; -1; 0; 1; 2; 4]
printfn "Тест 1: %A" testList1
printfn "Количество элементов-квадратов: %d" (countSquareElements testList1)
let (count1, pairs1) = countSquareElementsWithDetails testList1
printfn "Детали: количество = %d, пары (квадрат, корень) = %A" count1 pairs1
printfn "Статистика квадратов: %A" (getSquareStatistics testList1)
printfn ""
printfn "Тест 2: %A" testList2
printfn "Количество элементов-квадратов: %d" (countSquareElements testList2)
printfn "Все пары (квадрат, корень): %A" (getAllSquarePairs testList2)
printfn ""
printfn "Тест 3: %A" testList3
printfn "Количество элементов-квадратов: %d" (countSquareElements testList3)
printfn "Элементы-квадраты: %A" (filterSquareElements testList3)
printfn "Элементы-не квадраты: %A" (filterNonSquareElements testList3)
printfn ""
printfn "Тест 4: %A" testList4
printfn "Количество элементов-квадратов: %d" (countSquareElements testList4)
printfn "Есть ли квадраты: %b" (hasSquareElements testList4)
printfn ""
printfn "Тест 5: %A" testList5
printfn "Количество элементов-квадратов: %d" (countSquareElements testList5)
let (squares5, nonSquares5) = partitionBySquares testList5
printfn "Разделение: квадраты = %A, не квадраты = %A" squares5 nonSquares5
printfn ""
printfn "Тест 6 (пустой список): %A" testList6
printfn "Количество элементов-квадратов: %d" (countSquareElements testList6)
printfn ""
printfn "Тест 7: %A" testList7
printfn "Количество элементов-квадратов: %d" (countSquareElements testList7)
printfn ""
printfn "Тест 8 (с отрицательными числами): %A" testList8
printfn "Количество элементов-квадратов: %d" (countSquareElements testList8)
printfn "Уникальные элементы-квадраты: %d" (countUniqueSquareElements testList8)
printfn "Частота квадратов: %A" (getSquareFrequency testList8)
printfn ""
printfn "Поиск корней для элемента 16 в списке %A: %A" testList1 (findSquareRoots testList1 16)
printfn "Поиск корней для элемента 4 в списке %A: %A" testList8 (findSquareRoots testList8 4)
0