Вводится строка, если в ней есть 3 подряд стоящих одинаковых символа, то надо вывести NO, если нет - YES
-
Регулярочки? Или кто подскажет красивое решение на Монти?– smackmychi12 сен 2014 в 17:10
-
Не понял оба вопроса.– Hashirama12 сен 2014 в 17:11
-
Странный цикл какой-то нужно так: for k in range( 0, len(str)-3 ): if same3( str[k:k+3] ): ... Или регулярка: (.)\1{2} Если не более трех подряд: (.)\1{2}(?!\1)– ReinRaus12 сен 2014 в 18:14
-
ReinRaus, спасибо, использовал Ваш цикл, все почти хорошо, за исключением того, что если в строке три подряд символа идут после более 3х разных, то выводит несколько раз YES и один раз NO. Как исправить эту ошибку?– Hashirama12 сен 2014 в 18:44
Добавить комментарий
|
2 ответа
Регулярные выражения спешат на помощь!
import re
str1 = 'qwerty'
str2 = 'qwerttty'
regex = re.compile(r'^.*(.)(\1)(\1).*$')
print 'YES' if regex.match(str1) else 'NO'
print 'YES' if regex.match(str2) else 'NO'
А ваша программа не работает потому что в срезе, который вы берёте на каждой итерации всего 2 элемента.
>>> s = [1, 2, 3, 4, 5]
>>> i = 2
>>> j = 0
>>> s[j:i]
[1, 2]
Ну, или как-то так:
same3 = lambda s: min([len(x) for x in [set(x) for x in [s[x:x+3] for x in range(len(s) - 2)]]]) == 1
same3('qwerty') // False
same3('qwerttty') // True
Да! Я сделал это! Я написал программу, менее читабельную, чем регулярка, которой она эквивалентна!
А если серьёзно, эта программа делает следующее:
s = 'qwerty'
triplets = [s[x:x+3] for x in range(len(s) - 2)]
// находим все тройки подряд идущих символов
// для `qwerty` получим ['qwe', 'wer', 'ert', 'rty']
sets = [set(x) for x in triplets]
// каждую тройку преобразуем в множество (set)
// особенность множества - в нём нет повторяющихся элементов
lengths = [len(x) for x in sets]
// вычисляем размер каждого множества
// если размер какого-либо множества равен 1, то все элементы, входящие в него, равны
minlen = min(lengths)
// находим множество минимальной длины
print minlen == 1
Ну, и объявление функции same3 = lambda s: ...
эквивалентно классическому:
def same3(s):
...
-
1С такой регулярной строка, содержащая более 3 одинаковых букв в ряд "qwqrtttttttqff" тоже будет засчитана. Можно ли изменить это поведение силами рег. выражений?– moron12 сен 2014 в 18:12
-
1@moron: Любая строка, содержащая 4 одиноковых букв в ряд, также содержит 3 одинаковых буквы подряд. Если изменить условие и потребовать, чтобы ровно 3 подряд стоящих одинаковых символа шло, то это также можно сделать с помощью рег. выр.:
(.)(?<!\1.)\1{2}(?!\1)
– jfs13 сен 2014 в 2:48
Вводится строка, если в ней есть 3 подряд стоящих одинаковых символа, то надо вывести NO, если нет - YES
import re
print("NO" if re.search(r"(.)" + r"\1" * (3 - 1), s) else "YES")
Или без регулярных выражений:
from itertools import groupby
print("NO" if any(len(list(dups)) > (3 - 1) for _, dups in groupby(s)) else "YES")