長さKのストリングTがストリングSでK回以上現れるなら、それは潜在的に共産的です。例えば、でそれが現れるため、潜在的に共産主義で2回と長さである2。これらの部分文字列は重複できないことに注意してください。10
10/10
共産変換は、この文字列かかり一つでTを、各キャラクタが移動するT iは、のTをする私の発生TにおけるS。したがって、前の例では、共産主義の変換は次のようになり1/0
ます。10
置換の最初の文字が10
最初に10
検出され、0
2回目に検出されます。
共産正規化は、全てのそのようなストリングとる関数であるTとK ≥2及び実行共産変換をそれらに。
アルゴリズムの詳細:
- 最初に最長の有効な文字列Tで 共産主義の変換を実行します。Tの最初の出現を優先します。
- 次に、次に長い文字列で共産主義的な変換を実行し、次に次に長い文字列で...などを実行します。
- そのような文字列が文字列に存在しなくなるまで繰り返します。
テストケースの「Hello、Hello」の例などの一部の文字列は、2つの異なる方法で解釈できることに注意してください。あなたは使用することができるell
ためにTが、あなたにも使用することができますllo
。この場合、コードはいずれかのオプションを選択できます。示されているテストケースではを使用llo
していますが、異なる有効な出力が得られる場合があります。
あなたの仕事は、共産主義の正規化を実装することです。入力は、印刷可能なASCII文字(0x20〜0x7E、ティルドまでのスペース)のみで構成されます。このタスクを解決するプログラムまたは関数を作成できます。入力は、STDINからの行、文字列/文字配列引数、ARGVからの引数などとして取得できます。
テストケース
'123' -> '123'
'111' -> '111'
'1111' -> '11'
'ABAB' -> 'AB'
'111111111' -> '111'
'asdasdasd' -> 'asd'
'10/10' -> '1/0'
'100/100+100' -> '1/0+0'
' + + ' -> ' + '
'Hello, hello, dear fellow!' -> 'Hel he, dear feow!' OR 'Heo hl, dear flow!'
'11122333/11122333/11122333' -> '112/13' OR '132/23'
'ababab1ababab' -> 'a1bab'
'1ab2ab3ab4ab5ab6' -> '1a2b3a4b5ab6'
テストケースを作成しました
形式は'string', 'substring'
、置換の各ステップでです。交換されたビットは括弧で囲まれています。
'11[122]333/11[122]333/11[122]333', '122'
'111[333]/112[333]/112[333]', '333'
'1113/11[23]/11[23]', '23'
'11[13]/112/1[13]', '13'
'1[11]/[11]2/13', '11'
'1[/1]12[/1]3', '/1'
'112/13', ''
別のテストケース:
'Hello, hello, dear fellow!', 'llo'
'Hel, hel, dear feow!', 'l,'
'Hel he, dear feow!', ''
参照コード(Python)
これは、アルゴリズムを視覚化するのに役立ちます。
#!/usr/bin/env python
import re
def repeater(string):
def repeating_substring(substring):
return (string.count(substring) == len(substring)) and string.count(substring) > 1
return repeating_substring
def get_substrings(string):
j = 1
a = set()
while True:
for i in range(len(string) - j+1):
a.add(string[i:i+j])
if j == len(string):
break
j += 1
return list(a)
def replace_each_instance(string, substring):
assert `string`+',', `substring`
for i in substring:
string = re.sub(re.escape(substring), i, string, 1)
return string
def main(s):
repeats = repeater(s)
repeating_substr = filter(repeater(s), get_substrings(s))
while repeating_substr:
repeating_substr.sort(lambda x,y: cmp(len(y), len(x)))
s = replace_each_instance(s, repeating_substr[0])
repeating_substr = filter(repeater(s), get_substrings(s))
return s
assert main('123') == '123'
assert main('111') == '111'
assert main('1111') == '11'
assert main('ABAB') == 'AB'
assert main('111111111') == '111'
assert main('asdasdasd') == 'asd'
assert main('10/10') == '1/0'
assert main('100/100+100') == '1/0+0'
assert main(' + + ') == ' + '
assert main('Hello, hello, dear fellow!') == 'Hel he, dear feow!'
assert main('11122333/11122333/11122333') == '112/13'
このチャレンジの元のアイデアを投稿してくれた@ ConorO'Brienに感謝します。
ab
両方の文字列で少なくとも2回発生します。
ababab1ababab
、1ab2ab3ab4ab5ab6