MathGroup Archive 2013

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

Search the Archive

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





  • Prev by Date: Re: Exercise of Programming with Mathematica
  • Next by Date: Re: controllers in manipulate
  • Previous by thread: Re: Exercise of Programming with Mathematica
  • Next by thread: Re: Exercise of Programming with Mathematica