code: def num_windows_of_length_M_on_buffers_of_length_N(M, N):
      """
      For a window of length M rolling over a buffer of length N,
      there are (N - M) + 1 legal windows.
  
      Example:
      If my array has N=4 rows, and I want windows of length M=2, there are
      3 legal windows: data[0:2], data[1:3], and data[2:4].
      """
      return N - M + 1
  
imports: from collections import namedtuple
  from itertools import chain, product
  from textwrap import dedent
  from unittest import TestCase
  from nose_parameterized import parameterized
  from numpy import arange, array, asarray, dtype, full, where
  from six.moves import zip_longest
  from toolz import curry
  from catalyst.errors import WindowLengthNotPositive, WindowLengthTooLong
  from catalyst.lib.adjustment import Datetime64Overwrite, Datetime641DArrayOverwrite, Float64Multiply, Float64Overwrite, Float641DArrayOverwrite, Int64Overwrite, ObjectOverwrite
  from catalyst.lib.adjusted_array import AdjustedArray, NOMASK
  from catalyst.lib.labelarray import LabelArray
  from catalyst.testing import check_arrays, parameter_space
  from catalyst.utils.compat import unicode
  from catalyst.utils.numpy_utils import coerce_to_dtype, datetime64ns_dtype, default_missing_value_for_dtype, float64_dtype, int64_dtype, object_dtype
label_desc: Use image node_id 2 for calling a global function with example usage: num_windows_of_length_M_on_buffers_of_length_N(M, N) and returns: unknown