How to tell if there are at least 5 consecutive entries in one 8-by-1 matrix with 8 integers?

1 view (last 30 days)
Han on 31 May 2013
Hi:
I am looking for a way to determine if there are AT LEAST 5 consecutive values in one 8-by-1 matrix with 8 integers. The 8 integers do NOT have to be unique. And I prefer this to be short and loop-free.
The consecutive values have to be in a "straight", meaning that [5 1 3 4 2 6 8 7] would work because it has at least 5 (actually 8) consecutive values in a straight. The straight is 1 2 3 4 5 6 7 8.
But [1 2 3 4 10 9 8 7] would not because it only has 4 values in each of the straight. The first straight is 1 2 3 4. The second straight is 7 8 9 10.
Thank you very much for your help (I'm writing this for my TexasHoldEm function for fun)
Han on 1 Jun 2013
@Image Analyst: You are right, it should be [5 1 3 4 2 6 8 7]'

Daniel Shub on 31 May 2013
Edited: Daniel Shub on 3 Jun 2013
As people are giving answers, I am pretty confident that
not(isempty(strfind(diff(sort(unique(x))), ones(1, 4))))
works. I am less confident that
not(all(diff(sort(unique(x)), 4)))
works, but if it does, it is much cooler as I rarely use the second argument to diff. After further thinking the second approach does not work. It fails in all sorts of unique ways, for example 1,3,5,7,9.
Han on 1 Jun 2013
any(strfind(diff(unique(x)), ones(1, 4))) it is then. Thanks

Roger Stafford on 31 May 2013
Edited: Roger Stafford on 1 Jun 2013
It can all be put into one line:
any(diff(find([true;diff(unique(x))~=1;true]))>=5)
Daniel Shub on 1 Jun 2013
Looking at the non sequential entries, nice.

Image Analyst on 31 May 2013
data = [9; 1; 2; 3; 4; 5; 6; 9] % Sample data.
diffData = diff(data)
countOf1s = sum(diffData==1)+1
atLeast5 = countOf1s >= 5
Han on 31 May 2013
@Image Analyst Thanks very much for your help. But I do not have image processing toolbox. I heard it's expensive.

Azzi Abdelmalek on 31 May 2013
a=[3 2 3 4 5 5 7 6 8];
e=[1 diff(a)];
e(e==0)=1;
idx=strfind(e,[true,true,true,true]) % it exist if idx~=0
Daniel Shub on 31 May 2013
Of course, apparently I am not thinking straight, but a = ones(1, 8) still passes your test.

Azzi Abdelmalek on 31 May 2013
Edited: Azzi Abdelmalek on 31 May 2013
a=[1; 2; 3; 5; 6; 7; 9; 10]
a=sort(a)
e=[1 ;diff(a)];
e(e==0)=1;
idx=~isempty(strfind(e',[true,true,true,true])) % it exist if idx=1
Azzi Abdelmalek on 31 May 2013
Edited: Azzi Abdelmalek on 31 May 2013
Yes, Look at edited answer (e' instead of e), and this is working for a=ones(8,1)