I'm trying to make a pattern that's easy to preceive by human but hard to write out by Mathematica when I came across this problem. (Check the original problem herehere)
Let's check this simple case:
I've got a list {5,1,2,1,2,1,2,1,2,4,3,3,3,3,3,3,10}
and I would like to find out all the recurrence period and the sequence before and after them. So, if you have a brief match with your brain, you can know there are two possible matchs:{5,1,2,1,2,1,2,1,2,4,3,3,3,3,3,3,10} and {5,1,2,1,2,1,2,1,2,4,3,3,3,3,3,3,10}.
It's okay if I only want to find out one of them, using the following code will work as desired:
Replace[{5, 1, 2, 1, 2, 1, 2, 1, 2, 4, 3, 3, 3, 3, 3, 3, 10},
{Shortest[pre___, 3], Longest[Repeated[Shortest[rep__, 1], {2, Infinity}]], Shortest[inc___, 2]}
:> {{pre}, {rep}, {inc}}]
(*{{5}, {1, 2}, {4, 3, 3, 3, 3, 3, 3, 10}}*)
But If I want to find out all of them, it's not quite direct as the following code which simply change Replace
to ReplaceList
will not work:
r1=
ReplaceList[{5, 1, 2, 1, 2, 1, 2, 1, 2, 4, 3, 3, 3, 3, 3, 3, 10},
{Shortest[pre___, 3], Longest[Repeated[Shortest[rep__, 1], {2, Infinity}]], Shortest[inc___, 2]}
:> {{pre}, {rep}, {inc}}]
The result is incredibly long and included all the possible match and ignored all the Shortest
or Longest
:
r2 = ReplaceList[{5, 1, 2, 1, 2, 1, 2, 1, 2, 4, 3, 3, 3, 3, 3, 3, 10},
{pre___, Repeated[rep__, {2, Infinity}], inc___} :> {{pre}, {rep}, {inc}}]
Sort@r1==Sort@r2
(*True*)
This is, of course, not the desired result, but how can I set the pattern-matcher to do this work? And are there any reason that ReplaceList
will ignore all these Shortest
and Longest
? Any help or any other approach other than my way is appreciated. But of course, the final goal is to solve this using ReplaceList
or similar functions.