MathGroup Archive 2009

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

Search the Archive

Re: Re: Ten chess-players...

  • To: mathgroup at smc.vnet.net
  • Subject: [mg99366] Re: [mg99352] Re: Ten chess-players...
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Mon, 4 May 2009 05:59:02 -0400 (EDT)
  • References: <36a5dba2-11b9-45df-84c3-9e712e47fec9@q33g2000pra.googlegroups.com>

Hi,

I think, the solution of DrMajorBob is superior, since mine is
non-deterministic and slow. In any case, it is better to first obtain all
the schedule in a
single data structure (matrix or just list), and then, if you insist on
printing,
 write a separate printing routine. In this way, you don't touch your solver
code if you later decide to rewrite the printing routine or do something
else with your results.

Taking your code (I would recommend to avoid imperative programming in
Mathematica, but at least, to localize your variables) it is a
straightforward change to produce a list of games by replacing Print by
Reap-Sow:

In[1] =
games =
 Module[{numPlayers = 10, odd, a1, a3, a4, i, b1, j},
  Reap[
Do[
     If[OddQ[numPlayers], odd = 1; numPlayers = numPlayers + odd,
      odd = 0]; a1 = Range[2, numPlayers];
     If[odd == 1, a1 = a1 /. a1[[numPlayers - 1]] -> 0];
     a3 = Range[1, numPlayers/2];
     a4 = Range[numPlayers, numPlayers/2 + 1, -1];
     For[i = 1, i < 10, i++, a1 = RotateLeft[a1];
      b1 = Join[{1}, a1];
      For[j = 1, j < numPlayers/2 + 1, j++,
       Sow[{b1[[a3[[j]]]], b1[[a4[[j]]]]}]]], {1}]][[2, 1]]]

Out[1] = {{1, 2}, {3, 10}, {4, 9}, {5, 8}, {6, 7}, {1, 3}, {4, 2}, {5, 10},
{6,
   9}, {7, 8}, {1, 4}, {5, 3}, {6, 2}, {7, 10}, {8, 9}, {1, 5}, {6,
  4}, {7, 3}, {8, 2}, {9, 10}, {1, 6}, {7, 5}, {8, 4}, {9, 3}, {10,
  2}, {1, 7}, {8, 6}, {9, 5}, {10, 4}, {2, 3}, {1, 8}, {9, 7}, {10,
  6}, {2, 5}, {3, 4}, {1, 9}, {10, 8}, {2, 7}, {3, 6}, {4, 5}, {1,
  10}, {2, 9}, {3, 8}, {4, 7}, {5, 6}}


The following will then print the results in more or less the way you want:

In[2] = Print @@ Flatten[{"  ", #1, ":", #2, "  "} & @@@ #] & /@
  Transpose@Partition[games, 5];


  1:2    1:3    1:4    1:5    1:6    1:7    1:8    1:9    1:10

  3:10    4:2    5:3    6:4    7:5    8:6    9:7    10:8    2:9

  4:9    5:10    6:2    7:3    8:4    9:5    10:6    2:7    3:8

  5:8    6:9    7:10    8:2    9:3    10:4    2:5    3:6    4:7

  6:7    7:8    8:9    9:10    10:2    2:3    3:4    4:5    5:6

Hope this helps.

Regards,
Leonid




On Sun, May 3, 2009 at 2:23 AM, Bruno Campanini <BC at gmail.com> wrote:

> "Leonid Shifrin" <lshifr at gmail.com> wrote in message
> news:gth5l5$f3c$1 at smc.vnet.net...
>
> > If I understand correctly, you would like to find some player arrangement
> > such that each player plays each day exactly once, and at the end,
> > each player plays with all the others. While I don't know the general way
> > to efficiently produce all such solutions, this code seems to get some
> > particular one in about a second or less on the average on my PC. It is
> > rather ad hoc in the way it looks for a solution - perhaps there are
> > faster
> > and more systematic and elegant ways but I did not figure them out.
> >
> > In[1] =
> >
> > getSolution[numOfPlayers_?EvenQ] :=
> [..]
>
> You understood very well what I'd like to do and your formula
> works perfectly!
> But it's very hard to me to understand the algorithm you used
> because of my very poor knowledge of Mathematica.
> Then I tried resembling something from my Visual Basic routine:
>
> Do[numPlayers := 10;
>  If[OddQ[numPlayers], odd = 1; numPlayers = numPlayers + odd,
>  odd = 0]; a1 = Range[2, numPlayers];
>  If[odd == 1, a1 = a1 /. a1[[numPlayers - 1]] -> 0];
>  a3 = Range[1, numPlayers/2];
>  a4 = Range[numPlayers, numPlayers/2 + 1, -1];
>  For[i = 1, i < 10, i++, a1 = RotateLeft[a1];
>  b1 = Join[{1}, a1];
>  For[j = 1, j < numPlayers/2 + 1, j++,
>   Print[b1[[a3[[j]]]] , " ", b1[[a4[[j]]]]]]], {1}]
>
> I works also ok but I'm unable to get it printing by columns, i.e:
> 1  2          1  3          1  4
> 3  10        4  2          5  3
> 4  9          5   10       6  2
> 5  8          6  9          7  10
> 6  7          7  8          8  9
> etc.
>
> Could you help me?
>
> Bruno
>
> PS
> I works even with an odd number of players, adding 1 to that
> number and replacing the last player with zero.
>
>


  • Prev by Date: Re: issues with GraphPlot
  • Next by Date: Do some definite integral calculation.
  • Previous by thread: Re: Ten chess-players...
  • Next by thread: MemoryInUse and Print