using System;
using System.Collections.Generic;
public class Program
{
public static void Main(string[] args)
{
int[] arr = { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2 };
Console.WriteLine("arr");
foreach (var intervalo in arr.IntervalosCrescimento())
{
Console.WriteLine($"Start {intervalo.Item1}, end {intervalo.Item2}, sinal {intervalo.Item3}");
}
int[] arr2 = { 0, 1, 2, 3, 3, 3, 4, 5, 6, -1, -8, 0, 8 };
Console.WriteLine();
Console.WriteLine("arr2");
foreach (var intervalo in arr2.IntervalosCrescimento())
{
Console.WriteLine($"Start {intervalo.Item1}, end {intervalo.Item2}, sinal {intervalo.Item3}");
}
}
}
public static class ExtensionMethod
{
public static IEnumerable<Tuple<int, int, int>> IntervalosCrescimento<T>(this IEnumerable<T> en) where T : IComparable
{
bool first = true;
Tuple<int, int, int> result;
int start = -1;
int end = -1;
T previous = default(T);
int? previousSign = null;
int? sign = null;
int index = 0;
foreach (T current in en)
{
if (first)
{
first = false;
start = index;
previous = current;
}
else
{
sign = current.CompareTo(previous);
if (previousSign == null)
{
previousSign = sign;
}
else if (previousSign != sign)
{
end = index;
result = Tuple.Create(start, end, previousSign.Value);
start = index;
previousSign = sign;
yield return result;
}
previous = current;
++index;
}
}
end = index;
if (start < end)
yield return Tuple.Create(start, end, sign.Value);
}
}
CXVzaW5nIFN5c3RlbTsKCXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoJCglwdWJsaWMgY2xhc3MgUHJvZ3JhbQoJewoJICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCgkgICAgewoJICAgICAgICBpbnRbXSBhcnIgPSB7IDAsIDEsIDIsIDMsIDQsIDMsIDIsIDEsIDAsIDEsIDIgfTsKCSAgICAgICAgCgkgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhcnIiKTsKCSAgICAgICAgZm9yZWFjaCAodmFyIGludGVydmFsbyBpbiBhcnIuSW50ZXJ2YWxvc0NyZXNjaW1lbnRvKCkpCgkgICAgICAgIHsKCSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiU3RhcnQge2ludGVydmFsby5JdGVtMX0sIGVuZCB7aW50ZXJ2YWxvLkl0ZW0yfSwgc2luYWwge2ludGVydmFsby5JdGVtM30iKTsKCSAgICAgICAgfQoJICAgICAgICAKCSAgICAgICAgaW50W10gYXJyMiA9IHsgMCwgMSwgMiwgMywgMywgMywgNCwgNSwgNiwgLTEsIC04LCAwLCA4IH07CgkKCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFycjIiKTsKCSAgICAgICAgZm9yZWFjaCAodmFyIGludGVydmFsbyBpbiBhcnIyLkludGVydmFsb3NDcmVzY2ltZW50bygpKQoJICAgICAgICB7CgkgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlN0YXJ0IHtpbnRlcnZhbG8uSXRlbTF9LCBlbmQge2ludGVydmFsby5JdGVtMn0sIHNpbmFsIHtpbnRlcnZhbG8uSXRlbTN9Iik7CgkgICAgICAgIH0KCSAgICB9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXh0ZW5zaW9uTWV0aG9kCgl7CgkgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUdXBsZTxpbnQsIGludCwgaW50Pj4gSW50ZXJ2YWxvc0NyZXNjaW1lbnRvPFQ+KHRoaXMgSUVudW1lcmFibGU8VD4gZW4pIHdoZXJlIFQgOiBJQ29tcGFyYWJsZQoJICAgIHsKCSAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CgkKCSAgICAgICAgVHVwbGU8aW50LCBpbnQsIGludD4gcmVzdWx0OwoJCgkgICAgICAgIGludCBzdGFydCA9IC0xOwoJICAgICAgICBpbnQgZW5kID0gLTE7CgkKCSAgICAgICAgVCBwcmV2aW91cyA9IGRlZmF1bHQoVCk7CgkgICAgICAgIAoJICAgICAgICBpbnQ/IHByZXZpb3VzU2lnbiA9IG51bGw7CgkgICAgICAgIGludD8gc2lnbiA9IG51bGw7CgkKCSAgICAgICAgaW50IGluZGV4ID0gMDsKCQoJICAgICAgICBmb3JlYWNoIChUIGN1cnJlbnQgaW4gZW4pCgkgICAgICAgIHsKCSAgICAgICAgICAgIGlmIChmaXJzdCkKCSAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwoJICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7CgkgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgZWxzZQoJICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgIHNpZ24gPSBjdXJyZW50LkNvbXBhcmVUbyhwcmV2aW91cyk7CgkKCSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaWduID09IG51bGwpCgkgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1NpZ24gPSBzaWduOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2aW91c1NpZ24gIT0gc2lnbikKCSAgICAgICAgICAgICAgICB7CgkgICAgICAgICAgICAgICAgICAgIGVuZCA9IGluZGV4OwoJCgkgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFR1cGxlLkNyZWF0ZShzdGFydCwgZW5kLCBwcmV2aW91c1NpZ24uVmFsdWUpOwoJCgkgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7CgkgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzU2lnbiA9IHNpZ247CgkKCSAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHJlc3VsdDsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAKCSAgICAgICAgCSAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgICAJICAgICAgICAJKytpbmRleDsKCSAgICAgICAgICAgIH0KCSAgICAgICAgIH0KCQoJICAgICAgICBlbmQgPSBpbmRleDsKCSAKCSAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKQoJICAgICAgICAgICAgeWllbGQgcmV0dXJuIFR1cGxlLkNyZWF0ZShzdGFydCwgZW5kLCBzaWduLlZhbHVlKTsKCSAgICB9Cgl9
arr
Start 0, end 4, sinal 1
Start 4, end 8, sinal -1
Start 8, end 10, sinal 1
arr2
Start 0, end 3, sinal 1
Start 3, end 5, sinal 0
Start 5, end 8, sinal 1
Start 8, end 10, sinal -1
Start 10, end 12, sinal 1