MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Detect pairs, tripples in a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22466] Re: [mg22442] Detect pairs, tripples in a list
  • From: Wagner Truppel <wtruppel at uci.edu>
  • Date: Wed, 8 Mar 2000 02:22:04 -0500 (EST)
  • References: <200003050523.AAA13830@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

At 12:23 AM -0500 on 3/5/00, hans.steffani at e-technik.tu-chemnitz.de 
(Hans Friedrich Steffan wrote:

>I have a list with many 0s and some 1s. Now I want to detect pairs
>and tripples of 1s with no 0 between to substitute them by a single 1
>and the apropriate number of 0. How can this be done?
>
>Hans Friedrich Steffani

Hans,

if I understand correctly what you want to accomplish, the following 
should work. Let t be the list you have, for instance,

t = {1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 
0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0};

Then, the construct

t //. { { x___, y_, y_, y_, z___ } /; ( y == 1 ) -> { x, T, z },
         { x___, y_, y_, z___ }     /; ( y == 1 ) -> { x, D, z } }

replaces contiguous appearances of two 1's by the letter D (for 
doubles) and contiguous appearances of three 1's by the letter T (for 
triples). Of course, you can have 1 instead of D and T; I have D and 
T just to make the explanation for how this works more transparent.

The pattern { x___, y_, y_, y_, z___ }, where ___ is three blanks and 
_ is a single blank, matches the following structure: { anything, 
including no-thing (that's the x part) followed by three identical 
non-empty things (that's the three y's with a single blank each) 
followed again by anything, including no-thing (the z part) }. Thus, 
for instance, this pattern matches the three 1's at the start of t, 
since then x would be nothing and z would be everything that follows 
those three 1's.

The rule

{ x___, y_, y_, y_, z___ } /; ( y == 1 ) -> { x, T, z }

then says to replace a structure matching that pattern with the 
structure obtained by replacing all three y's with T, preserving 
whatever appears before (the x part) and whatever appears after (the 
z part), provided that y = 1 (the operator /; imposes on the pattern 
the condition following /;). Thus, even though the pattern also 
matches { anything, 0, 0, 0, anything }, the rule isn't applied to 
this structure.

The other rule,

{ x___, y_, y_, z___ } /; ( y == 1 ) -> { x, D, z }

works similarly, replacing contiguous double appearances of 1 with D.

The //. tells Mathematica to continually apply both rules until no 
more replacements can be found. The sometimes more common choice /. 
would apply each rule only once.

Finally, there may be some subtlety regarding the order in which the 
rules should be applied. I believe Mathematica applies the rules in 
the order you give. In case of doubt, you can always break the entire 
construct into parts and force whichever order you need, as follows

m = t //. { { x___, y_, y_, y_, z___ } /; ( y == 1 ) -> { x, T, z } };

m = m //. { { x___, y_, y_, z___ }     /; ( y == 1 ) -> { x, D, z } }

In any case, the output of my proposed solution on the list

{1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 
0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0};

is

{      T, 0, 1, 0,    D, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0,    D, 0, 1, 
0,       T,       T, 0,       T, 0, 0, 1, 0, 1, 0}

where I added some spaces for ease of reading.

I hope this is what you're looking for.

Wagner Truppel
wtruppel at uci.edu


  • Prev by Date: Re: string-variable-Set-snarl
  • Next by Date: Reduce
  • Previous by thread: Detect pairs, tripples in a list
  • Next by thread: Re: Detect pairs, tripples in a list