Задание:
По каналу связи передаются сообщения, содержащие только буквы, входящие в слово ИНФОРМАТИКА. Для передачи используется неравномерный двоичный код, удовлетворяющий условию Фано: никакое кодовое слово не является началом другого кодового слова. Это условие обеспечивает возможность однозначной расшифровки закодированных сообщений. Кодовые слова для некоторых букв известны: Ф - 010, Р - 011, М - 101, Т - 1101, К - 111.
Какое наименьшее число двоичных знаков может содержать код слова ИНФОРМАТИКА?
Решение с помощью языка python:
from itertools import *
def check_fano(kods):
return all(not max(kods[i], kods[j]).startswith(min(kods[i], kods[j])) for i in range(len(kods)) for j in range(i+1, len(kods)))
all_kods = [''.join(x) for i in range(1, 6+1) for x in product('01',repeat=i)]
otv=10000
for i, n, a, o in combinations(all_kods, 4):
if check_fano([i, n, a, o, '010', '011', '101', '1101', '111']):
otv=min(otv, 3 + 3 + 3 + 4 + 3 + len(i) * 2 + len(n) * 1 + len(a) * 2 + len(o) * 1)
print(otv)