Re: Set of strings reducing problem
- To: mathgroup at smc.vnet.net
- Subject: [mg58584] Re: Set of strings reducing problem
- From: "dkr" <dkrjeg at adelphia.net>
- Date: Fri, 8 Jul 2005 00:46:16 -0400 (EDT)
- References: <daitu8$t2v$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
compareString compares two strings and generates the desired string if
there is a single mismatch. Otherwise it generates {}.
In[1]:=
compareStrings[a_String,a_String]:={};
compareStrings[str1_String,str2_String]/;Equal[Length[str1],Length[str2]]:=
Module[{pos,chars1,chars2,thr,rules},
rules={{"1","X"}|{"X","1"}:>"D", {"1","2"}|{"2","1"} :>
"M",{"1","U"}|{"U","1"}|{"M","X"}|{"X","M"}|{"2","D"}|{"D","2"}:>
"T",{"2","X"}|{"X","2"}:>"U"};
chars1=Characters[str1]; chars2=Characters[str2];
thr=Thread[{chars1,chars2}];
pos=Position[thr,{a_,b_}/;b=!=a,{1},2];
If[ Equal[Length[pos],2],{},
StringJoin[ReplacePart[chars1,Extract[thr,First[pos]]/.rules,pos]]]];
Note the last argument of Position. There is no need to search beyond
the second mismatch.
In[3]:=
compareStrings["11112111","1111X111"]
Out[3]=
1111U111
compareStrings["11112111","1111X121"]
Out[4]=
{}
It wasn't exactly clear what you meant by taking all transformations.
If you want to look at all possible pairs of the original strings,
generating a new string from a pair only if there is a single mismatch,
and then looking at the collection of all the generated strings, you
can:
In[12]:=
genStrings[a_List]:=Flatten[compareStrings[#[[1]],#[[2]]]&/@Subsets[a,{2}]];
In[14]:=
origList={"11112111","1111X111","11111111","11112111","21122211","D1122211"};
In[15]:=
genStrings[origList]
Out[15]=
{1111U111,1111M111,1111D111,1111U111,1111M111,T1122211}