Re: String substitution system
- To: mathgroup at smc.vnet.net
- Subject: [mg97393] Re: String substitution system
- From: Raffy <raffy at mac.com>
- Date: Thu, 12 Mar 2009 02:20:39 -0500 (EST)
- References: <200903070738.CAA16935@smc.vnet.net> <gp081u$l3g$1@smc.vnet.net>
On Mar 11, 3:08 am, Hauke Reddmann <fc3a... at uni-hamburg.de> wrote: > THX for the answers. While I'm at it anyway, > is it still that easy when I need substitution rules > with placeholders? E.g. XY->YZ for fixed X,Z > but any string Y? > > -- > Hauke Reddmann <:-EX8 fc3a... at uni-hamburg.de > Nur Schufte schuften - Genie genie=DFt. In my above response, I don't think I understood your question entirely, after looking at DrMajorBob's response. So here is my code again, adapted to handle branched replacements: vAlphabet = {"A", "B", "C", "D"}; vWords = Map[StringJoin, Join @@ Table[Tuples[vAlphabet, i], {i, 7}]]; vRules = {"CC" -> "C", "DD" -> "D", "CA" -> "C", "AC" -> "C", "DB" -> "D", "BD" -> "D", "CDC" -> "C", "DCD" -> "D", "CBC" -> "C", "DAD" -> "D", "ABC" -> "DC", "CBA" -> "CD", "BAD" -> "CD", "DAB" -> "DC", "BAB" -> "ABA"}; explode[v_List, s_String] := Block[ {vFragments, vLength}, vFragments = FixedPoint[Union@Flatten@{StringReplaceList[#, v], #} &, {s}]; vLength = StringLength /@ vFragments; Pick[vFragments, vLength, Min[vLength]] ]; # -> explode[vRules, #] & /@ vWords Which will a result like: "AABABBA" -> {"AAAABAA", "AAABABA", "AABABBA"} (in the case of multiple, equal length results) Now, for your second question: you would want to create rules of the form: "X"~~x_ :> x<>"Y" I wrote a little function to create these results automatically: smartRule[sBefore_String -> sAfter_String] := Block[ {vBefore, vAfter, map}, map[s_] := Throw["Unable to fill slot: ", s]; vBefore = Characters[sBefore] /. x_String /; StringMatchQ[x, DigitCharacter] :> ReleaseHold@Pattern[Evaluate[map[x] = ToExpression["Hold[x" <> x <> "]"]], _]; vAfter = Characters[sAfter] /. x_String /; StringMatchQ[x, DigitCharacter] :> map[x]; ReleaseHold@ReplacePart[RuleDelayed[StringExpression @@ vBefore, Evaluate[vAfter]], {2, 0} -> StringJoin] ]; Which will do: smartRule["X1" -> "1Y"]: "X" ~~ x1_ :> x1 <> "Y" smartRule["X12" -> "1Y2"]: "X" ~~ x1_ ~~ x2_ :> x1 <> "Y" <> x2 smartRule["X11" -> "1Y1"]: "X" ~~ x1_ ~~ x1_ :> x1 <> "Y" <> x1 explode[{smartRule["A11" -> "1B"], "TB" -> "A"}, "ATT"] => {"A"}
- References:
- String substitution system
- From: Hauke Reddmann <fc3a501@uni-hamburg.de>
- String substitution system