diff --git a/src/control_test/task1.py b/src/control_test/task1.py new file mode 100644 index 0000000..69fedec --- /dev/null +++ b/src/control_test/task1.py @@ -0,0 +1,38 @@ +import random + + +class Walker: + def __init__(self, events): + self.events = [] # events = [(event, probability)] + self.n = len(events) + self.probabil = [0] * self.n + self.alias = [0] * self.n + + probs = [] + sumprob = 0 + for event, p in events: + if p < 0: + raise ValueError("вероятность должна быть положительна") + self.events.append(event) + probs.append(p) + sumprob += p + + if sumprob != 1.0: + raise ValueError("сумма вероятностей должна быть = 1") + + wal = [p * self.n for p in probs] + + for i in range(self.n): + if wal[i] >= 1: + self.probabil[i] = 1 + self.alias[i] = i + else: + self.prob[i] = wal[i] + self.alias[i] = (i + 1) % self.n + + def get_random(self): + i = random.randint(0, self.n - 1) + if random.random() < self.probabil[i]: + return self.events[i] + else: + return self.events[self.alias[i]] diff --git a/src/control_test/task2.py b/src/control_test/task2.py new file mode 100644 index 0000000..fcdb45e --- /dev/null +++ b/src/control_test/task2.py @@ -0,0 +1,22 @@ +def hamming_encode(bits): + result = "" + for i in range(0, len(bits), 4): + d = list(map(int, bits[i : i + 4])) + p1 = d[0] ^ d[1] ^ d[3] + p2 = d[0] ^ d[2] ^ d[3] + p3 = d[1] ^ d[2] ^ d[3] + result += f"{p1}{p2}{d[0]}{p3}{d[1]}{d[2]}{d[3]}" + return result + + +def hamming_decode(bits): + bits = list(map(int, bits)) + for i in range(0, len(bits), 7): + b = bits[i : i + 7] + s1 = b[0] ^ b[2] ^ b[4] ^ b[6] + s2 = b[1] ^ b[2] ^ b[5] ^ b[6] + s3 = b[3] ^ b[4] ^ b[5] ^ b[6] + error = s1 * 1 + s2 * 2 + s3 * 4 + if error != 0: + return i + error + return -1 diff --git a/tests/test_control_task1.py b/tests/test_control_task1.py new file mode 100644 index 0000000..1811f1e --- /dev/null +++ b/tests/test_control_task1.py @@ -0,0 +1,12 @@ +import pytest +from src.control_test.task1 import Walker + + +def test_negative(): + with pytest.raises(ValueError): + Walker([("A", 0.5), ("B", -0.5)]) + + +def test_sum_not_one(): + with pytest.raises(ValueError): + Walker([("A", 0.6), ("B", 0.3)]) diff --git a/tests/test_control_task2.py b/tests/test_control_task2.py new file mode 100644 index 0000000..911b9c1 --- /dev/null +++ b/tests/test_control_task2.py @@ -0,0 +1,9 @@ +import pytest +from src.control_test.task2 import hamming_encode +from src.control_test.task2 import hamming_decode + + +def test_encode_decode(): + bits = "10110011" + encoded = hamming_encode(bits) + assert hamming_decode(encoded) == -1