Не уверен, если у меня будет время / энергия, чтобы дополнить это реальным кодом, но вот моя идея:
- Любая произвольная строка LATIN 1 определенной длины может быть просто закодирована (даже не сжатая ) без потерь в 140 символов. Наивная оценка составляет 280 символов, хотя с учетом ограничений по коду в правилах конкурса она, вероятно, немного короче.
- Строки, немного превышающие указанную выше длину (можно предположить, что между 280 и 500 символами), скорее всего, могут быть сжаты с использованием стандартных методов сжатия до достаточно короткой строки, чтобы разрешить вышеуказанное кодирование.
Что-нибудь длиннее, и мы начинаем терять информацию в тексте. Поэтому выполните минимальное количество следующих шагов, чтобы уменьшить строку до длины, которая затем может быть сжата / кодирована с использованием вышеуказанных методов. Кроме того, не выполняйте эти замены для всей строки , если только выполнение их для подстроки сделает ее достаточно короткой (я, вероятно, прошел бы по строке назад).
- Заменить все символы LATIN 1 выше 127 (в основном, ударные буквы и символы в стиле фанк) их ближайшим эквивалентом в неакцентированных буквенных символах или, возможно, заменой универсального символа, например "#"
- Заменить все заглавные буквы на их эквивалентную строчную форму
- Заменить все не алфавитно-цифровые символы (любые оставшиеся символы или знаки пунктуации) пробелом
- Заменить все числа на 0
Хорошо, теперь мы удалили столько лишних символов, сколько мы можем разумно избавить. Теперь мы собираемся сделать несколько более существенных сокращений:
- Заменить все двойные буквы (шарик) одной буквой (шарик). Будет выглядеть странно, но все же, надеюсь, расшифрован читателем.
- Заменить другие общие буквенные комбинации более короткими эквивалентами (CK с K, WR с R и т. Д.)
Хорошо, это все, что мы можем сделать, чтобы текст был читабельным . Помимо этого, давайте посмотрим, сможем ли мы придумать метод, так что текст будет напоминать оригинал, даже если он в конечном итоге не будет дешифруемым (снова выполните этот символ в время от конца строки и остановка, когда она достаточно коротка):
- Заменить все гласные (aeiouy) на
- Заменить все "высокие" буквы (bdfhklt) на l
- Заменить все "короткие" буквы (cmnrsvwxz) на n
- Заменить все "висячие" буквы (gjpq) на p
Это должно оставить нам строку, состоящую ровно из 5 возможных значений (a, l, n, p и пробел), что должно позволить нам кодировать довольно длинные строки.
Кроме того, нам просто нужно было бы усечь.
Единственная другая техника, о которой я могу подумать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.