using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
class Program {
static void Main(string[] args) {
var source = Enumerable.Range(0, 10000000);
var sw = Stopwatch.StartNew();
var r = Windowed(source, 3).Count();
sw.Stop();
Console.WriteLine(r);
Console.WriteLine(sw.Elapsed);
}
static IEnumerable<T[]> Windowed<T>(IEnumerable<T> source, int windowSize) {
if (source == null)
throw new ArgumentNullException("source");
if (windowSize <= 0)
throw new ArgumentOutOfRangeException("windowSize");
var arr = new T[windowSize];
int r = (windowSize - 1);
int i = 0;
foreach (var item in source) {
arr[i] = item;
i = (i + 1) % windowSize;
if (r == 0) {
var arrR = new T[windowSize];
for (int j = 0; j < windowSize; j++)
arrR[j] = arr[(i + j) % windowSize];
yield return arrR;
} else {
r--;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwp1c2luZyBTeXN0ZW0uTGlucTsKCiAgICBjbGFzcyBQcm9ncmFtIHsKCiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBFbnVtZXJhYmxlLlJhbmdlKDAsIDEwMDAwMDAwKTsKICAgICAgICAgICAgdmFyIHN3ID0gU3RvcHdhdGNoLlN0YXJ0TmV3KCk7CiAgICAgICAgICAgIHZhciByID0gV2luZG93ZWQoc291cmNlLCAzKS5Db3VudCgpOwogICAgICAgICAgICBzdy5TdG9wKCk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHIpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBJRW51bWVyYWJsZTxUW10+IFdpbmRvd2VkPFQ+KElFbnVtZXJhYmxlPFQ+IHNvdXJjZSwgaW50IHdpbmRvd1NpemUpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigic291cmNlIik7CiAgICAgICAgICAgIGlmICh3aW5kb3dTaXplIDw9IDApCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJ3aW5kb3dTaXplIik7CiAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgVFt3aW5kb3dTaXplXTsKICAgICAgICAgICAgaW50IHIgPSAod2luZG93U2l6ZSAtIDEpOwogICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHNvdXJjZSkgewogICAgICAgICAgICAgICAgYXJyW2ldID0gaXRlbTsKICAgICAgICAgICAgICAgIGkgPSAoaSArIDEpICUgd2luZG93U2l6ZTsKICAgICAgICAgICAgICAgIGlmIChyID09IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJyUiA9IG5ldyBUW3dpbmRvd1NpemVdOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2luZG93U2l6ZTsgaisrKQogICAgICAgICAgICAgICAgICAgICAgICBhcnJSW2pdID0gYXJyWyhpICsgaikgJSB3aW5kb3dTaXplXTsKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gYXJyUjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgci0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQo=