Search All of the Math Forum:

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

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

 Messages: [ Previous | Next ]
 Alexei Boulbitch Posts: 483 Registered: 2/28/08
Re: Exercise of Programming with Mathematica
Posted: Oct 22, 2013 12:54 AM

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:

{{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}}

Transpose[Thread[lst1] /. {x_, y_} -> {y, x}]

{{b, a}, {d, c}, {f, e}}

{{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@iee.lu

Date Subject Author
10/19/13 Sseziwa Mukasa
10/19/13 Harvey P. Dale