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 decompress
com a seguinte especificação:
* Não use no código de produção, provavelmente.
compress
compress
pega duas strings em qualquer formato conveniente e as sobrepõe o máximo possível. Essa é uma string s
com 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
decompress
calcula 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 compress
exemplos)
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 compress
seja c=abcd
e o código para decompress
seja 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
compress
edecompress
deve 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. compress
edecompress
deve ser capaz de lidar com cadeias de caracteres que contenham caracteres ASCII imprimíveis, além de todos os caracteres usados para definircompress
edecompress
.- Os índices podem ser zero ou um indexados.
- Seus programas ou funções não precisam ser nomeados
compress
edecompress
.