バイナリのスペースを節約するための一般的な最適化は、1つのリテラルが別のリテラルである文字列リテラルをマージすることです。たとえば、文字列リテラルを含むバイナリ
a: foobar
b: bar
c: barbaz
d: foobarbaz
e: baz
次の文字列リテラルプール(-terminatorを#
表す\0
)が含まれる場合があります。
foobar#foobarbaz#
記号でa
、b
、c
、およびd
文字列プールの先頭からの相対次の値を持ちます:
a: 0
b: 3
c: 10
d: 7
e: 13
このタスクでは、特定の入力文字列セットの文字列プールの最小サイズを計算する必要があります。
入力
入力は、それぞれが32〜127の範囲の最大80のASCII文字(改行を含まない)と、その後に単一の改行文字で構成される、最大999の一連の文字列です。
出力
各入力文字列(終端の改行を含む)がその文字列の部分文字列になるような最短の文字列を見つけます。出力は、その最も短い文字列の長さになります。文字列は出力せず、長さのみを出力します。
得点
この課題はコードゴルフであり、標準の抜け穴が適用されます。オクテットで最小長のソリューションが優先されます。
例
入力:
foobar bar barbaz foobarbaz baz
#
改行を表す最短の文字列:foobar#foobarbaz#
長さ:17
入力:
foobar foobaz foobarbaz barbaz
#
改行を表す最短の文字列:foobar#foobaz#foobarbaz#
長さ:24
1
80文字のテストケースが良いでしょう。また、「オクテット」と「バイト」の違いはありますか?それ以外の場合は、obscurer用語を使用する利点が何であるかわかりません。
—
Martin Ender 2015年
@MartinBüttner一部のマシンでは、1バイトのビット数が8ビットより多い場合と少ない場合があります(KnuthのMIXを参照)。オクテットは、8ビットの数量を指す標準的な単語です。バイトは、作業している特定のマシンの最小アドレス単位を指します。80文字の制限がそこにあるため、固定配列で作業できるため、「これは非常に長い入力で壊れるので無効です」とは言えません。
—
FUZxxl 2015年
すべての入力文字列はペアで区別されますか?
—
Alexey Burdin
@AlexeyBurdin No.
—
FUZxxl 2015年