私は、既存の用語と重複しないことを期待して、自分自身を転がす用語ループを思いついた。基本的に、私は印刷されたテキストのループを見つけるためのアルゴリズムを考え出そうとしています。
単純なものから複雑なものまでのいくつかの例
例1
与えられた:
a a a a a b c d
私は言いたい:
5x(a) b c d
またはアルゴリズム的に:
for 1 .. 5
print a
end
print b
print c
print d
例2
与えられた:
a b a b a b a b c d
私は言いたい:
4x(a b) c d
またはアルゴリズム的に:
for 1 .. 4
print a
print b
end
print c
print d
例3
与えられた:
a b c d b c d b c d b c e
私は言いたい:
a 3x(b c d) b c e
またはアルゴリズム的に:
print a
for 1 .. 3
print b
print c
print d
end
print b
print c
print d
それは私が知っているアルゴリズムを思い出させませんでした。問題のいくつかはあいまいになる可能性があるように感じますが、今のところ、解決策の1つを見つけるだけで十分です。効率はいつでも歓迎ですが、必須ではありません。これどうやってするの?
編集
まず第一に、すべての議論に感謝します。ロゼッタのLZWアルゴリズムを採用し、入力で実行しました。
abcdbcdbcdbcdef
それは私に与えました:
a
b
c
d
8 => bc
10 => db
9 => cd
11 => bcd
e
f
私が持っている辞書:
a a
c c
b b
e e
d d
f f
8 bc
9 cd
10 db
11 bcd
12 dbc
13 cdb
14 bcde
15 ef
7 ab
圧縮には適しているように見えますが、私が望んでいたものではありません。私が必要としているのは、私の例からのアルゴリズム表現の圧縮のようなものです。
- 後続のシーケンス(シーケンスが繰り返されている場合、間に他のシーケンスはありません)
- 辞書はなく、ループのみ
- 還元不可能
- 最大シーケンスサイズ(アルゴリズム表現を最小化する)
- ネストされたループが許可されているとしましょう(コメントで前に言ったこととは反対に)