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