Одной из малоизвестных парадигм программирования, которая кажется весьма подходящей для игры в код, является перекрывающееся ориентированное программирование (ООП) *. При написании частично идентичного кода многие байты можно сохранить, просто перекрывая идентичные части и запоминая каким-то образом, где начинаются две строки исходного кода. Ваша задача состоит в том, чтобы написать две пересекающиеся программы или функции compress
и decompress
со следующими характеристиками:
* Не используйте в производственном коде, вероятно.
compress
compress
берет две строки в любом удобном формате и максимально перекрывает их. То есть строка s
с минимальной длиной возвращается так, что обе входные строки являются подстрока s
. Кроме того, возвращается некоторый вывод, который идентифицирует начальный и конечный индексы обеих строк.
Примеры: (Точный IO-формат зависит от вас)
compress("abcd", "deab") -> "deabcd" ((2,5),(0,3))
compress("abcd", "bc") -> "abcd" ((0,3),(1,2))
compress("abc", "def") -> "abcdef" ((0,2),(3,5)) or "defabc" ((3,5),(0,2))
decompress
decompress
вычисляет обратную функцию compress
, которой дается строка и два начальных и конечных индекса (в формате, в котором они возвращаются вашим compress
), возвращают две исходные строки. Вам нужно только обрабатывать действительные входные данные. Равенство должно выполняться для всех строк s1
, s2
:
(s1, s2) == decompress (compress (s1, s2))
Примеры: (обратные compress
примеры)
decompress "deabcd" ((2,5),(0,3)) -> "abcd" "deab"
decompress "abcd" ((0,3),(1,2)) -> "abcd" "bc"
decompress "abcdef" ((0,2),(3,5)) -> "abc" "def"
or (whichever version your "compress" generates)
decompress "defabc" ((3,5),(0,2)) -> "abc" "def"
счет
Ваша оценка - это размер строки, возвращаемой вызовом compress("<code of compress>", "<code of decompress>")
. Так как это код-гольф, тем ниже оценка.
Пример:
Предположим, что код для вашей функции compress
is c=abcd
и код для decompress
is d=efghi
. Затем compress("c=abcd", "d=efghi")
дает "c=abcd=efghi"
(и индексы, но те, которые не влияют на выигрыш), так что счет length "c=abcd=efghi" = 12
.
Дополнительные правила
- В духе этого вызова ваши
compress
иdecompress
должны совпадать хотя бы в одном персонаже. Вы можете достичь этого тривиально, добавив комментарий, но учтите, что это увеличит ваш счет, и могут быть более короткие решения, использующие частично совпадающий код. compress
иdecompress
должен иметь возможность обрабатывать строки, содержащие любые печатные символы ASCII, а также все символы, которые вы использовали для определенияcompress
иdecompress
.- Индексы могут быть нулевыми или одноиндексными.
- Ваши программы или функции не обязательно должны быть названы
compress
иdecompress
.