Um dos paradigmas de programação menos conhecidos que parece bastante adequado para o golfe com código é a Programação Orientada por Sobreposição (OOP) *. Ao escrever código parcialmente idêntico, muitos bytes podem ser salvos simplesmente sobrepondo as partes idênticas e lembrando de alguma maneira que as duas linhas de código originais começam. Sua tarefa é escrever dois programas ou funções sobrepostoscompress e decompresscom a seguinte especificação:
* Não use no código de produção, provavelmente.
compress
compresspega duas strings em qualquer formato conveniente e as sobrepõe o máximo possível. Essa é uma string scom comprimento mínimo retornada de forma que ambas as strings de entrada sejam substrings de s. Além disso, é retornada alguma saída que identifica os índices inicial e final de ambas as seqüências.
Exemplos: (O formato exato de IO depende de você)
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
decompresscalcula a função inversa de compress, que recebe uma sequência e dois índices inicial e final (no formato em que são retornados pelo seu compress), retorna as duas sequências originais. Você só precisa manipular entradas válidas. A seguir a igualdade deveria valer para todas as cordas s1, s2:
(s1, s2) == decompress (compress (s1, s2))
Exemplos: (inversos de compressexemplos)
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"
Pontuação
Sua pontuação é o tamanho da string retornada chamando compress("<code of compress>", "<code of decompress>"). Como este é um código de golfe, uma pontuação menor é melhor.
Exemplo:
Suponha que o código para sua função compressseja c=abcde o código para decompressseja d=efghi. Então compress("c=abcd", "d=efghi")produz "c=abcd=efghi"(e os índices, mas esses não afetam a pontuação), então a pontuação é length "c=abcd=efghi" = 12.
Regras adicionais
- No espírito deste desafio, você deve
compressedecompressdeve se sobrepor em pelo menos um personagem. Você pode conseguir isso trivialmente adicionando um comentário, mas observe que isso aumentará sua pontuação e poderá haver soluções mais curtas usando código inerentemente sobreposto. compressedecompressdeve ser capaz de lidar com cadeias de caracteres que contenham caracteres ASCII imprimíveis, além de todos os caracteres usados para definircompressedecompress.- Os índices podem ser zero ou um indexados.
- Seus programas ou funções não precisam ser nomeados
compressedecompress.