К сожалению, такой программы не существует.
Чтобы понять, почему это так, нам нужно немного математики. Во-первых, давайте посчитаем, сколько существует двоичных строк длины n. Каждый из битов может иметь значение 0 или 1, что дает нам один из двух вариантов для каждого из этих битов. Поскольку существует два варианта для каждого бита и n битов, таким образом, в общей сложности 2 n двоичных строк длины n.
Теперь давайте предположим, что мы хотим построить алгоритм сжатия, который всегда сжимает цепочку битов длины n в цепочку битов длины меньше, чем n. Чтобы это сработало, нам нужно подсчитать, сколько разных строк длины меньше n. Ну, это дается числом битовых строк длины 0, плюс количество битовых строк длины 1, плюс количество битовых строк длины 2 и т. Д., Вплоть до n - 1. Это общее значение равно
2 0 + 2 1 + 2 2 + ... + 2 n - 1
Используя немного математики, мы можем получить, что это число равно 2 n - 1. Другими словами, общее число цепочек битов длиной меньше n на единицу меньше числа цепочки битов длиной n.
Но это проблема. Чтобы у нас был алгоритм сжатия без потерь, который всегда отображает строку длины n в строку длиной не более n - 1, нам нужно было бы каким-то образом связать каждую цепочку битов длины n с какой-то более короткой цепочкой битов, так что нет две строки битов длины n связаны с одним и тем же более коротким потоком битов. Таким образом, мы можем сжать строку, просто сопоставив ее с соответствующей более короткой строкой, и мы можем распаковать ее путем обращения отображения. Ограничение, заключающееся в том, что никакие две цепочки битов длины n не отображаются в одну и ту же более короткую строку, делает эту потерю без потерь - если две цепочки бит длины-n должны отображаться в одну и ту же более короткую цепочку битов, то когда придет время распаковывать строку, не будет быть способом узнать, какие из двух исходных цепочек битов мы сжимали.
Здесь мы достигаем проблемы. Поскольку существует 2 n различных цепочек битов длины n и только 2 n -1 более коротких цепочек битов, нет никакого способа, которым мы можем связать каждую цепочку битов длины n с какой-то более короткой цепочкой бит без присвоение как минимум двух строк длины-n одной и той же более короткой строке. Это означает, что независимо от того, как сильно мы стараемся, какими бы умными мы ни были, и независимо от того, насколько мы креативны с нашим алгоритмом сжатия, существует жесткое математическое ограничение, которое говорит о том, что мы не всегда можем сделать текст короче.
Так как эта карта связана с вашей первоначальной проблемой? Что ж, если мы получим строку текста длиной не менее 10000 и нам понадобится вывести более короткую программу, которая ее печатает, то нам нужно будет каким-то образом отобразить каждую из 2 10000 строк длиной 10000. на строки 2 10000 - 1 длиной менее 10000. Это отображение имеет некоторые другие свойства, а именно то, что мы всегда должны создавать допустимую программу, но это не имеет значения - здесь просто не хватает более коротких строк обойти В результате проблема, которую вы хотите решить, невозможна.
Тем не менее, мы могли бы получить программу, которая может сжимать все строки, кроме одной, длиной 10000 в более короткую строку. Фактически, мы могли бы найти алгоритм сжатия, который делает это, что означает, что с вероятностью 1 - 2 10000 любая строка длиной 10000 может быть сжата. Это настолько высокая вероятность того, что если бы мы продолжали выбирать строки на протяжении всей жизни вселенной, мы почти наверняка никогда бы не догадались об одной плохой строке.
Для дальнейшего чтения есть понятие из теории информации под названием Колмогоровская сложность , которая является длиной самой маленькой программы, необходимой для создания данной строки. Некоторые строки легко сжимаются (например, abababababababab), а другие - нет (например, sdkjhdbvljkhwqe0235089). Существуют строки, которые называются несжимаемыми строками , для которых строка не может быть сжата в каком-либо меньшем пространстве. Это означает, что любая программа, которая будет печатать эту строку, должна иметь длину не менее указанной строки. Для хорошего знакомства с колмогоровской сложностью вы можете обратиться к главе 6 «Введение в теорию вычислений, второе издание» Майкла Сипсера, в которой содержится превосходный обзор некоторых из более интересных результатов. Для более строгого и всестороннего взгляда, прочитайте «Элементы теории информации», глава 14.
Надеюсь, это поможет!