Одной из малоизвестных парадигм программирования, которая кажется весьма подходящей для игры в код, является перекрывающееся ориентированное программирование (ООП) *. При написании частично идентичного кода многие байты можно сохранить, просто перекрывая идентичные части и запоминая каким-то образом, где начинаются две строки исходного кода. Ваша задача состоит в том, чтобы написать две пересекающиеся программы или функции 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>"). Так как это код-гольф, тем ниже оценка.
Пример:
Предположим, что код для вашей функции compressis c=abcdи код для decompressis d=efghi. Затем compress("c=abcd", "d=efghi")дает "c=abcd=efghi"(и индексы, но те, которые не влияют на выигрыш), так что счет length "c=abcd=efghi" = 12.
Дополнительные правила
- В духе этого вызова ваши
compressиdecompressдолжны совпадать хотя бы в одном персонаже. Вы можете достичь этого тривиально, добавив комментарий, но учтите, что это увеличит ваш счет, и могут быть более короткие решения, использующие частично совпадающий код. compressиdecompressдолжен иметь возможность обрабатывать строки, содержащие любые печатные символы ASCII, а также все символы, которые вы использовали для определенияcompressиdecompress.- Индексы могут быть нулевыми или одноиндексными.
- Ваши программы или функции не обязательно должны быть названы
compressиdecompress.