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