Я просматривал страницу с кодом Perl code (не спрашиваю почему) и наткнулся на это:
Отверстие 3 - наименьший повторяющийся узор
Напишите подпрограмму, которая принимает строку, которая может состоять из
повторяющийся шаблон и возвращает наименьшую повторяющуюся подстроку. Если
строка не состоит из повторяющегося шаблона, подпрограмма
должен вернуть undef или пустую строку. e.g.:
input output
'aaaaaa' 'a'
'ababab' 'ab'
'aabaab' 'aab'
'ababaa' ''
Очевидно, в Perl это можно выразить как sub g3 { pop=~/^(.*?)\1+\z/s&&$1 }
Я не знаю много Perl, поэтому я не понимаю, как это работает. Что самое лучшее, что мы можем сделать в Scala? Меня больше интересует элегантность, чем точное количество символов.
Вот моя попытка, но она довольно уродлива, поэтому я и спрашиваю.
def srp(s: String) =
s.inits.toList.tail.init.map(i => (i * (s.size / i.size), i)).
filter(_._1 == s).map(_._2).reverse.headOption.getOrElse("")