From a80643987d4680b179279c11665dbfb79ca73b0a Mon Sep 17 00:00:00 2001 From: EvgrafovMichail Date: Sat, 4 Oct 2025 01:14:06 +0300 Subject: [PATCH] Add tasks for les3 --- README.md | Bin 204 -> 316 bytes solutions/lesson03/task1.py | 3 ++ solutions/lesson03/task2.py | 3 ++ solutions/lesson03/task3.py | 3 ++ tests/test_lesson03_tasks.py | 60 +++++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 solutions/lesson03/task1.py create mode 100644 solutions/lesson03/task2.py create mode 100644 solutions/lesson03/task3.py create mode 100644 tests/test_lesson03_tasks.py diff --git a/README.md b/README.md index fba8712d2e7707a319d9ef7c99e545f3db1ae20e..27b1924ff08f604d5fc40a5ca31f487c71b83165 100644 GIT binary patch delta 39 ucmX@ZxQA)NnTatHyb26XEDkKDEKV#wET$71?RktD^cgf6tQmM2xEKJ<`3K?v delta 6 NcmdnPbcS)l82|~F0_Xq$ diff --git a/solutions/lesson03/task1.py b/solutions/lesson03/task1.py new file mode 100644 index 00000000..f1d8fe26 --- /dev/null +++ b/solutions/lesson03/task1.py @@ -0,0 +1,3 @@ +def flip_bits_in_range(num: int, left_bit: int, right_bit: int) -> int: + # ваш код + return num \ No newline at end of file diff --git a/solutions/lesson03/task2.py b/solutions/lesson03/task2.py new file mode 100644 index 00000000..a3a738c2 --- /dev/null +++ b/solutions/lesson03/task2.py @@ -0,0 +1,3 @@ +def get_cube_root(n: float, eps: float) -> float: + # ваш код + return n \ No newline at end of file diff --git a/solutions/lesson03/task3.py b/solutions/lesson03/task3.py new file mode 100644 index 00000000..5e91a6ac --- /dev/null +++ b/solutions/lesson03/task3.py @@ -0,0 +1,3 @@ +def get_nth_digit(num: int) -> int: + # ваш код + return 0 diff --git a/tests/test_lesson03_tasks.py b/tests/test_lesson03_tasks.py new file mode 100644 index 00000000..157c1f8c --- /dev/null +++ b/tests/test_lesson03_tasks.py @@ -0,0 +1,60 @@ +import pytest + +from solutions.lesson03.task1 import flip_bits_in_range +from solutions.lesson03.task2 import get_cube_root +from solutions.lesson03.task3 import get_nth_digit + + +@pytest.mark.parametrize( + "num, left_bit, right_bit, result_expected", + [ + pytest.param(0b1011, 1, 1, 0b1010, id="invert_lsb"), + pytest.param(0b1011, 2, 2, 0b1001, id="invert_second_bit"), + pytest.param(0b1000, 1, 3, 0b1111, id="invert_bits_1_to_3"), + pytest.param(0b1011, 1, 4, 0b0100, id="invert_all_4_bits"), + pytest.param(0, 1, 5, 0b11111, id="invert_zero_range"), + pytest.param(0b11111, 2, 4, 0b10001, id="invert_middle_bits"), + pytest.param(0b1000000, 7, 7, 0b0000000, id="invert_single_high_bit"), + pytest.param(0b10101010, 1, 8, 0b01010101, id="invert_full_byte"), + pytest.param(0b11111, 1, 5, 0, id="invert_to_zero"), + ], +) +def test_flip_bits_in_range(num: int, left_bit: int, right_bit: int, result_expected: int): + assert flip_bits_in_range(num, left_bit, right_bit) == result_expected + + +@pytest.mark.parametrize( + "n, eps", + [ + pytest.param(27, 1e-6, id="positive_perfect_cube"), + pytest.param(-8, 1e-6, id="negative_perfect_cube"), + pytest.param(0.125, 1e-3, id="fractional_positive"), + pytest.param(-0.001, 1e-3, id="fractional_negative"), + pytest.param(0, 1e-5, id="zero"), + pytest.param(2, 1e-7, id="irrational_root"), + pytest.param(-27, 1e-1, id="negative_large_cube"), + pytest.param(1, 1e-4, id="one"), + pytest.param(-1, 1e-4, id="minus_one"), + pytest.param(0.000001, 1e-1, id="very_small_positive"), + pytest.param(1_000_000_000, 1e-5, id="large_positive_number"), + ], +) +def test_get_cube_root(n: float, eps: float): + result = get_cube_root(n, eps) + assert abs(result**3 - n) < eps + + +@pytest.mark.parametrize( + "n, result_expected", + [ + pytest.param(1, 0, id="one"), + pytest.param(5, 8, id="five"), + pytest.param(10, 1, id="ten"), + pytest.param(100, 0, id="hundred"), + pytest.param(1001, 2, id="thousand_one"), + pytest.param(10**8, 3, id="hundred_million"), + pytest.param(10**9, 6, id="billion"), + ], +) +def test_get_nth_digit(n: int, result_expected: int): + assert get_nth_digit(n) == result_expected