Якщо рядок T довжиною K з’являється K або більше разів у рядку S , він потенційно є комуністичним . Наприклад, 10у 10/10потенційно комуністична, бо вона з'являється в 2 рази і має 2 довжини . Зауважте, що ці підрядки не можуть перетинатися.
Комуністичне перетворення є той , який приймає цей рядок T і переміщує кожен символ т I з Т до я входженню Т в S . Так, для попереднього прикладу комуністична трансформація дала б результат 1/0; перший знак 10замінює 10перший раз 10, а 0другий раз.
Комуністична нормалізація це функція , яка приймає всі такі рядки T з K ≥ 2 і виконує комуністичне перетворення на них.
Деякі особливості алгоритму:
- Виконання перетворень на комуністичні довжелезних дійсні рядки T першими . Favor перші входження Т .
- Потім виконайте комуністичні перетворення на наступних найдовших струнах, потім наступних-наступних-найдовших ... і т.д.
- Повторюйте, поки в рядку не існує таких рядків.
Зауважте, що деякі рядки, наприклад приклад "Привіт, привіт" у тестових випадках, можна інтерпретувати двома різними способами. Ви можете використовувати 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зустрічається щонайменше двічі в обох рядках.
ababab1ababab,1ab2ab3ab4ab5ab6