Re: Need a nice way to do this
- To: mathgroup at smc.vnet.net
- Subject: [mg40288] Re: [mg40279] Need a nice way to do this
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 30 Mar 2003 04:07:59 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Here is one (nice?) way of doing this that does not depend on how many different values s contains: f1[s_List] := MapIndexed[Length[DeleteCases[Take[s, First[#2]], #1]] &, s] and here is another one that works only (as it stands) with just two distinct values: f2[l_List] := Module[{mult = Length /@ Split[l], list1, list2, values}, list1 = Rest[FoldList[Plus, 0, Table[mult[[i]], {i, 1, Length[mult], 2}]]]; list2 = FoldList[Plus, 0, Table[mult[[i]], {i, 2, 2( Floor[(Length[mult] + 1)/2]) - 1, 2}]]; values = Take[Flatten[Transpose[{list2, list1}]], Length[mult]]; Flatten[Table[Table[values[[i]], { mult[[i]]}], {i, 1, Length[mult]}]]] The second function is a lot more complex and may not satisfy your criteria of "niceness" but it is also a lot more efficient. Let's first make sure they both work correctly with your original s: In[3]:= s={a,b,b,a,a,a,b,a,b,a,a}; In[4]:= f1[s] Out[4]= {0,1,1,2,2,2,4,3,5,4,4} In[5]:= f2[s] Out[5]= {0,1,1,2,2,2,4,3,5,4,4} Now let's try something bigger: In[6]:= s=Table[If[Random[Integer]==1,a,b],{10^3}]; In[7]:= a=f1[s];//Timing Out[7]= {1.37 Second,Null} In[8]:= b=f2[s];//Timing Out[8]= {0.04 Second,Null} In[9]:= a==b Out[9]= True So "niceness" doesn't always pays, it seems. Andrzej Kozlowski Yokohama, Japan http://www.mimuw.edu.pl/~akoz/ http://platon.c.u-tokyo.ac.jp/andrzej/ On Saturday, March 29, 2003, at 07:19 pm, Steve Gray wrote: > Given a list consisting of only two distinct values, such as > s={a,b,b,a,a,a,b,a,b,a,a}, I want to derive a list of equal length > g={0,1,1,2,2,2,4,3,5,4,4}. The rule is: for each position > 1<=p<=Length[s], look at list s and set g[[p]] to the number of > elements in s to the left of p which are not equal to s[[p]]. > In a more general version, which I do not need now, s would > not be restricted to only two distinct values. > > Thank you for any ideas, including other applications where > this particular calculation is used. The current application is an > unusual conjecture in geometry. > > > >