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 compressoraz decompressz poniższą specyfikacją:
* Prawdopodobnie nie używaj w kodzie produkcyjnym.
compress
compresspobiera dwa ciągi w dowolnym dogodnym formacie i nakłada się na nie w jak największym stopniu. To jest szwracany 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
decompressoblicza 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 compressprzykł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 compressjest c=abcdi kodem decompressjest 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
compressidecompressmuszą 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. compressidecompresspowinien być w stanie obsługiwać ciągi znaków zawierające dowolne drukowalne znaki ASCII, a także wszystkie znaki użyte do zdefiniowaniacompressidecompress.- Indeksy mogą być zerowane lub indeksowane jednokrotnie.
- Twoje programy lub funkcje nie muszą być tak naprawdę nazwane
compressidecompress.