📑 Ресурсы
Udacity PuzzlesMathematical Puzzles
📑 Задание
Сигнал радиостанции состоит из 16 символов двоичного кода.
Шпион со специальным оборудованием изменил эту передачу.
Получилась последовательность
Чтобы не вызвать подозрений, он заменил всего один символ в исходном сигнале радиостанции.
Сообщение, которое передал шпион - число из четырех символов в двоичной системе.
Получатель сигнала знает, что каждой из 16-ти позиций передачи соответствует
четырехзначное число в двоичной системе в порядке возрастания.
Для расшифровки переданного сообщения адресату достаточно сложить все числа,
соответствующие единицам в передаче радиостанции.
Что передал шпион?
📑 Решение.
Каждому символу в передаче поставим в соответствие 4-значное число в двоичной системе:
xxxxxxxxxx
import pandas as pd
num_str='0100101101011000'
def bin4(i):
bi=str(bin(i))[2:]
if len(bi)<4: bi=(4-len(bi))*'0'+bi
return bi
df=pd.DataFrame(
[[bin4(i) for i in range(len(num_str))],
[int(el) for el in list(num_str)]],
index=['bin','signal']).T
df1=df[df['signal']==1]
df1=df1['bin'].str.split('',4,expand=True).loc[:,1:4]
df1.columns=['bin %d'%i for i in range(4)]
df1.loc['result']=[el.count('1')%2 for el in df1.sum()]
def dfstyle(dfs):
return display(dfs.style.applymap(
lambda v:'color:magenta;' if ((v=='1') or (v==1)) \
else 'opacity:70%; text-align:right;')\
.set_table_styles(
[{'selector':'th','props':'border:black double;'},
{'selector':'th','props':'min-width:50px;'},
{'selector':'td','props':'border:double;'},
{'selector':'td:hover','props':'background:#b0b;'}]))
dfstyle(df); print(); dfstyle(df1)
Выпишем и сложим все числа, соответствующие единицам в радиосигнале.
Известно, что должно получиться 4-хзначное число.
Если просто складывать все эти числа в двоичной системе,
то получиться сумма, соответствующее 50 в десятичной системе.
Такое число невозможно зашифровать с помощью 4 символов в двоичной системе.
Значит, нужно складывать векторы с 4-мя координатами
(четное количество единиц в столбце - в итоге 0, нечетное - 1)