Редакция для Двоичный код в строку
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
В строке даны двоичные коды символов: каждая группа из 8 символов 0 и 1 — это ASCII-код одного печатного символа.
Нужно:
- прочитать всю строку целиком;
- разбить её на группы по пробелам;
- каждую двоичную группу перевести в десятичное число;
- по этому числу получить соответствующий ASCII-символ;
- собрать ответную строку.
2. Наблюдения
Каждая группа имеет длину ровно 8, то есть это обычное 8-битное двоичное число.
Перевести двоичную запись в число можно стандартно:
- начинаем с
value = 0; - для каждого символа
cв строке:- умножаем текущее значение на 2;
- прибавляем
0или1.
Например, для
01000001:0 -> 01 -> 10 -> 20 -> 40 -> 80 -> 160 -> 321 -> 65
Получаем код
65, это символA.- начинаем с
Так как по условию все коды соответствуют печатным ASCII-символам, можно безопасно превращать число в символ.
Между группами стоят одиночные пробелы, поэтому удобно разбить строку по пробелам.
3. Алгоритм
- Считать всю входную строку.
- Разбить её на части по пробелам.
- Для каждой части:
- завести
value = 0; - пройти по всем 8 символам:
value = value * 2 + (текущий бит);
- преобразовать
valueв символ; - добавить символ в ответ.
- завести
- Вывести собранную строку.
4. Почему это работает
Рассмотрим одну группу из 8 бит.
При обработке слева направо мы поддерживаем число, равное значению уже просмотренного префикса в двоичной системе.
Если текущее значение равно x, а следующий бит равен b, то новое значение становится 2 * x + b. Это и есть стандартный способ дописать бит справа в двоичной записи.
Значит, после обработки всех 8 символов мы получим ровно то десятичное число, которое задаёт данная двоичная группа.
По условию каждая такая группа — ASCII-код печатного символа. Следовательно, преобразование полученного числа в символ даёт правильный символ телеграммы.
Так как мы независимо декодируем каждую группу и добавляем символы в исходном порядке, итоговая строка полностью совпадает с переданным текстом.
5. Сложность
Пусть n — длина входной строки.
- Разбиение строки и обработка всех символов занимают
O(n). - Дополнительная память:
O(n)на хранение входа и ответа.
6. Код на C++17
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string line;
getline(cin, line);
stringstream ss(line);
string bits;
string result;
while (ss >> bits) {
int value = 0;
for (char c : bits) {
value = value * 2 + (c - '0');
}
result += char(value);
}
cout << result;
return 0;
}
7. Код на Python 3
line = input()
parts = line.split()
result = []
for bits in parts:
value = 0
for c in bits:
value = value * 2 + (ord(c) - ord('0'))
result.append(chr(value))
print(''.join(result))
Комментарии