In version 10+, there is FindTransientRepeat
:
- FindTransientRepeat returns a pair of lists {transient,repeat} where the elements of repeat occur successively at least n times at the end of list.
- FindTransientRepeat accepts an incomplete copy of the repeated sublist in the last position
- The minimum number of repetitions refers to complete repetitions
For the examples in the posted question
lists = {{19, 6, 19, 6, 19, 6, 19, 6, 19, 6, 19, 6},
{73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7, 4, 73, 7},
{73, 7, 4, 7, 2, 6, 7, 2, 7, 73, 9, 17, 7, 7}};
we get
FindTransientRepeat[#, 2]& /@ lists
{{{}, {19, 6}},
{{}, {73, 7, 4}},
{{73, 7, 4, 7, 2, 6, 7, 2, 7, 73, 9, 17}, {7}}}
We can define a function that processes the output of FindTransientRepeat
to get the results in desired form:
Clearall[repeatsF]
repeatsF = Module[{ftr = FindTransientRepeat[#, 2], lst = #},
If[First @ ftr === {}, {Length @ Last @ ftr, Last @ ftr}, {Length @ lst, lst}]]&;
repeatsF /@ lists
{{2, {19, 6}},
{3, {73, 7, 4}},
{14, {73, 7, 4, 7, 2, 6, 7, 2, 7, 73, 9, 17, 7, 7}}}