Jednym z mniej znanych paradygmatów programowania, który wydaje się raczej odpowiedni do gry w golfa kodowego, jest programowanie nakładające się (OOP) *. Pisząc częściowo identyczny kod, wiele bajtów można zapisać, po prostu nakładając identyczne części i pamiętając w pewien sposób, gdzie zaczynają się dwie oryginalne linie kodu. Twoim zadaniem jest napisanie dwóch nakładających się programów lub funkcji compress
oraz decompress
z poniższą specyfikacją:
* Prawdopodobnie nie używaj w kodzie produkcyjnym.
compress
compress
pobiera dwa ciągi w dowolnym dogodnym formacie i nakłada się na nie w jak największym stopniu. To jest s
zwracany ciąg o minimalnej długości, tak że oba ciągi wejściowe są podciągami s
. Dodatkowo zwracane są niektóre dane wyjściowe, które identyfikują indeksy początkowe i końcowe obu łańcuchów.
Przykłady: (Dokładny format IO zależy od Ciebie)
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
oblicza odwrotną funkcję compress
, która otrzymuje ciąg znaków i dwa indeksy początkowy i końcowy (w formacie, w którym są zwracane przez ciebie compress
), zwracają dwa oryginalne ciągi. Potrzebujesz tylko obsługiwać prawidłowe dane wejściowe. Poniższy równość należy przytrzymać przez wszystkich ciągów s1
, s2
:
(s1, s2) == decompress (compress (s1, s2))
Przykłady: (odwrotne compress
przykłady)
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"
Punktacja
Twój wynik to rozmiar ciągu zwracanego przez wywołanie compress("<code of compress>", "<code of decompress>")
. Ponieważ jest to golf golfowy, niższy wynik jest lepszy.
Przykład:
Załóżmy, że kodem twojej funkcji compress
jest c=abcd
i kodem decompress
jest d=efghi
. Potem compress("c=abcd", "d=efghi")
daje "c=abcd=efghi"
(i wskaźniki, ale te nie wpływają na punktację), więc wynik jest length "c=abcd=efghi" = 12
.
Dodatkowe zasady
- W duchu tego wyzwania twoje
compress
idecompress
muszą nakładać się na co najmniej jedną postać. Możesz to zrobić w trywialny sposób, dodając komentarz, ale pamiętaj, że spowoduje to zwiększenie wyniku i mogą istnieć krótsze rozwiązania wykorzystujące z natury nakładający się kod. compress
idecompress
powinien być w stanie obsługiwać ciągi znaków zawierające dowolne drukowalne znaki ASCII, a także wszystkie znaki użyte do zdefiniowaniacompress
idecompress
.- Indeksy mogą być zerowane lub indeksowane jednokrotnie.
- Twoje programy lub funkcje nie muszą być tak naprawdę nazwane
compress
idecompress
.