Ах, эти загадочные задания ЕГЭ по информатике! Если бы кто-то сказал мне в школе, что я буду считать информационный объём сообщений и вычислять длину серийных номеров, я бы, наверное, ответил: «А можно просто спросить у Google?» Но нет! Судьба распорядилась иначе — пришлось разбираться самому.
Задание 11 — это как старый добрый друг, который напоминает о себе всякий раз, когда ты думаешь: «Ну всё, сдам информатику без проблем». На самом деле оно похоже на задание 7, где нужно было считать вес картинки или видеофайла.
Только теперь мы сидим и считаем… текст! Да-да, именно текстовые символы — никакой вам графики или звука.
Это словно готовить борщ без свеклы: вроде проще, но если не добавить специй (в нашем случае — внимательности), то можно получить какой-то пресный суп.
Помню, как однажды мой друг решил посчитать длину своего пароля для входа в соцсети по формуле из задания 11. Он так увлёкся вычислениями, что забыл сам пароль! В итоге пришлось писать в поддержку соцсети с вопросом: «Можете сбросить пароль?
Я тут слишком много считал длину серийного номера…»
Ну а теперь серьёзно: чтобы понять максимальную длину серийного номера (или идентификатора), нужно сначала выяснить мощность алфавита. В нашем задании она составила внушительные 1025 символов — десять цифр (0–9), пятьдесят две латинские буквы с учётом регистра и целых 963 специальных символа. Представьте только офисного сотрудника, который должен запомнить такой набор! Это даже не пароль — это криптографическая головоломка уровня ЦРУ.
И вот тут начинается самое интересное.
Чтобы определить вес одного символа (то есть сколько бит занимает каждый), нам надо взять логарифм по основанию два от числа символов алфавита. Если бы у нас было ровно 1024 символа (2 в десятой степени), то один символ занимал бы ровно 10 бит — красота математики! Но нет же, у нас лишний один символ — 1025-й герой нашего алфавита. И знаете что?
Из-за этого маленького героя нам приходится добавлять ещё один бит. Итого получается целых 11 бит на символ!
Это напоминает мне анекдот про программиста, который хотел написать программу без багов. Он потратил неделю на оптимизацию кода и в конце концов добавил одну строчку комментария — и программа перестала работать совсем.
Вот так и с нашим алфавитом: один лишний символ добавляет дополнительный бит и усложняет жизнь всем.
Далее мы узнаём общий объём памяти для хранения всех 2000 серийных номеров — не более 693 килобайт (Кбайт). Для удобства переводим это в байты: умножаем на 2^10 (то есть на 1024) и получаем общее число байт для всех сообщений. Теперь делим этот объём на количество сообщений (2000) и получаем сколько памяти выделяется под один номер.
Тут появляется классическая проблема округления. Ведь результат может быть дробным числом вроде «2,322».
А вы попробуйте поместить три целых символа туда, где хватает только на два с копейками! Не выйдет — придётся округлять вниз до двух.
Это напомнило мне случай из жизни: однажды мой знакомый пытался купить билеты через интернет на концерт любимой группы.
Сайт показывал остаток мест как «2.5» (видимо из-за бага). Он решил купить три билета сразу — ну мало ли!
В итоге сайт отказался оформлять заказ на три места и написал: «Недостаточно билетов». Вот так же и с нашими серийными номерами — если результат дробный, берём целую часть!
В общем, решение задачи сводится к тому, чтобы аккуратно провести все вычисления вручную (или при помощи калькулятора), не забывая про округления и переводы единиц измерения.