Редакция для Двоичный код в строку


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

В строке даны двоичные коды символов: каждая группа из 8 символов 0 и 1 — это ASCII-код одного печатного символа.

Нужно:

  • прочитать всю строку целиком;
  • разбить её на группы по пробелам;
  • каждую двоичную группу перевести в десятичное число;
  • по этому числу получить соответствующий ASCII-символ;
  • собрать ответную строку.

2. Наблюдения

  1. Каждая группа имеет длину ровно 8, то есть это обычное 8-битное двоичное число.

  2. Перевести двоичную запись в число можно стандартно:

    • начинаем с value = 0;
    • для каждого символа c в строке:
      • умножаем текущее значение на 2;
      • прибавляем 0 или 1.

    Например, для 01000001:

    • 0 -> 0
    • 1 -> 1
    • 0 -> 2
    • 0 -> 4
    • 0 -> 8
    • 0 -> 16
    • 0 -> 32
    • 1 -> 65

    Получаем код 65, это символ A.

  3. Так как по условию все коды соответствуют печатным ASCII-символам, можно безопасно превращать число в символ.

  4. Между группами стоят одиночные пробелы, поэтому удобно разбить строку по пробелам.

3. Алгоритм

  1. Считать всю входную строку.
  2. Разбить её на части по пробелам.
  3. Для каждой части:
    • завести value = 0;
    • пройти по всем 8 символам:
      • value = value * 2 + (текущий бит);
    • преобразовать value в символ;
    • добавить символ в ответ.
  4. Вывести собранную строку.

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))

Комментарии

Еще нет ни одного комментария.