Skip to content

Commit 516c15a

Browse files
committed
rzsdfhlk;'
'
1 parent 0c7a8a4 commit 516c15a

File tree

9 files changed

+84
-0
lines changed

9 files changed

+84
-0
lines changed

informatics/sem1/lab2/2.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from validators import Validator
2+
from CheckHamming import CheckHamming
3+
4+
from math import log2
5+
6+
def main():
7+
while True:
8+
inp_bits = input("Введите количество бит: ")
9+
if not Validator.ValidateBits(inp_bits):
10+
print("Некорректное количество бит")
11+
continue
12+
13+
validator = Validator(int(inp_bits))
14+
_ = (
15+
int(inp_bits),
16+
int(log2(int(inp_bits) + 1))
17+
)
18+
19+
inp = input(f"Введите классический код хэмминга {str(_).replace(", ", ";")}: ")
20+
21+
if not validator.ValidateInput(inp):
22+
print("Проверьте ввод!")
23+
continue
24+
25+
result = CheckHamming(lenght=_[0]).run(inp)
26+
27+
print()
28+
if result["hasError"]:
29+
errorIndex = result['errorIndex']
30+
print("Корректное сообщение:", inp[:errorIndex] + str((int(inp[errorIndex])+1)%2) + inp[errorIndex+1:])
31+
print("Указатель на ошибку: ", " "*errorIndex +"^" + " "*(len(inp)-errorIndex))
32+
else:
33+
print("Введённое число корректно!")
34+
print()
35+
36+
if __name__ == "__main__":
37+
main()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .main import CheckHamming as CheckHamming
Binary file not shown.
Binary file not shown.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from math import log2
2+
3+
class CheckHamming():
4+
def __init__(self, lenght: int = 7):
5+
self.lenght = lenght
6+
7+
self.parity_bits = int(log2(lenght + 1))
8+
self.info_bits = lenght - self.parity_bits
9+
10+
self.bin_mask = [
11+
"0"*(self.parity_bits - len(bin(i)[2:])) + bin(i)[2:] # добавляем 0 слева чтоб с индексацией по строкам не мучаться
12+
for i in range(1,lenght+1)
13+
]
14+
15+
def run(self, inp: str):
16+
parity_arr = [0 for i in range(self.parity_bits)]
17+
18+
for bin_num, sym in zip(self.bin_mask, inp):
19+
#print("-", bin_num, sym) # DEBUG
20+
for bin_num_idx, bin_num_sym in enumerate(bin_num):
21+
#print("-----", bin_num_idx, bin_num_sym) # DEBUG
22+
parity_arr[bin_num_idx] += int(sym)*int(bin_num_sym)
23+
24+
pointer = ""
25+
for i in parity_arr: pointer += str(i%2)
26+
27+
return {
28+
"hasError": pointer.count("1") != 0,
29+
"errorIndex": int(pointer, 2) - 1
30+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .main import Validator as Validator
Binary file not shown.
Binary file not shown.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import re
2+
from math import log2
3+
4+
class Validator():
5+
6+
def __init__(self, lenght: int = 7):
7+
self.inp_pattern = re.compile("[0-1]+")
8+
self.lenght = lenght
9+
10+
def ValidateInput(self, inp: str):
11+
return len(inp) == self.lenght and bool(re.fullmatch(self.inp_pattern, inp))
12+
13+
@staticmethod
14+
def ValidateBits(inp: str):
15+
return log2(int(inp)+1)%1 == 0

0 commit comments

Comments
 (0)