ОГЭ по информатике · задание 2

Расшифровка: какое слово передали

Сообщение записано кодами букв без разделителей. Коды разной длины, поэтому разбить цепочку на буквы нужно аккуратно: только одно разбиение даёт расшифровку до конца.

Что нужно знать

  • Коды букв бывают разной длины, разделителей между буквами нет.
  • Код одной буквы может быть началом кода другой — тогда возможны тупики.

Как решать

  1. Читаем сообщение слева направо.
  2. Выписываем буквы, чей код совпадает с началом остатка.
  3. Если вариантов несколько, пробуем каждый: неверный быстро заводит в тупик.

Типичные ошибки

  • Взять самый короткий код и не проверить, что остаток расшифровывается.
  • Пропустить символ при переписывании длинной цепочки — лучше отмечать прочитанное.

Разобранные варианты

Сначала реши сам, потом открой разбор. В разборе — пошаговая расшифровка и программа на Python.

Вариант 1

азбука из точек и тире

Разведчик передал в штаб радиограмму:

– • – – – • – – – – – – • – – – •

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

ДЖРФЧ
• – – –– – – •• – –– • –– –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток – • – – – • – – – – – – • – – – •: подходит только Ф (– • –).
  2. Остаток – – • – – – – – – • – – – •: подходит только Ч (– –).
  3. Остаток • – – – – – – • – – – •: подходят Д (• – – –), Р (• – –). Если взять Р, остаток дальше не расшифровывается — тупик. Остаётся Д.
  4. Остаток – – – • – – – •: подходят Ж (– – – •), Ч (– –). Если взять Ч, остаток дальше не расшифровывается — тупик. Остаётся Ж.
  5. Остаток – – – •: подходят Ж (– – – •), Ч (– –). Если взять Ч, остаток дальше не расшифровывается — тупик. Остаётся Ж.

Ответ: ФЧДЖЖ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Д': '•–––', 'Ж': '–––•', 'Р': '•––', 'Ф': '–•–', 'Ч': '––'}
msg = '–•–––•––––––•–––•'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 2

азбука из точек и тире

Разведчик передал в штаб радиограмму:

– – • – – – • – – • • – • • • • – – • –

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

АЕЖСЭ
– • • –– – –• • • –– – • –• •

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток – – • – – – • – – • • – • • • • – – • –: подходит только С (– – • –).
  2. Остаток – – • – – • • – • • • • – – • –: подходит только С (– – • –).
  3. Остаток – • • – • • • • – – • –: подходит только А (– • • –).
  4. Остаток • • • • – – • –: подходит только Э (• •).
  5. Остаток • • – – • –: подходит только Э (• •).
  6. Остаток – – • –: подходит только С (– – • –).

Ответ: ССАЭЭС

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'А': '–••–', 'Е': '–––', 'Ж': '•••–', 'С': '––•–', 'Э': '••'}
msg = '––•–––•––••–••••––•–'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 3

азбука из точек и тире

Разведчик передал в штаб радиограмму:

• • – – • • – • – – – • • – – – • – • – • • –

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

МОФЧЯ
• • – –• • –• – – –– • –• –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток • • – – • • – • – – – • • – – – • – • – • • –: подходят М (• • – –), О (• • –). Если взять О, остаток дальше не расшифровывается — тупик. Остаётся М.
  2. Остаток • • – • – – – • • – – – • – • – • • –: подходит только О (• • –).
  3. Остаток • – – – • • – – – • – • – • • –: подходят Ф (• – – –), Я (• –). Если взять Я, остаток дальше не расшифровывается — тупик. Остаётся Ф.
  4. Остаток • • – – – • – • – • • –: подходят М (• • – –), О (• • –). Если взять О, остаток дальше не расшифровывается — тупик. Остаётся М.
  5. Остаток – • – • – • • –: подходит только Ч (– • –).
  6. Остаток • – • • –: подходит только Я (• –).
  7. Остаток • • –: подходит только О (• • –).

Ответ: МОФМЧЯО

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'М': '••––', 'О': '••–', 'Ф': '•–––', 'Ч': '–•–', 'Я': '•–'}
msg = '••––••–•–––••–––•–•–••–'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 4

азбука из точек и тире

Разведчик передал в штаб радиограмму:

