コードゴルフに適していると思われるあまり知られていないプログラミングパラダイムの1つは、オーバーラップ指向プログラミング(OOP) *です。部分的に同一のコードを記述する場合、同一の部分を単にオーバーラップし、2つの元のコード行の開始位置を何らかの方法で記憶することにより、多くのバイトを節約できます。あなたの仕事は2書くことです重複したプログラムまたは機能をcompress
してdecompress
、以下の仕様で:
*本番コードではおそらく使用しないでください。
compress
compress
任意の便利な形式の2つの文字列を取り、可能な限りそれらをオーバーラップします。これは、s
両方の入力文字列がの部分文字列であるような最小長の文字列ですs
。さらに、両方の文字列の開始インデックスと終了インデックスを識別する出力が返されます。
例:(正確なIOフォーマットはあなた次第です)
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
の逆関数を計算しますcompress
。これは、文字列と2つの開始インデックスと終了インデックス(によって返される形式で)が与えられcompress
、2つの元の文字列を返します。有効な入力のみを処理する必要があります。以下の等式は、すべての文字列のために保持する必要がありs1
、s2
:
(s1, s2) == decompress (compress (s1, s2))
例:(例の逆compress
)
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"
得点
スコアは、を呼び出して返される文字列のサイズですcompress("<code of compress>", "<code of decompress>")
。これはコードゴルフなので、スコアが低いほど良いです。
例:
あなたの関数のコードと仮定しcompress
ているc=abcd
とのコードdecompress
ですd=efghi
。次にcompress("c=abcd", "d=efghi")
、"c=abcd=efghi"
(およびインデックス、ただしスコア付けに影響しない)が得られるため、スコアはになりlength "c=abcd=efghi" = 12
ます。
追加の規則
- この挑戦の精神では、あなた
compress
とあなたの少なくとも1つのキャラクターdecompress
が重複する必要があります。コメントを追加することでこれを簡単に達成できますが、そうするとスコアが増加し、本質的に重複するコードを使用した短いソリューションが存在する可能性があることに注意してください。 compress
そして、decompress
あなたが定義するために使用したすべての文字と同様に、印刷可能なASCII文字を含む文字列を処理できる必要がcompress
ありdecompress
ます。- インデックスは、ゼロまたは1インデックスにすることができます。
- あなたのプログラムや機能が実際に名前を付ける必要はありません
compress
とdecompress
。