Достаточно ли этого питона?
str = '--a-kbb-:xx---xtx:-----x--:---g-x--:-----x--:------X-:XXn-tt-X:l--f--O-'
sections = str.split (':')
reduce (lambda a, b: a | ('xxx' in b), [reduce(lambda c, d: c + d, map(lambda c: c[i], sections), '') for i in range(reduce (lambda e, f: max (e, len (f)), sections, 0))], False)
Объяснение
reduce (lambda e, f: max (e, len (f)), sections, 0)
рассчитывает максимальную длину сечения;
for i in range(reduce (lambda e, f: max (e, len (f)), sections, 0))
повторяет i
от нуля до максимальной длины секции минус 1;
map(lambda c: c[i], sections)
вычисляет список i-тых символов всех разделов;
reduce(lambda c, d: c + d, map(lambda c: c[i], sections), '')
вычисляет строку, состоящую из i-тых символов всех секций;
[reduce(lambda c, d: c + d, map(lambda c: c[i], sections), '') for i in range(reduce (lambda e, f: max (e, len (f)), sections, 0))]
вычисляет список строк, где i-я строка состоит из i-го символа всех секций;
и окончательное выражение возвращает True
в случае, если любая из строк в списке, вычисленных на предыдущем шаге, содержит три последовательных символа «x».