The Math Forum

Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Math Forum » Discussions » Inactive » comp.soft-sys.math.mathematica

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Exercise of Programming with Mathematica
Replies: 8   Last Post: Oct 23, 2013 11:33 PM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Alexei Boulbitch

Posts: 483
Registered: 2/28/08
Re: Exercise of Programming with Mathematica
Posted: Oct 22, 2013 12:54 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

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?


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.
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


Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© The Math Forum at NCTM 1994-2018. All Rights Reserved.