Slashdot Mirror


A Rock Paper Scissors Brainteaser

New submitter arsheive (609065) writes with a link to this interesting RPS brainteaser: "How do you play against an opponent who _must_ throw Rock 50% of the time, and how much would you be willing to pay to play against them?"

6 of 167 comments (clear)

  1. Programming Course Topic by NeuroBoy · · Score: 4, Interesting

    I've been having students in my introductory programming courses work on this class of problem for a few years.. They all seem to really enjoy it. I code up bots to play RPS with certain biases just like the OP and they have to program a single player that identifies the bias in an opponent and adjusts its play to give it an advantage. They all routinely can generate solutions that perform far better than random against predictable, dumb bots, but things get very interesting when I throw the students' bots against each other in a throwdown tournament. :)

  2. Re:100% paper by BlackPignouf · · Score: 4, Informative

    From TFA: "At the start of each round an independent judge flips a fair coin and tells your opponent the result but does not tell you. If the coin came up heads your opponent must play rock."
    The opponent isn't forced to get at least 50% rock after any number of plays.

  3. Re:Simple.... Odds are even by narcc · · Score: 5, Funny

    Actually now that I think about it more

    ... you realize that you're doing the submitter's homework?

  4. Re:Simple.... Odds are even by ShanghaiBill · · Score: 5, Insightful

    The Nash Equilibrium is for you to play paper 2/3rds of the time, and rock 1/3rd. His best counter strategy is to play rock 50% (he cannot go lower) and scissors 50%. He cannot do better. If you deviate from 2/3 paper and 1/3 rock, he can adjust his strategy to do better. With the optimal strategy, you will win 1/2, lose 1/3, and tie 1/6.

    Here is my search for the Nash Equilibrium:

    #include

    struct rps {
        double rock;
        double paper;
        double scissors;
    };

    static double
    eval(struct rps *a, struct rps *b)
    {
        return
            (a->rock * (b->scissors - b->paper)) +
            (a->paper * (b->rock - b->scissors)) +
            (a->scissors * (b->paper - b->rock));
    }

    int
    main(void)
    {
        struct rps you;
        struct rps him;

        him.rock = 0.5;
        double worst_best_eval_for_him = 1.0;
        double best_rock_for_you = 0;
        double best_paper_for_you = 0;
        double worst_best_paper_for_him = 0;
        double dx = 0.001;
        for (you.rock = 0; you.rock best_eval_for_him) {
                        best_eval_for_him = p;
                        best_paper_for_him = him.paper;
                    }
                }
                if (worst_best_eval_for_him > best_eval_for_him) {
                    worst_best_eval_for_him = best_eval_for_him;
                    best_rock_for_you = you.rock;
                    best_paper_for_you = you.paper;
                    worst_best_paper_for_him = best_paper_for_him;
                }
            }
        }
        printf("worst_best_eval_for_him = %f\n", worst_best_eval_for_him);
        printf("best_rock_for_you = %f\n", best_rock_for_you);
        printf("best_paper_for_you = %f\n", best_paper_for_you);
        printf("worst_best_paper_for_him = %f\n", worst_best_paper_for_him);
        return 0;
    }

  5. Re:Simple.... Odds are even by ShanghaiBill · · Score: 5, Interesting

    Sorry, but Slashdot mangled that code badly because of the angle brackets.

    Let me try again:

    #include <stdio.h>

    struct rps {
        double rock;
        double paper;
        double scissors;
    };

    static double
    eval(struct rps *a, struct rps *b)
    {
        return
            (a->rock * (b->scissors - b->paper)) +
            (a->paper * (b->rock - b->scissors)) +
            (a->scissors * (b->paper - b->rock));
    }

    int
    main(void)
    {
        struct rps you;
        struct rps him;

        him.rock = 0.5;
        double worst_best_eval_for_him = 1.0;
        double best_rock_for_you = 0;
        double best_paper_for_you = 0;
        double worst_best_paper_for_him = 0;
        double dx = 0.001;
        for (you.rock = 0; you.rock < 1.0; you.rock += dx) {
            for (you.paper= 0; (you.paper + you.rock) < 1.0; you.paper+= dx) {
                you.scissors = 1.0 - you.rock - you.paper;
                double best_paper_for_him = 0.0;
                double best_eval_for_him = -1.0;
                for (him.paper = 0; him.paper < 0.5; him.paper += dx) {
                    him.scissors = 1.0 - him.rock - him.paper;
                    double p = eval(&him, &you);
                    if (p > best_eval_for_him) {
                        best_eval_for_him = p;
                        best_paper_for_him = him.paper;
                    }
                }
                if (worst_best_eval_for_him > best_eval_for_him) {
                    worst_best_eval_for_him = best_eval_for_him;
                    best_rock_for_you = you.rock;
                    best_paper_for_you = you.paper;
                    worst_best_paper_for_him = best_paper_for_him;
                }
            }
        }
        printf("worst_best_eval_for_him = %f\n", worst_best_eval_for_him);
        printf("best_rock_for_you = %f\n", best_rock_for_you);
        printf("best_paper_for_you = %f\n", best_paper_for_you);
        printf("worst_best_paper_for_him = %f\n", worst_best_paper_for_him);
        return 0;
    }

  6. Re:Always do rock. by ArcadeMan · · Score: 5, Funny

    Of course. You use the rock to smash him in the head while he tries to stab you with the scissors. Your friend then uses the paper to write a letter to your parents about how you died in a stupid fight about statistics.