• • – • – • • – • – • • • – – – – – •

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

ЛСТХЭ
• •• • – –• – • –– – – ••

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток • • – • – • • – • – • • • – – – – – •: подходят Л (• •), Э (•). Если взять Л, остаток дальше не расшифровывается — тупик. Остаётся Э.
  2. Остаток • – • – • • – • – • • • – – – – – •: подходят Т (• – • –), Э (•). Если взять Э, остаток дальше не расшифровывается — тупик. Остаётся Т.
  3. Остаток • • – • – • • • – – – – – •: подходят Л (• •), Э (•). Если взять Л, остаток дальше не расшифровывается — тупик. Остаётся Э.
  4. Остаток • – • – • • • – – – – – •: подходят Т (• – • –), Э (•). Если взять Э, остаток дальше не расшифровывается — тупик. Остаётся Т.
  5. Остаток • • • – – – – – •: подходят Л (• •), Э (•). Если взять Л, остаток дальше не расшифровывается — тупик. Остаётся Э.
  6. Остаток • • – – – – – •: подходят Л (• •), С (• • – –), Э (•). Если взять Л, Э, остаток дальше не расшифровывается — тупик. Остаётся С.
  7. Остаток – – – •: подходит только Х (– – – •).

Ответ: ЭТЭТЭСХ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Л': '••', 'С': '••––', 'Т': '•–•–', 'Х': '–––•', 'Э': '•'}
msg = '••–•–••–•–•••–––––•'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 5

азбука из точек и тире

Разведчик передал в штаб радиограмму:

• – • – • – – • – • – – • • • – – • • – – •

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

ГЕТФХ
– • •• • ••• – – •– • –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток • – • – • – – • – • – – • • • – – • • – – •: подходит только Т (•).
  2. Остаток – • – • – – • – • – – • • • – – • • – – •: подходит только Х (– • –).
  3. Остаток • – – • – • – – • • • – – • • – – •: подходят Т (•), Ф (• – – •). Если взять Т, остаток дальше не расшифровывается — тупик. Остаётся Ф.
  4. Остаток – • – – • • • – – • • – – •: подходит только Х (– • –).
  5. Остаток – • • • – – • • – – •: подходит только Г (– • •).
  6. Остаток • – – • • – – •: подходят Т (•), Ф (• – – •). Если взять Т, остаток дальше не расшифровывается — тупик. Остаётся Ф.
  7. Остаток • – – •: подходят Т (•), Ф (• – – •). Если взять Т, остаток дальше не расшифровывается — тупик. Остаётся Ф.

Ответ: ТХФХГФФ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Г': '–••', 'Е': '•••', 'Т': '•', 'Ф': '•––•', 'Х': '–•–'}
msg = '•–•–•––•–•––•••––••––•'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 6

азбука из точек и тире

Разведчик передал в штаб радиограмму:

– • – • • • – • – • – – – – • – –

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

БДЕРЯ
• •– • – –– –• – •– • –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток – • – • • • – • – • – – – – • – –: подходит только Я (– • –).
  2. Остаток • • • – • – • – – – – • – –: подходит только Б (• •).
  3. Остаток • – • – • – – – – • – –: подходит только Р (• – •).
  4. Остаток – • – – – – • – –: подходят Д (– • – –), Я (– • –). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Я.
  5. Остаток – – – • – –: подходит только Е (– –).
  6. Остаток – • – –: подходят Д (– • – –), Я (– • –). Если взять Я, остаток дальше не расшифровывается — тупик. Остаётся Д.

Ответ: ЯБРЯЕД

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Б': '••', 'Д': '–•––', 'Е': '––', 'Р': '•–•', 'Я': '–•–'}
msg = '–•–•••–•–•––––•––'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 7

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

ДИКОТ
001101100001

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 000001100001001. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток 000001100001001: подходит только Д (00).
  2. Остаток 0001100001001: подходит только Д (00).
  3. Остаток 01100001001: подходит только К (01).
  4. Остаток 100001001: подходит только О (100).
  5. Остаток 001001: подходят Д (00), Т (001). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Т.
  6. Остаток 001: подходят Д (00), Т (001). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Т.

Ответ: ДДКОТТ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Д': '00', 'И': '11', 'К': '01', 'О': '100', 'Т': '001'}
msg = '000001100001001'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 8

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

