using System;
using System.Globalization;
using System.Text;
public class Test
{
public static void Main()
{
var accentedEs = "e\u0301e\u0301e\u0301";
var fourCircles = char.ConvertFromUtf32(0x1F01C);
var normalString = "hello";
var normalStringWithRepeatingChar = "hellooo";
var twelveCircles = fourCircles + fourCircles + fourCircles;
Console.WriteLine(HasConsecutiveChars(normalString, 3));
Console.WriteLine(HasConsecutiveChars(twelveCircles, 3));
Console.WriteLine(HasConsecutiveChars(accentedEs, 3));
Console.WriteLine(HasConsecutiveChars(normalStringWithRepeatingChar, 3));
}
public static bool HasConsecutiveChars(string source, int sequenceLength)
{
var charEnumerator = StringInfo.GetTextElementEnumerator(source);
var currentElement = string.Empty;
int count = 1;
while (charEnumerator.MoveNext())
{
if (currentElement == charEnumerator.GetTextElement())
{
if (++count >= sequenceLength)
{
return true;
}
}
else
{
count = 1;
currentElement = charEnumerator.GetTextElement();
}
}
return false;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKdXNpbmcgU3lzdGVtLlRleHQ7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIGFjY2VudGVkRXMgPSAiZVx1MDMwMWVcdTAzMDFlXHUwMzAxIjsKCQl2YXIgZm91ckNpcmNsZXMgPSBjaGFyLkNvbnZlcnRGcm9tVXRmMzIoMHgxRjAxQyk7CgkJdmFyIG5vcm1hbFN0cmluZyA9ICJoZWxsbyI7CiAgICAgICAgdmFyIG5vcm1hbFN0cmluZ1dpdGhSZXBlYXRpbmdDaGFyID0gImhlbGxvb28iOwogICAgICAgIHZhciB0d2VsdmVDaXJjbGVzID0gZm91ckNpcmNsZXMgKyBmb3VyQ2lyY2xlcyArIGZvdXJDaXJjbGVzOwogICAgICAgIAogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKEhhc0NvbnNlY3V0aXZlQ2hhcnMobm9ybWFsU3RyaW5nLCAzKSk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoSGFzQ29uc2VjdXRpdmVDaGFycyh0d2VsdmVDaXJjbGVzLCAzKSk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoSGFzQ29uc2VjdXRpdmVDaGFycyhhY2NlbnRlZEVzLCAzKSk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoSGFzQ29uc2VjdXRpdmVDaGFycyhub3JtYWxTdHJpbmdXaXRoUmVwZWF0aW5nQ2hhciwgMykpOwoJfQoJCglwdWJsaWMgc3RhdGljIGJvb2wgSGFzQ29uc2VjdXRpdmVDaGFycyhzdHJpbmcgc291cmNlLCBpbnQgc2VxdWVuY2VMZW5ndGgpCgl7CgkJdmFyIGNoYXJFbnVtZXJhdG9yID0gU3RyaW5nSW5mby5HZXRUZXh0RWxlbWVudEVudW1lcmF0b3Ioc291cmNlKTsKCSAgICB2YXIgY3VycmVudEVsZW1lbnQgPSBzdHJpbmcuRW1wdHk7CgkJaW50IGNvdW50ID0gMTsKCQl3aGlsZSAoY2hhckVudW1lcmF0b3IuTW92ZU5leHQoKSkgCgkJewoJCQlpZiAoY3VycmVudEVsZW1lbnQgPT0gY2hhckVudW1lcmF0b3IuR2V0VGV4dEVsZW1lbnQoKSkKCQkJewoJCQkJIGlmICgrK2NvdW50ID49IHNlcXVlbmNlTGVuZ3RoKQoJCQkJIHsKCQkJCSAJcmV0dXJuIHRydWU7CgkJCQkgfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJY291bnQgPSAxOwoJCQkJY3VycmVudEVsZW1lbnQgPSBjaGFyRW51bWVyYXRvci5HZXRUZXh0RWxlbWVudCgpOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KfQ==