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.

182 lines
7.1 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 digitSum (n: int) : int =
let rec sumDigits acc num =
if num = 0 then acc
else sumDigits (acc + (num % 10)) (num / 10)
sumDigits 0 (abs n)
let countDivisors (n: int) : int =
let absN = abs n
if absN = 0 then 0
elif absN = 1 then 1
else
[1..absN]
|> List.filter (fun x -> absN % x = 0)
|> List.length
let sortByDescending (lst: int list) : int list =
lst |> List.sortByDescending id
let sortByDigitSumAscending (lst: int list) : int list =
lst
|> List.sortBy (fun x -> (digitSum x, -(abs x)))
let sortByDivisorCountDescending (lst: int list) : int list =
lst
|> List.sortBy (fun x -> (-(countDivisors x), -(abs x)))
let createTupleList (listA: int list) (listB: int list) (listC: int list) : (int * int * int) list =
let sortedA = sortByDescending listA
let sortedB = sortByDigitSumAscending listB
let sortedC = sortByDivisorCountDescending listC
let minLength = [List.length sortedA; List.length sortedB; List.length sortedC] |> List.min
[0..minLength-1]
|> List.map (fun i -> (sortedA.[i], sortedB.[i], sortedC.[i]))
let analyzeList (lst: int list) (name: string) : unit =
printfn "Анализ списка %s: %A" name lst
printfn " Суммы цифр: %A" (lst |> List.map digitSum)
printfn " Количество делителей: %A" (lst |> List.map countDivisors)
printfn " По убыванию: %A" (sortByDescending lst)
printfn " По возрастанию суммы цифр: %A" (sortByDigitSumAscending lst)
printfn " По убыванию количества делителей: %A" (sortByDivisorCountDescending lst)
printfn ""
let validateUniqueness (lst: int list) (name: string) : bool =
let unique = lst |> List.distinct
let isUnique = List.length lst = List.length unique
if not isUnique then
printfn "Предупреждение: список %s содержит повторяющиеся элементы!" name
isUnique
let createTupleListSafe (listA: int list) (listB: int list) (listC: int list) : (int * int * int) list =
let _ = validateUniqueness listA "A"
let _ = validateUniqueness listB "B"
let _ = validateUniqueness listC "C"
createTupleList listA listB listC
let demonstrateSorting (lst: int list) (name: string) : unit =
printfn "Демонстрация сортировки для списка %s: %A" name lst
let withDigitSum = lst |> List.map (fun x -> (x, digitSum x))
let withDivisors = lst |> List.map (fun x -> (x, countDivisors x))
printfn " Элементы с суммой цифр: %A" withDigitSum
printfn " Элементы с количеством делителей: %A" withDivisors
printfn " Сортировка по возрастанию суммы цифр:"
withDigitSum
|> List.sortBy (fun (x, sum) -> (sum, -(abs x)))
|> List.iter (fun (x, sum) -> printfn " %d (сумма цифр: %d)" x sum)
printfn " Сортировка по убыванию количества делителей:"
withDivisors
|> List.sortBy (fun (x, count) -> (-count, -(abs x)))
|> List.iter (fun (x, count) -> printfn " %d (делителей: %d)" x count)
printfn ""
let getElementAtPosition (lst: 'a list) (position: int) (listName: string) : 'a option =
if position >= 0 && position < List.length lst then
Some lst.[position]
else
printfn "Позиция %d выходит за границы списка %s (длина: %d)" position listName (List.length lst)
None
let createTupleListWithValidation (listA: int list) (listB: int list) (listC: int list) : (int * int * int) list =
printfn "Создание списка кортежей из трех списков:"
printfn "Список A: %A" listA
printfn "Список B: %A" listB
printfn "Список C: %A" listC
printfn ""
let sortedA = sortByDescending listA
let sortedB = sortByDigitSumAscending listB
let sortedC = sortByDivisorCountDescending listC
printfn "После сортировки:"
printfn "A (по убыванию): %A" sortedA
printfn "B (по возрастанию суммы цифр): %A" sortedB
printfn "C (по убыванию количества делителей): %A" sortedC
printfn ""
let minLength = [List.length sortedA; List.length sortedB; List.length sortedC] |> List.min
printfn "Минимальная длина списков: %d" minLength
printfn ""
let result = [0..minLength-1] |> List.map (fun i -> (sortedA.[i], sortedB.[i], sortedC.[i]))
printfn "Результирующие кортежи:"
result |> List.iteri (fun i (a, b, c) -> printfn " %d: (%d, %d, %d)" (i+1) a b c)
printfn ""
result
[<EntryPoint>]
let main argv =
printfn "=== Задание 9: Составление списка кортежей из трех списков ==="
printfn ""
let testA1 = [10; 5; 20; 15; 8]
let testB1 = [123; 45; 678; 12; 99]
let testC1 = [12; 18; 24; 30; 6]
printfn "Тест 1:"
let result1 = createTupleListWithValidation testA1 testB1 testC1
printfn "=== Детальный анализ списков ==="
analyzeList testA1 "A1"
analyzeList testB1 "B1"
analyzeList testC1 "C1"
let testA2 = [100; 50; 25; 75]
let testB2 = [111; 222; 333; 444]
let testC2 = [16; 20; 24; 28]
printfn "Тест 2:"
let result2 = createTupleListWithValidation testA2 testB2 testC2
let testA3 = [7; 14; 21; 28; 35]
let testB3 = [19; 28; 37; 46]
let testC3 = [15; 21; 35; 45]
printfn "Тест 3 (разные длины списков):"
let result3 = createTupleListWithValidation testA3 testB3 testC3
printfn "=== Демонстрация сортировки ==="
demonstrateSorting testB1 "B1"
demonstrateSorting testC1 "C1"
printfn "=== Тест с повторяющимися элементами ==="
let testA4 = [10; 20; 10; 30]
let testB4 = [123; 123; 456]
let testC4 = [12; 18; 12]
printfn "Тест 4 (с повторяющимися элементами):"
let result4 = createTupleListSafe testA4 testB4 testC4
printfn "=== Тест граничных случаев ==="
printfn "Тест 5 (пустые списки):"
let result5 = createTupleList [] [] []
printfn "Результат для пустых списков: %A" result5
printfn ""
printfn "Тест 6 (однозначные числа):"
let testA6 = [9; 8; 7; 6; 5]
let testB6 = [1; 2; 3; 4; 5]
let testC6 = [6; 4; 3; 2; 1]
let result6 = createTupleListWithValidation testA6 testB6 testC6
printfn "=== Тест с отрицательными числами ==="
let testA7 = [-10; -5; 15; 20]
let testB7 = [-123; 45; -67; 89]
let testC7 = [-12; 18; -24; 30]
printfn "Тест 7 (с отрицательными числами):"
let result7 = createTupleListWithValidation testA7 testB7 testC7
0