#include "mpi.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int testWinner(char player1, char player2);
const char* rsp = "rsp";
int main(int argc, char* argv[])
{
int size, rank, play, otherPlay, tag1 = 1, tag2 = 2, winner = -1000;
MPI_Status Stat;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
MPI_Send(&play, 1, MPI_INT, 1, tag1, MPI_COMM_WORLD);
MPI_Recv(&otherPlay, 1, MPI_INT, 1, tag2, MPI_COMM_WORLD, &Stat);
winner = testWinner(rsp[play], rsp[otherPlay]);
}
else if (rank == 1) {
MPI_Recv(&otherPlay, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, &Stat);
MPI_Send(&play, 1, MPI_INT, 0, tag2, MPI_COMM_WORLD);
winner = testWinner(rsp[otherPlay], rsp[play]);
}
printf("The winner from processor %d is %d\n", rank
, winner
); MPI_Finalize();
return 0;
}
int testWinner(char player1, char player2)
{
if (player1 == player2)
return -1;
if ((player1 == 'r' && player2 == 's') ||
(player1 == 's' && player2 == 'p') ||
(player1 == 'p' && player2 == 'r'))
return 0;
return 1;
}
CiNpbmNsdWRlICJtcGkuaCIgCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgppbnQgdGVzdFdpbm5lcihjaGFyIHBsYXllcjEsIGNoYXIgcGxheWVyMik7Cgpjb25zdCBjaGFyKiByc3AgPSAicnNwIjsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICAgICAgICBpbnQgc2l6ZSwgcmFuaywgcGxheSwgb3RoZXJQbGF5LCB0YWcxID0gMSwgdGFnMiA9IDIsIHdpbm5lciA9IC0xMDAwOwogICAgICAgIE1QSV9TdGF0dXMgU3RhdDsKICAgICAgICAKICAgICAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKICAgICAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICAgICAgCiAgICAgICAgc3JhbmQocmFuayAqIHRpbWUoMCkpOwogICAgICAgIHBsYXkgPSByYW5kKCkgJSAzOwoKICAgICAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgICAgICAgICBNUElfU2VuZCgmcGxheSwgMSwgTVBJX0lOVCwgMSwgdGFnMSwgTVBJX0NPTU1fV09STEQpOwogICAgICAgICAgICAgICAgTVBJX1JlY3YoJm90aGVyUGxheSwgMSwgTVBJX0lOVCwgMSwgdGFnMiwgTVBJX0NPTU1fV09STEQsICZTdGF0KTsKICAgICAgICAgICAgICAgIHdpbm5lciA9IHRlc3RXaW5uZXIocnNwW3BsYXldLCByc3Bbb3RoZXJQbGF5XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJhbmsgPT0gMSkgewoKICAgICAgICAgICAgICAgIE1QSV9SZWN2KCZvdGhlclBsYXksIDEsIE1QSV9JTlQsIDAsIHRhZzEsIE1QSV9DT01NX1dPUkxELCAmU3RhdCk7CiAgICAgICAgICAgICAgICBNUElfU2VuZCgmcGxheSwgMSwgTVBJX0lOVCwgMCwgdGFnMiwgTVBJX0NPTU1fV09STEQpOwogICAgICAgICAgICAgICAgd2lubmVyID0gdGVzdFdpbm5lcihyc3Bbb3RoZXJQbGF5XSwgcnNwW3BsYXldKTsKICAgICAgICB9CgogICAgICAgIHByaW50ZigiVGhlIHdpbm5lciBmcm9tIHByb2Nlc3NvciAlZCBpcyAlZFxuIiwgcmFuaywgd2lubmVyKTsKICAgICAgICBNUElfRmluYWxpemUoKTsKICAgICAgICByZXR1cm4gMDsKfQoKaW50IHRlc3RXaW5uZXIoY2hhciBwbGF5ZXIxLCBjaGFyIHBsYXllcjIpCnsKICAgICAgICBpZiAocGxheWVyMSA9PSBwbGF5ZXIyKQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICgocGxheWVyMSA9PSAncicgJiYgcGxheWVyMiA9PSAncycpIHx8CiAgICAgICAgICAgICAgICAocGxheWVyMSA9PSAncycgJiYgcGxheWVyMiA9PSAncCcpIHx8CiAgICAgICAgICAgICAgICAocGxheWVyMSA9PSAncCcgJiYgcGxheWVyMiA9PSAncicpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIDE7Cn0K