open System let rec gcd a b = if b = 0 then a else gcd b (a % b) let isPrime n = if n < 2 then false else [2 .. int (sqrt (float n))] |> List.forall (fun i -> n % i <> 0) let getDivisors n = [1 .. n] |> List.filter (fun i -> n % i = 0) let getPrimeDivisors n = getDivisors n |> List.filter isPrime let getDigits n = n.ToString().ToCharArray() |> Array.map (fun c -> int c - int '0') |> Array.toList let task1 seq1 seq2 = let arr1 = Array.ofList seq1 let arr2 = Array.ofList seq2 let m = arr1.Length let n = arr2.Length let dp = Array2D.create (m + 1) (n + 1) 0 for i in 1 .. m do for j in 1 .. n do if arr1.[i-1] = arr2.[j-1] then dp.[i, j] <- dp.[i-1, j-1] + 1 else dp.[i, j] <- max dp.[i-1, j] dp.[i, j-1] let rec buildLCS i j acc = if i = 0 || j = 0 then acc elif arr1.[i-1] = arr2.[j-1] then buildLCS (i-1) (j-1) (arr1.[i-1] :: acc) elif dp.[i-1, j] > dp.[i, j-1] then buildLCS (i-1) j acc else buildLCS i (j-1) acc buildLCS m n [] let task2 inputList = let list1 = inputList |> List.filter (fun x -> x % 2 = 0) |> List.map (fun x -> x / 2) let list2 = list1 |> List.filter (fun x -> x % 3 = 0) |> List.map (fun x -> x / 3) let list3 = list2 |> List.map (fun x -> x * x) let list4 = list3 |> List.filter (fun x -> List.contains x list1) let list5 = [list2; list3; list4] |> List.collect id |> List.distinct (list1, list2, list3, list4, list5) let task3 n = [1 .. n] |> List.collect (fun x -> [x .. n / x] |> List.filter (fun y -> x * y = n) |> List.map (fun y -> let d = gcd x y (x / d, y / d))) |> List.distinct let task4 inputList = inputList |> List.collect (fun a -> inputList |> List.collect (fun b -> inputList |> List.filter (fun c -> a < b && b < c && a*a + b*b = c*c) |> List.map (fun c -> (a, b, c)))) let task5 inputList = inputList |> List.filter (fun x -> let primeDivisors = getPrimeDivisors x primeDivisors |> List.forall (fun p -> inputList |> List.exists (fun y -> y <> x && y % p = 0))) let task6 tupleList = tupleList |> List.filter (fun (a,b,c,d,e) -> [a;b;c;d;e] |> List.forall (fun x -> x >= 0 && x <= 9)) |> List.sort |> List.map (fun (a,b,c,d,e) -> a*10000 + b*1000 + c*100 + d*10 + e) let task7 inputList = let average = (inputList |> List.sum |> float) / (float inputList.Length) let belowAverage = inputList |> List.filter (fun x -> float x < average) let evenPositions = inputList |> List.mapi (fun i x -> if i % 2 = 0 then Some x else None) |> List.choose id let parameterP x = let divisors = getDivisors x divisors |> List.filter (fun d -> let isInEvenPos = evenPositions |> List.exists (fun ep -> ep % d = 0) let isNotInBelowAvg = belowAverage |> List.forall (fun ba -> ba % d <> 0) isInEvenPos && isNotInBelowAvg) |> List.sum inputList |> List.sortBy parameterP let task8 inputList = let allDigits = inputList |> List.collect getDigits let digitFreq = allDigits |> List.groupBy id |> List.map (fun (d, ds) -> (d, List.length ds)) let totalFreq = allDigits.Length let threshold = totalFreq / 2 let frequentDigits = digitFreq |> List.filter (fun (_, freq) -> freq > threshold) |> List.map fst inputList |> List.map (fun x -> let digits = getDigits x let validDigits = digits |> List.filter (fun d -> List.contains d frequentDigits) if validDigits.IsEmpty then 0.0 else (validDigits |> List.sum |> float) / (float validDigits.Length)) let task9 inputList = let rec sumPrevious lst acc = match lst with | [] -> [] | x::xs -> acc :: sumPrevious xs (acc + x) let prefixSums = sumPrevious inputList 0 let squares = inputList |> List.map (fun x -> x * x) |> Set.ofList inputList |> List.mapi (fun i x -> let sumPrev = if i = 0 then 0 else prefixSums.[i-1] let isGreaterThanSum = x > sumPrev let isPerfectSquare = inputList |> List.exists (fun y -> y * y = x) let isDivisibleByAll = if i = 0 then true else inputList.[0..i-1] |> List.forall (fun y -> x % y = 0) if isGreaterThanSum && isPerfectSquare && isDivisibleByAll then let greaterCount = inputList |> List.filter (fun y -> y > x) |> List.length Some (x, sumPrev, greaterCount) else None) |> List.choose id let task10 (inputList: int list) = let indices = [0 .. inputList.Length - 1] let list2 = indices |> List.filter (fun i -> inputList |> List.exists (fun x -> inputList |> List.exists (fun y -> x <> y && x * y = inputList.[i]))) let list3 = indices |> List.filter (fun i -> inputList |> List.exists (fun x -> inputList |> List.exists (fun y -> inputList |> List.exists (fun z -> x <> y && y <> z && x <> z && x + y + z = inputList.[i])))) let list4 = indices |> List.filter (fun i -> let divisors = inputList |> List.filter (fun x -> inputList.[i] % x = 0) divisors.Length = 4) (list2, list3, list4) let showMenu() = printfn "\n=== Меню задач ===" printfn "1. Наибольшая общая подпоследовательность" printfn "2. Кортеж из пяти списков с преобразованиями" printfn "3. Кортежи для факторизации числа" printfn "4. Пифагоровы тройки" printfn "5. Элементы со всеми простыми делителями в списке" printfn "6. Сортировка кортежей с преобразованием в числа" printfn "7. Сортировка по сумме специфических делителей" printfn "8. Среднее арифметическое частых цифр" printfn "9. Фильтрация по трем условиям" printfn "10. Кортеж из трех списков номеров" printfn "0. Выход" printf "Выберите задачу: " let runTask taskNumber = match taskNumber with | 1 -> printfn "Задача 1: Наибольшая общая подпоследовательность" let seq1 = [1; 2; 3; 4; 5] let seq2 = [2; 3; 5; 7] let result = task1 seq1 seq2 printfn "Последовательность 1: %A" seq1 printfn "Последовательность 2: %A" seq2 printfn "Наибольшая общая подпоследовательность: %A" result | 2 -> printfn "Задача 2: Кортеж из пяти списков" let inputList = [6; 9; 12; 15; 18; 21] let (list1, list2, list3, list4, list5) = task2 inputList printfn "Исходный список: %A" inputList printfn "Список 1 (четные/2): %A" list1 printfn "Список 2 (список1, делящиеся на 3, /3): %A" list2 printfn "Список 3 (квадраты списка2): %A" list3 printfn "Список 4 (список3, встречающиеся в списке1): %A" list4 printfn "Список 5 (объединение 2,3,4): %A" list5 | 3 -> printfn "Задача 3: Кортежи для факторизации" let n = 12 let result = task3 n printfn "Число N = %d" n printfn "Кортежи (a,b): %A" result | 4 -> printfn "Задача 4: Пифагоровы тройки" let inputList = [3; 4; 5; 6; 8; 10; 12; 13; 15] let result = task4 inputList printfn "Исходный список: %A" inputList printfn "Пифагоровы тройки: %A" result | 5 -> printfn "Задача 5: Элементы со всеми простыми делителями в списке" let inputList = [6; 10; 15; 21; 30] let result = task5 inputList printfn "Исходный список: %A" inputList printfn "Элементы со всеми простыми делителями в списке: %A" result | 6 -> printfn "Задача 6: Сортировка кортежей" let tupleList = [(7,3,4,5,6); (2,3,4,6,7); (2,3,4,5,6); (4,3,1,0,4)] let result = task6 tupleList printfn "Исходные кортежи: %A" tupleList printfn "Отсортированные числа: %A" result | 7 -> printfn "Задача 7: Сортировка по параметру P" let inputList = [12; 18; 24; 30; 36] let result = task7 inputList printfn "Исходный список: %A" inputList printfn "Отсортированный по параметру P: %A" result | 8 -> printfn "Задача 8: Среднее арифметическое частых цифр" let inputList = [145; 247; 456; 789] let result = task8 inputList printfn "Исходный список: %A" inputList printfn "Средние значения частых цифр: %A" result | 9 -> printfn "Задача 9: Фильтрация по трем условиям" let inputList = [1; 2; 4; 8; 16; 32] let result = task9 inputList printfn "Исходный список: %A" inputList printfn "Элементы, удовлетворяющие условиям: %A" result | 10 -> printfn "Задача 10: Кортеж из трех списков номеров" let inputList = [2; 4; 6; 8; 12; 16] let (list2, list3, list4) = task10 inputList printfn "Исходный список: %A" inputList printfn "Номера элементов - произведения двух других: %A" list2 printfn "Номера элементов - суммы трех других: %A" list3 printfn "Номера элементов, делящихся на 4 элемента: %A" list4 | _ -> printfn "Неверный номер задачи!" [] let main argv = let mutable shouldContinue = true while shouldContinue do showMenu() match Console.ReadLine() with | "0" -> shouldContinue <- false printfn "До свидания!" | input -> match Int32.TryParse(input) with | true, taskNumber when taskNumber >= 1 && taskNumber <= 10 -> printfn "" runTask taskNumber printfn "\nНажмите Enter для продолжения..." Console.ReadLine() |> ignore | _ -> printfn "Пожалуйста, введите число от 0 до 10." 0