Вопрос:

В кодировке ALT-52 русские буквы кодируются 8 битами, а все остальные символы — 16 битами. Лена выучила новый язык программирования и добавила его название в своё резюме, вставив также необходимые запятую и пробел. В итоге у неё получился список: «Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол». При этом размер нового предложения в данной кодировке оказался на 10 байт больше, чем размер исходного предложения. Напишите в ответе добавленный Леной язык программирования.

Смотреть решения всех заданий с листа

Ответ:

Решение:

В предложении «Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол» 8 языков программирования, 7 знаков препинания (запятые, кавычки, точка) и 1 пробел. Всего 16 символов.

Исходное предложение без нового языка:

«Я знаю такие языки программирования, как , , , , , , , ».

Добавление одного языка программирования увеличило объем на 10 байт. В кодировке ALT-52 русские буквы кодируются 8 битами (1 байт), а остальные символы — 16 битами (2 байта).

Пусть длина нового названия языка программирования равна N символов. Тогда:

N байт (язык) + 1 байт (запятая) + 1 байт (пробел) = 10 байт

N + 2 = 10

N = 8 байт

Так как каждый символ кодируется 2 байтами (кроме русских букв, которых в названиях языков нет), то длина названия языка составляет 8 байт / 2 байта/символ = 4 символа.

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

Возможные языки из списка, состоящие из 4 символов:

  • Python (6 символов)
  • Java (4 символа)
  • Бейсик (5 символов)
  • Scala (5 символов)
  • Scratch (7 символов)
  • Алгол (5 символов)

Единственный язык из списка, состоящий из 4 символов, — это Java.

Проверим: «Python, Java, Бейсик, Scala, Scratch, Алгол, Java.» — 9 языков, 8 запятых, 1 пробел. Общее количество символов = 9*1 (язык) + 8*2 (запятая) + 1*2 (пробел) = 9 + 16 + 2 = 27 байт. Это не подходит.

Перечитаем условие: «Лена выучила новый язык программирования и добавила его название в своё резюме, вставив также необходимые запятую и пробел.»

Размер нового предложения на 10 байт больше. Это значит, что к исходному предложению добавились:

  • Название нового языка (пусть его длина L символов, каждый по 2 байта).
  • Запятая (2 байта).
  • Пробел (2 байта).

Общее увеличение = L * 2 + 2 + 2 = 10 байт

2L + 4 = 10

2L = 6

L = 3 символа.

Ищем язык из списка, который состоит из 3 символов. Таких нет. Возможно, условие подразумевает, что только *новое* название состоит из 16 бит, а запятая и пробел — стандартные символы.

Если новый язык кодируется 16 битами (2 байта), а запятая и пробел — тоже по 2 байта, то:

2 (язык) + 2 (запятая) + 2 (пробел) = 6 байт. Это не 10 байт.

Если русские буквы кодируются 8 битами (1 байт), а остальные символы — 16 битами (2 байта), и предложение «Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол»:

«Я» (1 байт) + « » (2 байта) + «знаю» (4*1 + 1*2 = 6 байт) + « » (2 байта) + «такие» (5*1 + 1*2 = 7 байт) + ...

Это слишком сложно для задачи такого типа. Вернемся к простому условию:

«При этом размер нового предложения в данной кодировке оказался на 10 байт больше, чем размер исходного предложения.»

Пусть исходное предложение: «Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол».

Длина в символах: 1 + 1 + 5 + 1 + 5 + 1 + 16 + 1 + 6 + 1 + 4 + 1 + 5 + 1 + 5 + 1 + 7 + 1 + 5 + 1 = 74 символа.

В кодировке ALT-52 русские буквы (1 байт), остальное (2 байта).

Русские буквы: Я, з, н, а, ю, т, а, к, и, е, я, з, ы, к, и, п, р, о, г, р, а, м, м, и, р, о, в, а, н, и, я, к, а, к, А, л, г, о, л. (39 букв)

Остальные символы: пробелы, запятые, кавычки, точки, буквы латиницы. (74 - 39 = 35 символов)

Размер исходного предложения: 39 * 1 байт + 35 * 2 байта = 39 + 70 = 109 байт.

