fork(1) download
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. int[] arraydada = { 1, 2, 2, 3, 10, 11, 100, 101, 102, 103 };
  12.  
  13. var groups = arraydada
  14. .DistinctAdjacently()
  15. .Differences()
  16. .Split(x => x.Difference != 1)
  17. .Select(x => new { First = x.First().Value, Count = x.Count() });
  18.  
  19. foreach (var g in groups)
  20. {
  21. Console.WriteLine("{0}を先頭に{1}個", g.First, g.Count);
  22. }
  23. }
  24.  
  25. }
  26.  
  27. /// <summary>
  28. /// シーケンス中の値と、階差(前の要素との差分)のペア。
  29. /// </summary>
  30. public class ValueDifferencePair
  31. {
  32. public ValueDifferencePair(int value, int difference)
  33. {
  34. this.value = value;
  35. this.difference = difference;
  36. }
  37.  
  38. private readonly int value;
  39.  
  40. /// <summary>
  41. /// 値。
  42. /// </summary>
  43. public int Value
  44. {
  45. get { return value; }
  46. }
  47.  
  48. private readonly int difference;
  49.  
  50. /// <summary>
  51. /// 前の要素との差分。
  52. /// </summary>
  53. public int Difference
  54. {
  55. get { return difference; }
  56. }
  57. }
  58.  
  59. public static partial class IntegerSequence
  60. {
  61. /// <summary>
  62. /// 隣り合ってる同じ値を1つにまとめてしまう。
  63. /// </summary>
  64. /// <typeparam name="T">要素の型</typeparam>
  65. /// <param name="seq">元シーケンス。</param>
  66. /// <returns>隣り合った重複を削除したシーケンス。</returns>
  67. public static IEnumerable<T> DistinctAdjacently<T>(this IEnumerable<T> seq)
  68. where T : struct
  69. {
  70. T? prev = null;
  71.  
  72. foreach (var x in seq)
  73. {
  74. if (prev == null || !prev.Equals(x))
  75. {
  76. yield return x;
  77. }
  78.  
  79. prev = x;
  80. }
  81. }
  82.  
  83. /// <summary>
  84. /// 特定の条件を満たすところでシーケンスを分割する。
  85. /// (条件を満たした箇所がサブ シーケンスの先頭になる。)
  86. ///
  87. /// 例えば、{ 1, 1, 0, 1, 1, 0 } というシーケンスを渡して、
  88. /// 「要素が 0」という条件で分割すると、結果は
  89. /// { { 1, 1 }, { 0, 1, 1 }, { 0 } }
  90. /// となる。
  91. /// </summary>
  92. /// <typeparam name="T">要素の型</typeparam>
  93. /// <param name="seq">元シーケンス。</param>
  94. /// <param name="splitCondition">分割条件。</param>
  95. /// <returns>分割したサブ シーケンス群。</returns>
  96. public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> seq, Predicate<T> splitCondition)
  97. {
  98. List<T> sub = null;
  99.  
  100. foreach (var x in seq)
  101. {
  102. if (splitCondition(x) && sub != null)
  103. {
  104. yield return sub;
  105. sub = new List<T>();
  106. }
  107. if (sub == null)
  108. {
  109. sub = new List<T>();
  110. }
  111.  
  112. sub.Add(x);
  113. }
  114.  
  115. if (sub != null && sub.Count != 0)
  116. {
  117. yield return sub;
  118. }
  119. }
  120.  
  121. /// <summary>
  122. /// シーケンスの階差を作る。
  123. /// </summary>
  124. /// <param name="seq">シーケンス。</param>
  125. /// <returns>値/階差のペアのシーケンス。</returns>
  126. public static IEnumerable<ValueDifferencePair> Differences(this IEnumerable<int> seq)
  127. {
  128. int? prev = null;
  129.  
  130. foreach (var x in seq)
  131. {
  132. var diff = prev == null ? 0 : x - (int)prev;
  133.  
  134. yield return new ValueDifferencePair(x, diff);
  135.  
  136. prev = x;
  137. }
  138. }
  139. }
  140. }
  141.  
Runtime error #stdin #stdout 0.05s 17008KB
stdin
Standard input is empty
stdout
Standard output is empty