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