Новое предложение = исходное + название языка + запятая + пробел.

Пусть название нового языка состоит из k латинских символов.

Размер нового предложения = 109 байт + (k * 2 байта) + 2 байта (запятая) + 2 байта (пробел) = 109 + 2k + 4 = 113 + 2k байт.

Размер нового предложения = 109 + 10 = 119 байт.

113 + 2k = 119

2k = 6

k = 3 символа.

Ищем язык из списка, состоящий из 3 символов. В списке нет языков с 3 символами. Это значит, что либо мое предположение о кодировке неверно, либо я неправильно считаю символы.

Предположим, что «остальные символы» — это только латинские буквы, а знаки препинания и пробел — 1 байт.

Русские буквы: 39 * 1 байт = 39 байт.

Латинские буквы (Python, Java, Бейсик, Scala, Scratch, Алгол): 6 + 4 + 5 + 5 + 7 + 5 = 32 символа. 32 * 2 байта = 64 байта.

Пробелы, запятые, кавычки, точка: 16 (пробелов) + 7 (запятых) + 2 (кавычек) + 1 (точка) = 26 символов. 26 * 1 байт = 26 байт.

Общий размер исходного предложения: 39 + 64 + 26 = 129 байт.

Новое предложение: 129 байт + (k * 2 байта) + 2 байта (запятая) + 2 байта (пробел) = 129 + 2k + 4 = 133 + 2k байт.

Новое предложение = 129 + 10 = 139 байт.

133 + 2k = 139

2k = 6

k = 3 символа.

Опять 3 символа. Это значит, что язык программирования имеет 3 символа.

Проверим еще раз условие: «русские буквы кодируются 8 битами, а все остальные символы — 16 битами». Это явно относится к кодировке ALT-52.

Возможно, в списке языков есть новый язык, которого нет в явном виде, но он входит в число «Python, Java, Бейсик, Scala, Scratch, Алгол».

Давайте предположим, что «Python, Java, Бейсик, Scala, Scratch, Алгол» — это *именно те* языки, которые были в исходном предложении. А Лена добавила *новый* язык, который она выучила.

Предложение: «Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол».

В этом предложении 6 названий языков. Они написаны латиницей, значит, каждый по 2 байта.

Русские буквы: Я, з, н, а, ю, т, а, к, и, е, я, з, ы, к, и, п, р, о, г, р, а, м, м, и, р, о, в, а, н, и, я, к, а, к, А, л, г, о, л. (39 букв)

Латинские буквы: Python (6), Java (4), Бейсик (5), Scala (5), Scratch (7), Алгол (5). Всего 32 символа.

Пробелы, запятые, кавычки, точка. Всего 26 символов.

Размер исходного предложения: 39 * 1 + 32 * 2 + 26 * 1 = 39 + 64 + 26 = 129 байт.

Размер нового предложения = 129 + 10 = 139 байт.

Добавлено: название нового языка (пусть k символов, латиница, 2 байта каждый) + запятая (1 байт) + пробел (1 байт). Это если знаки препинания и пробелы — 1 байт, а латиница — 2 байта.

129 + k*2 + 1 + 1 = 139

131 + 2k = 139

2k = 8

k = 4 символа.

Ищем язык из списка, который состоит из 4 символов. Это Java.

Проверяем, если знаки препинания и пробелы — 2 байта (как «все остальные символы»).

Размер исходного предложения: 39 * 1 + (32 + 26) * 2 = 39 + 58 * 2 = 39 + 116 = 155 байт.

Размер нового предложения = 155 + 10 = 165 байт.

Добавлено: название нового языка (k*2 байта) + запятая (2 байта) + пробел (2 байта).

155 + k*2 + 2 + 2 = 165

159 + 2k = 165

2k = 6

k = 3 символа.

Опять 3 символа.

Рассмотрим другой вариант. Может быть, «Python, Java, Бейсик, Scala, Scratch, Алгол» — это *весь* список языков, а Лена добавила один из них, и размер предложения увеличился на 10 байт.

Пусть исходное предложение было короче. Например, без списка языков.

«Я знаю такие языки программирования.»

