From f3dc8ebe8cfe9d02deba805a60f37cd8a924bd59 Mon Sep 17 00:00:00 2001 From: Artem-Darius Weber Date: Thu, 17 Apr 2025 14:08:02 +0300 Subject: [PATCH] =?UTF-8?q?(lab=205)=20feat:=20task-13:=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?UTF-8?q?=D0=B0=20MutuallyPrimeTraversal=20=D0=B4=D0=BB=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=85=D0=BE=D0=B4=D0=B0=20=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 13 +++- compose.yaml | 9 +++ .../MutuallyPrimeTraversal.fsproj | 13 ++++ lab 5/MutuallyPrimeTraversal/Program.fs | 72 +++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj create mode 100644 lab 5/MutuallyPrimeTraversal/Program.fs diff --git a/Makefile b/Makefile index 407e812..08a856f 100644 --- a/Makefile +++ b/Makefile @@ -41,11 +41,14 @@ run-lab5-favorite-lang: run-lab5-favorite-lang-fp: dotnet run --project "lab 5/FavoriteLangFP/FavoriteLangFP.fsproj" +run-lab5-mutually-prime: + dotnet run --project "lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj" + # Запуск Lab 5 run-all-lab5: run-lab5-hello-world run-lab5-quadratic-equation run-lab5-circle-cylinder \ run-lab5-number-operations run-lab5-recursion-types run-lab5-function-factory \ run-lab5-number-traversal run-lab5-lambda-traversal run-lab5-conditional-traversal \ - run-lab5-number-examples run-lab5-favorite-lang run-lab5-favorite-lang-fp + run-lab5-number-examples run-lab5-favorite-lang run-lab5-favorite-lang-fp run-lab5-mutually-prime help: @echo "Доступные команды:" @@ -72,6 +75,7 @@ help: @echo " make run-lab5-number-examples - Запустить практические примеры работы с числами" @echo " make run-lab5-favorite-lang - Запустить программу о любимом языке программирования" @echo " make run-lab5-favorite-lang-fp - Запустить программу о любимом языке с суперпозицией и каррированием" + @echo " make run-lab5-mutually-prime - Запустить программу обхода взаимно простых компонентов числа" clean: dotnet clean @@ -87,13 +91,13 @@ lab5-docker-build: docker compose build lab5-hello-world lab5-quadratic-equation lab5-circle-and-cylinder \ lab5-number-operations lab5-recursion-types lab5-function-factory \ lab5-number-traversal lab5-lambda-traversal lab5-conditional-traversal \ - lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp + lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp lab5-mutually-prime lab5-docker-run: docker compose up lab5-hello-world lab5-quadratic-equation lab5-circle-and-cylinder \ lab5-number-operations lab5-recursion-types lab5-function-factory \ lab5-number-traversal lab5-lambda-traversal lab5-conditional-traversal \ - lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp + lab5-number-examples lab5-favorite-lang lab5-favorite-lang-fp lab5-mutually-prime # Docker lab 5 отдельные программы lab5-hello-world-docker-run: @@ -132,6 +136,9 @@ lab5-favorite-lang-docker-run: lab5-favorite-lang-fp-docker-run: docker compose up lab5-favorite-lang-fp +lab5-mutually-prime-docker-run: + docker compose up lab5-mutually-prime + ci-local: circleci config validate circleci local execute diff --git a/compose.yaml b/compose.yaml index 1c6f39e..3f9d165 100644 --- a/compose.yaml +++ b/compose.yaml @@ -116,4 +116,13 @@ services: volumes: - ./lab 5/FavoriteLangFP:/app stdin_open: true + tty: true + + lab5-mutually-prime: + build: + context: ./lab 5/MutuallyPrimeTraversal + dockerfile: ../../Individual Task 1/Dockerfile + volumes: + - ./lab 5/MutuallyPrimeTraversal:/app + stdin_open: true tty: true \ No newline at end of file diff --git a/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj b/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj new file mode 100644 index 0000000..7e0dd2a --- /dev/null +++ b/lab 5/MutuallyPrimeTraversal/MutuallyPrimeTraversal.fsproj @@ -0,0 +1,13 @@ + + + + Exe + net7.0 + MutuallyPrimeTraversal + + + + + + + \ No newline at end of file diff --git a/lab 5/MutuallyPrimeTraversal/Program.fs b/lab 5/MutuallyPrimeTraversal/Program.fs new file mode 100644 index 0000000..6579976 --- /dev/null +++ b/lab 5/MutuallyPrimeTraversal/Program.fs @@ -0,0 +1,72 @@ +open System + +// НОД двух чисел +let rec gcd a b = + if b = 0 then abs a + else gcd b (a % b) + +// взаимно простые? (НОД равен 1) +let areCoprime a b = + gcd a b = 1 + +// обход взаимно простых компонентов числа +// Args: +// - n: число, с которым ищем взаимно простые числа +// - operation: функция +// - initialValue: начальное значение для операции +let traverseCoprime (n: int) (operation: int -> int -> int) (initialValue: int) = + // Проходим по всем числам от 1 до n + [1..n] + |> List.filter (fun i -> areCoprime n i) + |> List.fold operation initialValue + +// примеры операций для использования с traverseCoprime +let sum a b = a + b +let product a b = a * b +let min a b = if a < b then a else b +let max a b = if a > b then a else b +let count _ b = b + 1 + +[] +let main argv = + Console.OutputEncoding <- Text.Encoding.UTF8 + + printfn "Задание 13. Обход взаимно простых компонентов числа." + + printf "Введите число: " + let n = + match Int32.TryParse(Console.ReadLine()) with + | true, value when value > 0 -> value + | _ -> + printfn "Некорректный ввод. Используется значение по умолчанию 12." + 12 + + let coprimes = [1..n] |> List.filter (fun i -> areCoprime n i) + printfn "Числа, взаимно простые с %d: %A" n coprimes + + let sumResult = traverseCoprime n sum 0 + printfn "Сумма взаимно простых чисел: %d" sumResult + + let productResult = traverseCoprime n product 1 + printfn "Произведение взаимно простых чисел: %d" productResult + + let minResult = traverseCoprime n min Int32.MaxValue + printfn "Минимальное взаимно простое число: %d" minResult + + let maxResult = traverseCoprime n max Int32.MinValue + printfn "Максимальное взаимно простое число: %d" maxResult + + let countResult = traverseCoprime n count 0 + printfn "Количество взаимно простых чисел: %d" countResult + + printfn "\nПримеры пользовательских функций:" + + let sumOfSquares a b = a + b * b + let sumSquaresResult = traverseCoprime n sumOfSquares 0 + printfn "Сумма квадратов взаимно простых чисел: %d" sumSquaresResult + + let productOfDifferences a b = a * (abs (n - b)) + let prodDiffResult = traverseCoprime n productOfDifferences 1 + printfn "Произведение модулей разности (n - число): %d" prodDiffResult + + 0 \ No newline at end of file