Загрузка данных


class TransmissionSimulator:
    def __init__(self):
        pass

    def parity_encode(self, data):
        return data + str(data.count('1') % 2)
    
    def parity_decode(self, code):
        data, parity = code[:-1], code[-1]
        if data.count('1') % 2 != int(parity):
            return data, "Ошибка обнаружена (четность нарушена)"
        return data, "Ошибок не обнаружено"

    def triple_encode(self, data):
        return "".join([bit * 3 for bit in data])
    
    def triple_decode(self, code):
        restored = ""
        for i in range(0, len(code), 3):
            block = code[i:i+3]
            restored += "1" if block.count('1') >= 2 else "0"
        return restored, "Восстановлено по правилу большинства"

    def hamming_encode(self, data):
        return hamming74_encode(data)
    
    def hamming_decode(self, code):
        syn = hamming74_syndrome(code)
        if syn == 0:
            return code[2:6], "Ошибок нет" # Извлекаем данные d1..d4 (индексы 2,3,4,5)
        else:
            corrected = hamming74_correct(code)
            return corrected[2:6], f"Исправлена ошибка в позиции {syn}"

    def simulate(self, data, method):
        print(f"\n{'='*50}")
        print(f"Моделирование передачи: Метод = {method}, Данные = {data}")
        print(f"{'='*50}")
        
        # 1. Кодирование
        if method == "parity":
            encoded = self.parity_encode(data)
        elif method == "tripling":
            encoded = self.triple_encode(data)
        elif method == "hamming":
            encoded = self.hamming_encode(data)
        print(f"1. Закодированное сообщение: {encoded}")
        
        # 2. Внесение ошибки (случайная позиция)
        broken = list(encoded)
        err_pos = random.randint(0, len(broken) - 1)
        broken[err_pos] = "0" if broken[err_pos] == "1" else "1"
        broken = "".join(broken)
        print(f"2. Внесена ошибка в позицию {err_pos + 1}: {broken}")
        
        # 3. Декодирование и проверка
        if method == "parity":
            decoded, status = self.parity_decode(broken)
        elif method == "tripling":
            decoded, status = self.triple_decode(broken)
        elif method == "hamming":
            decoded, status = self.hamming_decode(broken)
            
        print(f"3. Результат декодирования: {decoded}")
        print(f"4. Статус: {status}")
        print(f"5. Исходные данные: {data}. Совпадение: {'ДА' if decoded == data else 'НЕТ'}")

# Запуск модуля
sim = TransmissionSimulator()
sim.simulate("1011", "parity")
sim.simulate("1011", "tripling")
sim.simulate("1011", "hamming")