ДЛСУШ
01010020011

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 100112020011011. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток 100112020011011: подходят Л (10), С (100). Если взять С, остаток дальше не расшифровывается — тупик. Остаётся Л.
  2. Остаток 0112020011011: подходят Д (0), Ш (011). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Ш.
  3. Остаток 2020011011: подходит только У (20).
  4. Остаток 20011011: подходит только У (20).
  5. Остаток 011011: подходят Д (0), Ш (011). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Ш.
  6. Остаток 011: подходят Д (0), Ш (011). Если взять Д, остаток дальше не расшифровывается — тупик. Остаётся Ш.

Ответ: ЛШУУШШ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Д': '0', 'Л': '10', 'С': '100', 'У': '20', 'Ш': '011'}
msg = '100112020011011'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 9

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

ГЗИЛФ
1001110100011

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 01110010011010111. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток 01110010011010111: подходит только Ф (011).
  2. Остаток 10010011010111: подходят Г (1), Л (100). Если взять Г, остаток дальше не расшифровывается — тупик. Остаётся Л.
  3. Остаток 10011010111: подходят Г (1), Л (100). Если взять Г, остаток дальше не расшифровывается — тупик. Остаётся Л.
  4. Остаток 11010111: подходят Г (1), И (110). Если взять Г, остаток дальше не расшифровывается — тупик. Остаётся И.
  5. Остаток 10111: подходит только Г (1).
  6. Остаток 0111: подходит только Ф (011).
  7. Остаток 1: подходит только Г (1).

Ответ: ФЛЛИГФГ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Г': '1', 'З': '001', 'И': '110', 'Л': '100', 'Ф': '011'}
msg = '01110010011010111'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Вариант 10

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

БТУЦЯ
221020121000

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 020000210202. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Разбор

Идея. Коды разной длины и один код может быть началом другого, поэтому читать «на глаз» опасно. Идём слева направо: на каждом шаге смотрим, коды каких букв совпадают с началом остатка, и проверяем, расшифровывается ли то, что останется.

  1. Остаток 020000210202: подходит только У (020).
  2. Остаток 000210202: подходит только Я (000).
  3. Остаток 210202: подходят Б (2), Т (21). Если взять Б, остаток дальше не расшифровывается — тупик. Остаётся Т.
  4. Остаток 0202: подходит только У (020).
  5. Остаток 2: подходит только Б (2).

Ответ: УЯТУБ

Решение на Python. Перебор с возвратом печатает все расшифровки — она одна.

codes = {'Б': '2', 'Т': '21', 'У': '020', 'Ц': '121', 'Я': '000'}
msg = '020000210202'

def decode(rest, word=''):
    if rest == '':
        print(word)            # нашли расшифровку
        return
    for letter, c in codes.items():
        if rest.startswith(c):
            decode(rest[len(c):], word + letter)

decode(msg)

Для самостоятельного решения

Варианты 11–15 без разборов. Ответ можно проверить кнопкой.

Вариант 11

азбука из точек и тире

Разведчик передал в штаб радиограмму:

• • • – – • • – – • • • • • – • • – • • – – – • • –

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

АЖНФЭ
• • •– • •– – • •• • – –– • • –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Вариант 12

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

ЖЛРХЦ
00101102221001

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 00110200110210200. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Вариант 13

азбука из точек и тире

Разведчик передал в штаб радиограмму:

• – – – – – – – • • – – – •

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

ОФШЭЯ
• –– – – •• •– – –• – • •

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).

Вариант 14

цифровой код

Валя шифрует слова, записывая вместо каждой буквы её код. Коды букв даны в таблице.

БОРУЭ
001101011001

Некоторые цепочки можно расшифровать не одним способом. Вале прислали шифровку: 10100110101101. Известно, что она расшифровывается единственным образом. Запишите в ответе расшифрованное слово.

Вариант 15

азбука из точек и тире

Разведчик передал в штаб радиограмму:

– • • – – – – – – – – • • • –

При передаче радиограммы было потеряно разбиение на буквы, но известно, что в ней использовались только следующие буквы.

ЛРУХЯ
• • –•– – – •– • •– – – –

Определите текст радиограммы. В ответе запишите получившееся слово (набор букв).