- 21, Oct 2024
- #1
Учитывая строку и символы, используемые для ее кодирования, вам необходимо сжать строку, используя столько бит, сколько необходимо каждому символу. Вы вернете коды символов для каждого символа, необходимые для создания сжатой строки.
Например, учитывая строку
and the encoder charactersfunction encode(str, encoderChars) { const maxBitCount = Math.ceil(Math.log2(encoderChars.length + 1)); const charToBit = Object.fromEntries(encoderChars.map((c, i) => [c, (i + 1).toString(2).padStart(maxBitCount, "0")])); const bits = [...str].map((c) => charToBit[c]).join(""); const bytes = bits.match(/.{1,8}/g) || []; return bytes.map((x) => parseInt(x.padEnd(8, '0'), 2)); }
String: "the fox", encoder characters: " abcdefghijklmnopqrstuvwxyz" => [170, 76, 19, 195, 32]
String: "971428563", encoder characters: "123456789" => [151, 20, 40, 86, 48]
String: "the quick brown fox jumps over the lazy dog", encoder characters: " abcdefghijklmnopqrstuvwxyz" => [170, 76, 25, 89, 68, 96, 71, 56, 97, 225, 60, 50, 21, 217, 209, 160, 97, 115, 76, 53, 73, 130, 209, 111, 65, 44, 16]
String: "abc", encoder characters: "abc" => [108]
String: "aaaaaaaa", encoder characters: "a" => [255]
String: "aaaabbbb", encoder characters: "ab" => [85, 170]
, вывод должен быть 1 => 001
3 => 010
5 => 011
7 => 100
9 => 101
.
Но как?
Во-первых, вам нужно сопоставить каждый символ кодера с несколькими битами. Если у нас есть символы кодирования 13579
, then we can map the characters to bits, by mapping the character to the position of the character in binary, like this:
a => 01
b => 10
c => 11
С abc
, we would map it like this:
[170, 76, 19, 195, 32]
Обратите внимание, что мы добавляем нули в начале столько, сколько необходимо.
Затем мы пройдемся по строке и для каждого символа получим соответствующие биты для этого символа. Затем соедините все биты вместе, а затем преобразуйте их в блоки по 8, чтобы получить байты. Если длина последнего байта не 8 бит, добавьте нули в конце, пока его длина не станет 8 бит. Наконец, преобразуйте каждый байт в его десятичное представление.
Тестовые случаи
" abcdefghijklmnopqrstuvwxyz"
Правила
- Входные данные могут быть строкой, списком или даже списком кодов символов. Это не имеет значения, ввод-вывод очень гибок для решения этой задачи.
- Ввод всегда будет действительным, например. строка никогда не будет включать символы, не входящие в символы кодера, и т. д.
- Символы кодировщика всегда будут содержать **менее 256 символов.
- Ни один вход никогда не будет пустым.
- Это , поэтому побеждает самый короткий ответ в байтах для каждого языка.
- Применяются стандартные правила ввода-вывода..
- Лазейки по умолчанию запрещены.
Эталонная реализация на JavaScript
"the fox"
Попробуйте это онлайн!
#code-golf #code-golf #string #binary #compression