fork download
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. public class Program
  5. {
  6. public static void Main(string[] args)
  7. {
  8. int[] arr = { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2 };
  9.  
  10. Console.WriteLine("arr");
  11. foreach (var intervalo in arr.IntervalosCrescimento())
  12. {
  13. Console.WriteLine($"Start {intervalo.Item1}, end {intervalo.Item2}, sinal {intervalo.Item3}");
  14. }
  15.  
  16. int[] arr2 = { 0, 1, 2, 3, 3, 3, 4, 5, 6, -1, -8, 0, 8 };
  17.  
  18. Console.WriteLine();
  19. Console.WriteLine("arr2");
  20. foreach (var intervalo in arr2.IntervalosCrescimento())
  21. {
  22. Console.WriteLine($"Start {intervalo.Item1}, end {intervalo.Item2}, sinal {intervalo.Item3}");
  23. }
  24. }
  25. }
  26.  
  27. public static class ExtensionMethod
  28. {
  29. public static IEnumerable<Tuple<int, int, int>> IntervalosCrescimento<T>(this IEnumerable<T> en) where T : IComparable
  30. {
  31. bool first = true;
  32.  
  33. Tuple<int, int, int> result;
  34.  
  35. int start = -1;
  36. int end = -1;
  37.  
  38. T previous = default(T);
  39.  
  40. int? previousSign = null;
  41. int? sign = null;
  42.  
  43. int index = 0;
  44.  
  45. foreach (T current in en)
  46. {
  47. if (first)
  48. {
  49. first = false;
  50. start = index;
  51. previous = current;
  52. }
  53. else
  54. {
  55. sign = current.CompareTo(previous);
  56.  
  57. if (previousSign == null)
  58. {
  59. previousSign = sign;
  60. }
  61. else if (previousSign != sign)
  62. {
  63. end = index;
  64.  
  65. result = Tuple.Create(start, end, previousSign.Value);
  66.  
  67. start = index;
  68. previousSign = sign;
  69.  
  70. yield return result;
  71. }
  72.  
  73. previous = current;
  74. ++index;
  75. }
  76. }
  77.  
  78. end = index;
  79.  
  80. if (start < end)
  81. yield return Tuple.Create(start, end, sign.Value);
  82. }
  83. }
Success #stdin #stdout 0.02s 131520KB
stdin
Standard input is empty
stdout
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