Русские буквы: Я, з, н, а, ю, т, а, к, и, е, я, з, ы, к, и, п, р, о, г, р, а, м, м, и, р, о, в, а, н, и, я. (31 буква)

Остальные: 5 пробелов, 1 точка. (6 символов)

Размер: 31 * 1 + 6 * 2 = 31 + 12 = 43 байта.

Лена добавила: «как Python, Java, Бейсик, Scala, Scratch, Алгол».

Эти 6 языков + 5 запятых + 1 пробел + 1 запятая перед «как» + 1 пробел перед «как» + «как» (3 символа).

Знаки препинания (5 запятых + 1 точка) = 6 символов. Пробелы (11) = 11 символов.

Всего символов в добавленной части: 32 (языки) + 5 (запятые) + 1 (пробел) + 3 (как) = 41 символ.

Это тоже не дает 10 байт.

Вернемся к первому расчету, где 10 байт — это увеличение.

10 байт = (длина нового языка в байтах) + (размер запятой) + (размер пробела).

Если все символы, кроме русских букв, кодируются 16 битами (2 байта), а русские буквы — 8 битами (1 байт).

Пусть новый язык состоит из k латинских букв. Тогда его размер — 2k байт.

Запятая — 2 байта. Пробел — 2 байта.

2k + 2 + 2 = 10

2k + 4 = 10

2k = 6

k = 3.

Ищем язык из списка, состоящий из 3 символов. Такого нет.

Предположим, что «все остальные символы» — это только латинские буквы, а запятая и пробел — 1 байт.

2k + 1 + 1 = 10

2k + 2 = 10

2k = 8

k = 4.

Ищем язык из списка, состоящий из 4 символов. Это Java.

Проверим: если добавить «Java», то предложение станет «Python, Java, Бейсик, Scala, Scratch, Алгол, Java».

В исходном предложении 6 языков. Добавили 1 язык. Всего 7 языков.

Изначально было 6 языков + 5 запятых + 1 пробел + 2 кавычки + 1 точка. Всего 15 элементов.

В новом предложении: 7 языков + 6 запятых + 1 пробел + 2 кавычки + 1 точка. Всего 17 элементов.

Разница в 2 элемента: 1 язык, 1 запятая, 1 пробел.

Если язык — 4 символа (Java), то это 4 * 2 = 8 байт.

Добавили: Java (8 байт) + запятая (2 байта) + пробел (2 байта) = 12 байт. Не 10.

Если язык — 3 символа, то это 3 * 2 = 6 байт.

Добавили: (3 символа языка) + запятая + пробел = 6 + 2 + 2 = 10 байт.

Значит, новый язык состоит из 3 символов. Но в списке нет таких.

Возможно, слово «Алгол» — это и есть тот новый язык, который Лена добавила. Его длина 5 символов. Тогда 5*2 = 10 байт.

Если новый язык — это «Алгол», то предложение стало: «Python, Java, Бейсик, Scala, Scratch, Алгол, Алгол».

Добавили: Алгол (5*2=10 байт) + запятая (2 байта) + пробел (2 байта) = 14 байт. Не 10.

Если новый язык — это «Java», то его длина 4 символа. 4*2 = 8 байт.

Добавили: Java (8 байт) + запятая (2 байта) + пробел (2 байта) = 12 байт. Не 10.

Что если «PYTHON» — это один язык, а «Java», «Бейсик» и т.д. — это другие?

«Python, Java, Бейсик, Scala, Scratch, Алгол»

Длина в символах: 6+1+4+1+5+1+5+1+7+1+5 = 37 символов (без учета кавычек и точки)

В предложении 6 языков, 5 запятых, 1 пробел, 2 кавычки, 1 точка.

Предположим, что «Python» — это один большой блок, а остальные — отдельные.

«Я знаю такие языки программирования, как Python, Java, Бейсик, Scala, Scratch, Алгол».

Пусть добавленный язык — это C++. Его длина 3 символа. 3*2 = 6 байт. Добавилась запятая (2) и пробел (2). Итого 6+2+2 = 10 байт.

Это подходит! C++ — это язык программирования.

Ответ: C++

ГДЗ по фото 📸