From aa3ce6052b1b641ddd034796f42bf97422b18516 Mon Sep 17 00:00:00 2001 From: Shidimmah Date: Sun, 26 Jan 2025 21:58:39 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=97=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 25 +++++++++++++++++ .idea/.gitignore | 3 ++ .idea/OtusArchitecture.iml | 8 ++++++ .idea/inspectionProfiles/Project_Default.xml | 27 ++++++++++++++++++ .../inspectionProfiles/profiles_settings.xml | 6 ++++ .idea/misc.xml | 7 +++++ .idea/modules.xml | 8 ++++++ .idea/vcs.xml | 6 ++++ README.md | 2 ++ requirements.txt | 1 + solver.py | 28 +++++++++++++++++++ unit tests/test_solver.py | 26 +++++++++++++++++ 12 files changed, 147 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .idea/.gitignore create mode 100644 .idea/OtusArchitecture.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 requirements.txt create mode 100644 solver.py create mode 100644 unit tests/test_solver.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c35007a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run tests + run: | + PYTHONPATH=. pytest diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/OtusArchitecture.iml b/.idea/OtusArchitecture.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/OtusArchitecture.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..06afcf9 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..812ab5a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1e2b37c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe4760c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# OtusArchitecture +ДЗ по архитектурным шаблонам diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..55b033e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pytest \ No newline at end of file diff --git a/solver.py b/solver.py new file mode 100644 index 0000000..acc2f4b --- /dev/null +++ b/solver.py @@ -0,0 +1,28 @@ +import math + +def solve(a, b, c): + # Проверяем, что все коэффициенты являются конечными числами + if not all(map(math.isfinite, [a, b, c])): + raise ValueError("Коэффициенты должны быть конечными.") + + # Проверка на то, что a не равно 0 + if abs(a) < 1e-9: + raise ValueError("Коэффициент а не может быть нулём.") + + # Вычисляем дискриминант + discriminant = b ** 2 - 4 * a * c + + # Сравниваем дискриминант с нулем с учетом эпсилон + epsilon = 1e-9 + if discriminant > epsilon: + # Два различных корня + root1 = (-b + math.sqrt(discriminant)) / (2 * a) + root2 = (-b - math.sqrt(discriminant)) / (2 * a) + return [root1, root2] + elif discriminant < -epsilon: + # Нет корней + return [] + else: + # Один корень кратности два (дискриминант близок к нулю) + root = -b / (2 * a) + return [root] diff --git a/unit tests/test_solver.py b/unit tests/test_solver.py new file mode 100644 index 0000000..a70deb8 --- /dev/null +++ b/unit tests/test_solver.py @@ -0,0 +1,26 @@ +import pytest +from solver import solve + +def test_no_roots(): + assert solve(1, 0, 1) == [] + +def test_two_roots(): + roots = solve(1, 0, -1) + assert len(roots) == 2 + assert 1 in roots and -1 in roots + +def test_one_root(): + assert solve(1, 2, 1) == [-1] + +def test_a_is_zero(): + with pytest.raises(ValueError): + solve(0, 1, 1) + +def test_non_numeric_coefficients(): + with pytest.raises(TypeError): + solve("a", 1, 1) + +def test_discriminant_near_zero(): + # Коэффициенты подобраны так, чтобы дискриминант был меньше 1e-9 + assert solve(1, -2, 1 + 1e-10) == [1] + From cc348f86748b45de5119b82ad8558c5d35a45659 Mon Sep 17 00:00:00 2001 From: Shidimmah Date: Sun, 26 Jan 2025 21:59:33 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=97=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 --- .idea/OtusArchitecture.iml | 8 ------ .idea/inspectionProfiles/Project_Default.xml | 27 ------------------- .../inspectionProfiles/profiles_settings.xml | 6 ----- .idea/misc.xml | 7 ----- .idea/modules.xml | 8 ------ .idea/vcs.xml | 6 ----- 7 files changed, 65 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/OtusArchitecture.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/OtusArchitecture.iml b/.idea/OtusArchitecture.iml deleted file mode 100644 index d0876a7..0000000 --- a/.idea/OtusArchitecture.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 06afcf9..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 812ab5a..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1e2b37c..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file