Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 29.12.2020
Сообщений: 51

Экономия

26.01.2021, 17:42. Показов 3264. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При записи текста в память компьютера часто используют посимвольное кодирование, при котором на каждый символ отводится 8 бит. Но текст может содержать не
2^8
различных символов, а гораздо меньше. И тогда можно получить значительную экономию, если каждый символ кодировать одинаковым минимально возможным количеством бит.
Например, если в тексте есть только буквы A, B, C и D, то каждую из них можно закодировать всего двумя битами: 00, 01, 10 и 11.
Напишите программу, которая для введенной строки, состоящей только из букв латинского алфавита в верхнем регистре, определит такой минимальный по длине код, закодирует им строку и выведет на печать. Меньшей букве должно соответствовать меньшее по значению кодовое слово.
Формат ввода
Строка из латинских букв в верхнем регистре.
Формат вывода
Строка кодов наименьшей длины для букв введенной строки в том же порядке.
Пример 1
Ввод Вывод
ABBA
0110
Пример 2
Ввод Вывод
GENERATOR
010001011001101000110100101
Пример 3
Ввод Вывод
SORRY
1000010111
Примечания
В задаче нельзя использовать списки, словари и сортировку. А также собственные функции и функции высшего порядка.
Разберем второй пример. В слове GENERATOR используется 7 различных букв. Чтобы их закодировать, достаточно 3 бита, и кодировка букв, расположенных в алфавитном порядке, будет выглядеть так:
000 A
001 E
010 G
011 N
100 O
101 R
110 T
А последний код 111 никому не достался.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2021, 17:42
Ответы с готовыми решениями:

Экономия
Пусть имеется N станций и таблица цен на проезд между ними. Требуется выяснить, как дешевле проехать от одной определённой станции до...

Где экономия?
Пусть вновь имеются N станций и таблица цен на проезд между ними. Требуется найти все такие пары станций, для которых дешевле проехать от...

Где экономия?
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или input.txt Вывод стандартный вывод или output.txt ...

7
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
26.01.2021, 19:19
Лучший ответ Сообщение было отмечено LevL123 как решение

Решение

LevL123,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
alpha = ''
for i in range(26) :
    alpha += chr(ord('A') + i)
st = input()
k = -1
for w in alpha :
    if w in st :
        k += 1
        tmp = bin(k)[2:]
        st = st.replace(w, ' ' + '0' * (5 - len(tmp)) + tmp)
k = 7 - len(bin(k))
tmp = ' ' + '0'*k
st = st.replace(tmp, '')
print(st)
2
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
27.01.2021, 21:32
Цитата Сообщение от Gdez Посмотреть сообщение
tmp = bin(k)[2:]
        st = st.replace(w, ' ' + '0' * (5 - len(tmp)) + tmp)
Как работает этот код?
Python
1
tmp = bin(k)[2:]
переводит какой-то k в двоичую систему и срезает 0b.

Потом
Python
1
st = st.replace(w, ' ' + '0' * (5 - len(tmp)) + tmp)
что-то заменяет в слове, которое мы вводим. Но как это работает, можете объяснить, пожалуйста?
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.01.2021, 22:18
gray621, в алфавите 26 букв. 26 в двоичном содержит 5 символов.
Заменяем букву на пробел и 5 символов => счетчик (число) в двоичном коде плюс слева "0" до пятисимвольной строки
Потом (после цикла) определяем количество знаков в двоичном коде у счетчика "к" ; определяем "лишнее" количество нулей слева; заменяем пробел плюс "лишние' нули на "пустой" символ.
Всё
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
27.01.2021, 23:49
Gdez, то есть
Python
1
tmp = bin(k)[2:]
в tmp записывает двоичный счетчик.

Python
1
st = st.replace(w, ' ' + '0' * (5 - len(tmp)) + tmp)
Заменяет в слове букву на пробел + количество нулей, равное 5 - длина двоичного счётчика + двоичный счетчик

Python
1
k = 7 - len(bin(k))
Считает длину битов последнего числа, но почему вычитается из 7?

Python
1
2
tmp = ' ' + '0'*k
st = st.replace(tmp, '')
заменяет пробелы и нули на ничего (удаляет)

Но как работает
Python
1
st = st.replace(w, ' ' + '0' * (5 - len(tmp)) + tmp)
, объясните подробнее, пожалуйста и почему вычитается из 7?
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
28.01.2021, 04:26
gray621, gray621, вот тут у "bin(k)" срезом "убираются" первые два символа
Python
1
tmp = bin(k)[2:]
А тут нет
Python
1
k = 7 - len(bin(k))
Поэтому
k = 5 - len(bin(k))[2:] = 7 - len(bin(k))
Первые два символа - префиксы, которые "приписываются" всем "недесятичным" числам.
Попробуй
Python
1
print(bin(26))
Увидишь
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
28.01.2021, 08:33
Gdez, Первые два символа - префиксы, которые "приписываются" всем "недесятичным" числам. Да, я знаю это. Просто не понял, что там не удаляешь.

Добавлено через 2 минуты
Gdez, но почему 5 - длина двоичного счётчика + двоичный счетчик в 10 строчке
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
28.01.2021, 09:38
gray621, изначально неизвестно количество уникальных символов в строке и резервируется 6 бит - один пробел и пять под максимально возможную запись числа (для этой задачи для 26).
После определения количества уникальных символов в строке становится известна длина двоичной записи:
Для уникальных элементов 2 -> 1 символ 0 или 1
Для 3...4 - два символа от 10 до 11
.......
Для 17...26 - пять от 10000 до 11001
Поэтому для первого по алфавитному порядку "пишется" -> " " + "0000" + "0" = " 00000"
Для третьего -> " " + "000" + "10"
Для семнадцатого и выше -> " " + "1****"
Для определения количества "средних" нулей используется (5 - len(tmp))
Счетчик "к" после выхода из цикла показывает максимальный порядковый номер символа в данной строке. Под него и "обрезаются" все числа с удалением пробелов
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2021, 09:38
Помогаю со студенческими работами здесь

Экономия
Пусть вновь имеются N станций и таблица цен на проезд между ними. Требуется выяснить, как дешевле проехать от одной определённой станции до...

Где экономия?
ПРОГРАММА ПОЛНОСТЬЮ РАБОЧАЯ НО ЕСТЬ СИНТАКСИЧЕСКАЯ ОШИБКА В 13 СТРОКЕ ПОМОГИТЕ ИСПРАВИТЬ!!!!! ВОТ УСЛОВИЕ : Пусть имеется N ...

Где экономия?
Пусть вновь имеются N станций и таблица цен на проезд между ними. Требуется найти все такие пары станций, для которых дешевле проехать от...

Где экономия?
Пусть вновь имеются N станций и таблица цен на проезд между ними. Требуется найти все такие пары станций, для которых дешевле проехать от...

Прагматизм экономики СССР это экономия развития СССР, в частности это экономия технического и технологического развития
Прагматизм экономики СССР состоял в экономии электротехнического фактора развития СССР, в пользу развития механического фактора развития...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru