Re: Exercise of Programming with Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg131874] Re: Exercise of Programming with Mathematica
- From: Alexei Boulbitch <Alexei.Boulbitch at iee.lu>
- Date: Tue, 22 Oct 2013 00:48:17 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
Here is a rule designed to switch the order of each pair of expressions in a list. It works fine on the first example, but fails on the second. In[1]:= {{a, b}, {c, d}, {e, f}}/.{x_, y_} :> {y, x} Out[1]= {{b, a}, {d, c}, {f, e}} In[2]:= {{a, b}, {c, d}}/.{x_, y_} :> {y, x} Out[2]= {{c, d}, {a, b}} Explain what has gone wrong and rewrite this rule to correct the situation, that is, so that the second example returns {{b, a}, {d, c}} My solution is the most stupid one. {{a, b}, {c, d}}/.{{x_, y_}, {w_, t_}} :> {{y, x}, {t, w}} May I ask any elegant solutions? Thanks. You are right, this is a nice exercise in Mathematica. Considering it as such, I would like to offer few solutions that were not yet mentioned. Some of them are not shorter. What's the matter, is it not the exercise? Here are two list to try with: lst1 = {{a, b}, {c, d}, {e, f}}; lst2 = {{a, b}, {c, d}}; 1. Mapping Permute onto a list: Map[Permute[#, Cycles[{{2, 1}}]] &, lst1] Map[Permute[#, Cycles[{{2, 1}}]] &, lst2] {{b, a}, {d, c}, {f, e}} {{b, a}, {d, c}} 2. Using Transpose + Rule: Transpose[lst] /. {x_, y_} -> {y, x} // Transpose {{b, a}, {d, c}} 3. Transpose and hands: {Transpose[lst1][[2]], Transpose[lst1][[1]]} // Thread {{b, a}, {d, c}} Or {Transpose[lst1][[2]], Transpose[lst1][[1]]} // Transpose 4. Mapping a rule onto a list: Map[ReplaceAll[#, {x_, y_} -> {y, x}] &, lst1] Map[ReplaceAll[#, {x_, y_} -> {y, x}] &, lst2] {{b, a}, {d, c}, {f, e}} {{b, a}, {d, c}} 5. Using Thread+Rule+Thread or Transpose Transpose[Thread[lst1] /. {x_, y_} -> {y, x}] {{b, a}, {d, c}, {f, e}} Thread[Thread[lst1] /. {x_, y_} -> {y, x}] {{b, a}, {d, c}, {f, e}} Have fun, Alexei Alexei BOULBITCH, Dr., habil. IEE S.A. ZAE Weiergewan, 11, rue Edmond Reuter, L-5326 Contern, LUXEMBOURG Office phone : +352-2454-2566 Office fax: +352-2454-3566 mobile phone: +49 151 52 40 66 44 e-mail: alexei.boulbitch at iee.lu