В Ruby строки могут быть превращены в массивы символов, и тогда вы можете получать от них все виды удовольствия:
def duup?(str)
!!str.chars.each_cons(2).find { |a,b| a == b }
end
Где это просто использует each_cons
( каждый подряд ) итератор и находит первый экземпляр двух букв идентичными.
Если это не достаточно захватывающе:
def duup?(str)
!!str.chars.each_cons(2).lazy.map(&:uniq).map(&:length).include?(1)
end
Где это сводит каждую пару только к уникальным элементам и ищетте, которые свернуты в массив длины 1. lazy
добавлено для хорошей меры.
Вы также можете сделать что-то немного неясное, например:
def duup?(str)
!!(1...str.length).find { |i| str[i].ord ^ str[i-1].ord == 0 }
end
Если вам нравится двоичная математика, XOR вернет ноль, если два значения идентичны, поскольку они отменяют себя.
Или для простоты:
def duup?(str)
!!str.chars.each_cons(2).find { |v| v == v.reverse }
end
Где, если обратный набор совпадает с прямым набором, он долженбыть одним и тем же.
Обратите внимание, что некоторые из них можно легко масштабировать до N символов, так как 2
является совершенно произвольным.
В качестве упражненияВы можете хотеть скамейкупометьте эти подпрограммы строками различной длины.Некоторые подходы могут быть нежизнеспособными на огромных строках.