using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public static class Test
{
private static IEnumerable<string> GraphemeClusters(this string s) {
var enumerator = StringInfo.GetTextElementEnumerator(s);
while(enumerator.MoveNext()) {
yield return (string)enumerator.Current;
}
}
private static string ReverseGraphemeClusters(this string s) {
return string.Join("", s.GraphemeClusters().Reverse().ToArray());
}
private static string ReverseViper(this string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse( charArray );
return new string( charArray );
}
public static void Main()
{
var s = "Les Mise\u0301rables";
Console.WriteLine(s.ReverseGraphemeClusters());
Console.WriteLine(s.ReverseViper());
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CnVzaW5nIFN5c3RlbS5MaW5xOwoKcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0CnsKICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPHN0cmluZz4gR3JhcGhlbWVDbHVzdGVycyh0aGlzIHN0cmluZyBzKSB7CiAgICAgICAgdmFyIGVudW1lcmF0b3IgPSBTdHJpbmdJbmZvLkdldFRleHRFbGVtZW50RW51bWVyYXRvcihzKTsKICAgICAgICB3aGlsZShlbnVtZXJhdG9yLk1vdmVOZXh0KCkpIHsKICAgICAgICAgICAgeWllbGQgcmV0dXJuIChzdHJpbmcpZW51bWVyYXRvci5DdXJyZW50OwogICAgICAgIH0KICAgIH0KICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSZXZlcnNlR3JhcGhlbWVDbHVzdGVycyh0aGlzIHN0cmluZyBzKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5Kb2luKCIiLCBzLkdyYXBoZW1lQ2x1c3RlcnMoKS5SZXZlcnNlKCkuVG9BcnJheSgpKTsKICAgIH0KICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFJldmVyc2VWaXBlcih0aGlzIHN0cmluZyBzKQoJewogICAgCWNoYXJbXSBjaGFyQXJyYXkgPSBzLlRvQ2hhckFycmF5KCk7CiAgICAJQXJyYXkuUmV2ZXJzZSggY2hhckFycmF5ICk7CiAgICAJcmV0dXJuIG5ldyBzdHJpbmcoIGNoYXJBcnJheSApOwoJfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgcyA9ICJMZXMgTWlzZVx1MDMwMXJhYmxlcyI7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUocy5SZXZlcnNlR3JhcGhlbWVDbHVzdGVycygpKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShzLlJldmVyc2VWaXBlcigpKTsKCX0KfQ==