A simple array of integers is given. The problem is to detect if a pattern is repeatedly occurring in the array, and find the length of that pattern.
For example, for
{19, 6, 19, 6, 19, 6, 19, 6, 19, 6, 19, 6}
pattern {19, 6} should be detected and its length is 2.
For
{73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7}
pattern {73, 7, 4} should be detected and its length is 3. (at the end of the array there need not be the complete pattern, but the pattern should start at the beginning of the array)
For
{73, 7, 4, 7, 2, 6, 7, 2, 7, 73, 9, 17, 7, 7}
the whole array is the pattern and its length is 14.
Related links
SO question on cycle detection
Wikipedia article on cycle detection
Answer
This uses partitioning, with padding if required, to make sublists.
f = Module[{b, c = 1},
While[Length[b = Union@Partition[#, c, c, {1, 1}, Take[#, c]]] > 1, c++];
{Length@First@b, First@b}] &;
Example
f@{73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7}
{3, {73, 7, 4}}
Comments
Post a Comment