Eines der weniger bekannten Programmierparadigmen, das für das Code-Golfen eher geeignet zu sein scheint, ist das Overlapping Oriented Programming (OOP) *. Wenn Sie teilweise identischen Code schreiben, können viele Bytes gespeichert werden, indem Sie einfach identische Teile überlappen und sich merken, wo die beiden ursprünglichen Codezeilen beginnen. Ihre Aufgabe ist es zwei zu schreiben überlappende Programme oder Funktionen compress
und decompress
mit der folgenden Spezifikation:
* Im Seriencode wahrscheinlich nicht verwenden.
compress
compress
Nimmt zwei Zeichenfolgen in einem beliebigen Format und überlappt sie so weit wie möglich. Das heißt, eine Zeichenfolge s
mit minimaler Länge wird zurückgegeben, sodass beide Eingabezeichenfolgen Teilzeichenfolgen von sind s
. Außerdem wird eine Ausgabe zurückgegeben, die den Start- und den Endindex beider Zeichenfolgen identifiziert.
Beispiele: (Das genaue IO-Format liegt bei Ihnen)
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
berechnet die Umkehrfunktion von compress
, dh , wenn ein String und zwei Start- und Endindizes (in dem Format, in dem sie von Ihrem zurückgegeben werden compress
) angegeben werden, geben Sie die beiden ursprünglichen Strings zurück. Sie müssen nur gültige Eingaben verarbeiten. Die folgende Gleichheit für alle Saiten halten soll s1
, s2
:
(s1, s2) == decompress (compress (s1, s2))
Beispiele: (Umkehrung der compress
Beispiele)
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"
Wertung
Ihre Punktzahl entspricht der Größe der Zeichenfolge, die beim Aufruf zurückgegeben wird compress("<code of compress>", "<code of decompress>")
. Da dies Code-Golf ist, ist eine niedrigere Punktzahl besser.
Beispiel:
Angenommen, der Code für Ihre Funktion compress
ist c=abcd
und der Code für decompress
ist d=efghi
. Dann compress("c=abcd", "d=efghi")
ergibt sich "c=abcd=efghi"
(und die Indizes, aber diese haben keinen Einfluss auf die Punktzahl), so dass die Punktzahl ist length "c=abcd=efghi" = 12
.
Zusätzliche Regeln
- Im Geiste dieser Herausforderung muss sich Ihr
compress
und in mindestens einem Charakterdecompress
überschneiden . Sie können dies trivial erreichen, indem Sie einen Kommentar hinzufügen. Beachten Sie jedoch, dass dies Ihre Punktzahl erhöht und es möglicherweise kürzere Lösungen gibt, bei denen sich inhärent überlappender Code verwendet wird. compress
unddecompress
sollte in der Lage sein, Zeichenfolgen zu verarbeiten, die druckbare ASCII-Zeichen sowie alle Zeichen enthalten, die Sie zum Definieren voncompress
und verwendet habendecompress
.- Die Indizes können null- oder einindexiert sein.
- Ihre Programme oder Funktionen müssen nicht unbedingt benannt sein
compress
unddecompress
.