Enchère unique la plus basse

22

Merci pour toutes les inscriptions, la date limite est maintenant passée et les notes finales sont à la fin de la question.
Félicitations à PhiNotPi pour une victoire assez complète.

Il s'agit d'un défi du , dont le but est de créer un programme qui gagne plus souvent que n'importe lequel de ses adversaires dans une enchère d'enchères uniques la plus basse.

Contribution

En entrée, le programme recevra toutes les offres des tours précédents, un tour par ligne, toutes les offres séparées par des espaces comme suit:

10 4 12 11 12 4 7 3 3
1 2 9 15 1 15 15 9 3
3 21 6 4 3 8 6 13 1

Chaque colonne de l'entrée représente l'enchère d'un bot. La première colonne est les offres du programme récepteur, tandis que les autres sont dans un ordre généré aléatoirement. Merci à hammar et Peter Taylor pour leur contribution.

L'entrée est fournie comme le seul et unique argument de ligne de commande (multi-ligne) à votre programme:

./test1 '1 2
3 4
5 6
1 2'

Cela signifie que votre programme devra être exécutable à partir de la ligne de commande. Veuillez donner un exemple d'invocation dans le cadre de votre réponse.

Au premier tour, uniquement pour vous permettre de savoir combien de bots vous affrontez, l'entrée sera une ligne de 0s - un pour chaque bot.

Sortie

Votre programme doit afficher son enchère sous forme d'entier compris entre 1 et 100 (inclus).

Programme des buteurs

Ceci est mon programme de notation - toute suggestion d'ajout, d'amélioration ou de correction de bogue serait la bienvenue.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUMROUNDS 10
#define NUMBOTS 4
#define MAXINPUTSIZE 10000
#define MAXFILENAMESIZE 100

int main()
{
    int i,j,a,b,winner;
    FILE *fp;
    char bots[NUMBOTS][MAXFILENAMESIZE]={"onesconfident","random100","random20","random5"};
    char openstring[MAXFILENAMESIZE+MAXINPUTSIZE+3];
    char input[MAXINPUTSIZE];
    char buff[5];
    int shuffle[NUMBOTS],auction[100],lowestbid[NUMBOTS]={[0 ... NUMBOTS-1]=101};
    static int guesses[NUMBOTS][NUMROUNDS];
    static int scores[NUMBOTS],totalwinbids[NUMBOTS];

    srand(time(NULL));

    for(i=0;i<NUMROUNDS;i++)
    {
        /*blank the auction bids for the next round */
        for(a=0;a<100;a++)
        {
            auction[a]=9999;
        }

        /*loop through the bots sending the input and storing their output */
        for(j=0;j<NUMBOTS;j++)
        {
            /*Fisher-Yates shuffle */
            for(b=0;b<NUMBOTS;b++)
            {
                shuffle[b]=(b+j)%NUMBOTS;/*put current bot at index 0 */
            }
            for(b=NUMBOTS-1;b>1;b--)
            {
                int z=rand()%(b-1)+1;/*make sure shuffle leaves index 0 alone */
                int t=shuffle[b];
                shuffle[b]=shuffle[z];
                shuffle[z]=t;
            }

            /*generate the input for the bots */
            strcpy(input,"'");
            if(i==0)
            {
                for(b=0;b<NUMBOTS;b++)
                {
                    if(b!=0)
                        sprintf(input,"%s 0",input);
                    else
                        sprintf(input,"%s0",input);
                }
            }
            else
            {
                for(a=0;a<i;a++)
                {
                    for(b=0;b<NUMBOTS;b++)
                    {
                        if(b!=0)
                            sprintf(input,"%s %d",input,guesses[shuffle[b]][a]);
                        else
                            sprintf(input,"%s%d",input,guesses[shuffle[b]][a]);
                    }
                    if(a!=i-1)
                        strcat(input,"\n");
                }
            }
            strcat(input,"'");

            sprintf(openstring,"%s %s",bots[j],input);
            fp=popen(openstring,"r");

            fgets(buff,3,fp);
            fflush(NULL);
            pclose(fp);
            guesses[j][i]=atoi(buff);

            /*add the bid to the auction, eliminating any duplicates */
            if(auction[atoi(buff)-1]!=9999)
                auction[atoi(buff)-1]=9998;
            else
                auction[atoi(buff)-1]=j;
        }

        winner=9999;
        /*add one to the score of the winning bot */
        for(a=0;a<100;a++)
        {
            if(auction[a]!=9998 && auction[a]!=9999)
            {
                winner=auction[a];
                scores[winner]+=1;
                totalwinbids[winner]+=guesses[winner][i];
                if(guesses[winner][i]<lowestbid[winner])
                    lowestbid[winner]=guesses[winner][i];
                break;
            }
        }

        /*output this round's bids and the winning bot's name */
        strcpy(input,"");
        for(b=0;b<NUMBOTS;b++)
        {
            if(strcmp(input,"")!=0)
                sprintf(input,"%s %d",input,guesses[b][i]);
            else
                sprintf(input,"%d",guesses[b][i]);
        }
        if(winner!=9999)
            printf("%s %s\n",input,bots[winner]);
        else
            printf("%s No winner\n",input);
    }

    /*output final scores */
    printf("\nResults:\n");
    printf("Bot\tScore\tTotal\tLowest\n");
    for(a=0;a<NUMBOTS;a++)
    {
        printf("%s\t%d\t%d\t%d\n",bots[a],scores[a],totalwinbids[a],lowestbid[a]);
    }

    return 0;
}

Joueurs de test

On est sûr de toujours enchérir 1.

#include <stdio.h>

int main()
{
    printf("1");
    return 0;
}

Random100 Enchères au hasard sur toute la plage

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(getpid());
    printf("%d",rand()%100+1);
    return 0;
}

Random20 offres au hasard entre 1 et 20

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(getpid());
    printf("%d",rand()%20+1);
    return 0;
}

Random5 Enchères au hasard entre 1 et 5

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(getpid());
    printf("%d",rand()%5+1);
    return 0;
}

Exemple d'exécution:

1 38 5 2 onesconfident
1 66 13 5 onesconfident
1 94 1 3 random5
1 22 9 1 random20
1 50 17 4 onesconfident
1 78 5 2 onesconfident
1 6 13 5 onesconfident
1 34 1 3 random5
1 62 9 1 random20
1 90 17 4 onesconfident

Results:
Bot Score   Total   Lowest
onesconfident   6   6   1
random100   0   0   101
random20    2   18  9
random5 2   6   3

Ces joueurs sont uniquement à des fins de test. Ils NE seront PAS inclus dans le concours. Vous pouvez entrer autant de bots que vous le souhaitez, donc si quelqu'un entre dans un bot qui ne fait que deviner 1, vous pouvez en entrer un autre qui fait de même pour le rendre inutile.

Gagnant

Le bot gagnant à chaque tour est celui qui donne l' enchère unique la plus basse . Donc, étant donné un tour dans lequel les offres suivantes sont faites: 1 1 3 5 2 3 6 3 2 8 7le gagnant serait le bot qui a soumissionné 5parce que les 1s, 2s et 3s ne sont pas uniques.

Le vainqueur de la compétition sera le programme qui gagne le plus de fois après 100 manches. En cas d'égalité, le total des offres gagnantes sera utilisé comme bris d'égalité et, s'il s'agit également d'une égalité, l'offre gagnante la plus basse sera utilisée comme bris d'égalité supplémentaire. Ces facteurs de notation sont tous générés par le programme de notation.

Je vais exécuter le programme de notation sur tous les programmes de travail qui ont été entrés dans 2 semaines à partir d'aujourd'hui (le 18 février maintenant étendu à 23 heures (GMT) le 20 février ). Je voterai pour toutes les entrées de travail et accepterai le gagnant de ma course de notation.

Course de notation finale

1 9 3 2 1 6 4 3 6 8 7 10 26 6 10 5 26 2 5 8 8 5 7 6 42 1 ./phinotpi2
1 11 4 2 1 4 9 20 6 8 7 6 26 4 8 4 26 2 5 8 8 5 7 7 42 1 ./phinotpi2
1 7 9 2 1 4 3 20 6 8 7 6 7 4 8 9 26 2 5 8 8 5 4 9 42 3 node minitech1.js
1 13 20 2 1 3 3 20 6 8 7 7 9 6 8 20 26 2 5 8 8 5 9 9 42 3 ./dirichlet
1 12 13 2 1 1 3 20 6 8 7 7 9 6 9 13 26 2 5 8 8 5 20 9 42 3 ./dirichlet
1 2 4 2 1 1 3 20 6 8 7 7 9 6 9 12 26 2 5 8 8 5 13 9 42 3 python blazer1.py
1 11 4 2 1 4 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 12 9 42 3 ./celtschk
1 3 4 2 1 1 3 20 6 8 7 6 7 4 8 9 26 2 5 8 8 5 4 9 42 3 node minitech1.js
1 7 4 2 1 1 3 20 6 8 7 9 26 6 7 20 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 9 9 2 1 3 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 20 9 42 10 ./phinotpi2
1 13 4 2 1 3 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 12 20 2 1 1 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 10 3 2 1 2 4 20 6 8 7 6 9 3 9 3 26 2 5 8 8 5 7 9 42 10 ./phinotpi2
1 6 9 2 1 4 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 8 4 2 1 3 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./celtschk
1 2 13 2 1 3 3 20 6 8 7 9 20 6 8 9 26 2 5 8 8 5 7 9 42 10 ruby1.9 strategist.rb
1 2 4 2 1 3 3 20 6 8 7 7 10 6 9 10 26 2 5 8 8 5 9 9 42 10 python blazer1.py
1 3 13 2 1 4 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 10 9 42 10 ./celtschk
1 4 4 2 1 3 3 20 6 8 7 6 7 4 8 9 26 2 5 8 8 5 4 9 42 10 ruby1.9 strategist.rb
1 4 9 2 1 4 3 20 6 8 7 7 9 6 8 10 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 11 7 2 1 1 4 20 6 8 7 6 7 3 8 3 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 6 4 2 1 3 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 13 7 2 1 1 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 7 4 2 1 4 4 20 6 8 7 6 20 3 8 3 26 2 5 8 8 5 7 9 42 10 ./celtschk
1 13 3 2 1 1 4 20 6 8 7 6 7 3 8 9 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 3 4 2 1 3 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 9 9 42 10 ruby1.9 strategist.rb
1 5 4 2 1 2 3 20 6 8 7 6 7 4 8 10 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 6 3 2 1 3 4 20 6 8 7 6 7 3 8 3 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 10 20 2 1 1 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 10 3 2 1 4 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./celtschk
1 12 4 2 1 1 3 20 6 8 7 9 20 6 8 9 26 2 5 8 8 5 7 9 42 10 ./phinotpi2
1 5 3 2 1 1 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 13 3 2 1 4 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 6 9 2 1 4 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 5 4 2 1 2 4 20 6 8 7 6 20 3 8 3 26 2 5 8 8 5 7 9 42 10 ./celtschk
1 12 3 2 1 3 4 20 6 8 7 6 7 3 8 9 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 10 7 2 1 2 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 9 10 2 1 4 9 20 6 8 7 4 6 3 8 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 9 20 2 1 4 4 20 6 8 7 6 20 3 8 7 26 2 5 8 8 5 3 9 42 10 ruby1.9 strategist.rb
1 6 3 2 1 3 3 20 6 8 7 9 10 6 9 10 26 2 5 8 8 5 7 9 42 10 node minitech1.js
1 13 3 2 1 3 3 20 6 8 7 7 10 6 8 20 26 2 5 8 8 5 10 9 42 11 ./celtschk
1 3 3 2 1 1 3 20 6 8 7 7 26 6 9 9 26 2 5 8 8 5 20 9 42 11 ruby1.9 strategist.rb
1 5 20 2 1 2 3 20 6 8 7 7 11 6 9 11 26 2 5 8 8 5 9 9 42 11 ./phinotpi2
1 7 3 2 1 4 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 11 9 42 11 node minitech1.js
1 7 3 2 1 1 4 20 6 8 7 6 7 3 8 20 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 8 4 2 1 4 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 20 9 42 10 ./phinotpi2
1 2 3 2 1 3 9 20 6 8 7 4 6 3 8 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 4 13 2 1 3 4 20 6 8 7 6 20 3 7 7 26 2 5 8 8 5 3 9 42 10 ./celtschk
1 8 3 2 1 3 3 20 6 8 7 9 20 6 8 9 26 2 5 8 8 5 7 9 42 10 ruby1.9 strategist.rb
1 9 10 2 1 2 3 20 6 8 7 7 10 6 9 10 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 10 20 2 1 1 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 9 4 2 1 1 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 11 20 2 1 4 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 4 9 2 1 3 4 20 6 8 7 6 9 3 9 3 26 2 5 8 8 5 7 9 42 10 ruby1.9 strategist.rb
1 5 3 2 1 4 4 20 6 8 7 6 7 3 8 10 26 2 5 8 8 5 3 9 42 10 ./celtschk
1 7 4 2 1 3 3 20 6 8 7 7 9 6 8 9 26 2 5 8 8 5 10 9 42 10 python blazer1.py
1 4 9 2 1 1 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 8 4 2 1 3 9 20 6 8 7 4 6 3 8 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 10 9 2 1 3 4 20 6 8 7 6 20 3 8 7 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 4 20 2 1 1 3 20 6 8 7 6 20 4 8 4 26 2 5 8 8 5 7 9 42 10 ./phinotpi2
1 5 3 2 1 2 9 20 6 8 7 4 6 3 9 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 2 4 2 1 1 4 20 6 8 7 6 20 3 8 7 26 2 5 8 8 5 3 9 42 10 ./celtschk
1 10 12 2 1 1 3 20 6 8 7 9 20 6 8 9 26 2 5 8 8 5 7 9 42 10 ./phinotpi2
1 9 4 2 1 4 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 9 9 42 10 ruby1.9 strategist.rb
1 11 3 2 1 3 4 20 6 8 7 6 7 3 8 10 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 8 4 2 1 1 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 13 9 2 1 4 9 20 6 8 7 4 6 3 8 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 2 9 2 1 3 4 20 6 8 7 6 20 3 8 7 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 8 3 2 1 2 3 20 6 8 7 6 20 4 8 4 26 2 5 8 8 5 7 9 42 10 ./celtschk
1 3 3 2 1 4 3 20 6 8 7 6 7 4 8 9 26 2 5 8 8 5 4 9 42 10 ruby1.9 strategist.rb
1 10 4 2 1 1 3 20 6 8 7 7 9 6 8 10 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 3 9 2 1 4 4 20 6 8 7 6 7 3 8 3 26 2 5 8 8 5 10 9 42 10 node minitech1.js
1 7 11 2 1 4 4 20 6 8 7 6 7 3 8 20 26 2 5 8 8 5 3 9 42 10 ./celtschk
1 8 3 2 1 2 3 20 6 8 7 7 9 6 8 9 26 2 5 8 8 5 20 9 42 10 ruby1.9 strategist.rb
1 3 10 2 1 3 3 20 6 8 7 7 10 6 9 10 26 2 5 8 8 5 9 9 42 10 node minitech1.js
1 8 4 2 1 1 3 20 6 8 7 7 10 6 8 20 26 2 5 8 8 5 10 9 42 11 ./phinotpi2
1 2 4 2 1 2 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 20 9 42 11 ruby1.9 strategist.rb
1 4 9 2 1 4 4 20 6 8 7 6 7 3 8 11 26 2 5 8 8 5 3 9 42 11 node minitech1.js
1 4 9 2 1 1 3 20 6 8 7 7 11 6 8 20 26 2 5 8 8 5 11 9 42 10 ./phinotpi2
1 2 7 2 1 1 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 20 9 42 10 ./phinotpi2
1 9 3 2 1 1 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 3 9 2 1 2 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ruby1.9 strategist.rb
1 5 7 2 1 3 3 20 6 8 7 10 20 6 8 10 26 2 5 8 8 5 7 9 42 10 ./celtschk
1 8 10 2 1 4 3 20 6 8 7 7 10 6 9 9 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 5 4 2 1 4 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 9 9 42 10 ruby1.9 strategist.rb
1 5 20 2 1 3 4 20 6 8 7 6 7 3 8 10 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 11 20 2 1 2 3 20 6 8 7 6 7 4 8 4 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 12 10 2 1 1 9 20 6 8 7 4 6 3 9 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 10 3 2 1 1 4 20 6 8 7 6 20 3 8 7 26 2 5 8 8 5 3 9 42 10 ./phinotpi2
1 9 4 2 1 4 3 20 6 8 7 6 20 4 8 4 26 2 5 8 8 5 7 9 42 10 ./phinotpi2
1 5 3 2 1 1 9 20 6 8 7 4 6 3 8 3 26 2 5 8 8 5 4 9 42 10 scala Schwarzenbeck
1 7 4 2 1 1 4 20 6 8 7 6 20 3 7 7 26 2 5 8 8 5 3 9 42 10 ./celtschk
1 11 7 2 1 3 3 20 6 8 7 9 20 6 8 9 26 2 5 8 8 5 7 9 42 10 ruby1.9 strategist.rb
1 13 10 2 1 1 3 20 6 8 7 7 10 6 9 10 26 2 5 8 8 5 9 9 42 10 ./phinotpi2
1 9 9 2 1 1 4 20 6 8 7 6 7 3 9 3 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 7 9 2 1 3 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 ruby1.9 strategist.rb
1 13 7 2 1 4 3 20 6 8 7 6 7 4 8 10 26 2 5 8 8 5 4 9 42 10 ./phinotpi2
1 8 7 2 1 1 4 20 6 8 7 6 7 3 8 3 26 2 5 8 8 5 10 9 42 10 ./phinotpi2
1 12 3 2 1 1 9 20 6 8 7 4 6 3 8 4 26 2 5 8 8 5 3 9 42 10 scala Schwarzenbeck
1 13 7 2 1 2 3 20 6 8 7 6 20 4 8 7 26 2 5 8 8 5 4 9 42 10 ./phinotpi2

Results:
Bot                 Score   Total   Lowest
perl phinotpi1.pl           0   0   101
./dirichlet                 2   25  12
python blazer1.py           3   12  4
perl chef.pl ilmari2.chef   0   0   101
./brainfuck ilmari1.bf      0   0   101
./christophe1               0   0   101
./phinotpi2                 44  156 3
node minitech1.js           7   140 20
scala Mueller               0   0   101
scala Beckenbauer           0   0   101
scala Schwarzenbeck         15  105 7
./alice                     0   0   101
./bob                       0   0   101
./eve                       0   0   101
python joe.py               0   0   101
python copycat.py           0   0   101
python totalbots.py         0   0   101
perl healthinspector.pl     0   0   101
./mellamokb1                0   0   101
./mellamokb2                0   0   101
php eightscancel.php        0   0   101
php fivescancel.php         0   0   101
python copycat2.py          0   0   101
./celtschk                  14  126 9
./deepthought               0   0   101
ruby1.9 strategist.rb       15  152 10
Gareth
la source
1
Hmm ... avec les règles écrites telles qu'elles sont, je pourrais vraiment gâcher le jeu en entrant 100 programmes qui proposent toujours chacun un numéro donné.
Ilmari Karonen
1
Pouvez-vous dire deux phrases, comment le bot gagnant est-il choisi? Je ne comprends pas.
utilisateur inconnu
@IlmariKaronen C'est vrai, vous pourriez. Mais j'espère que les gens ne feront pas ça. Je pourrais limiter le nombre d'entrées par personne, je suppose, mais je pense que je n'y recourrai que si des spoilers surviennent.
Gareth
@userunknown J'ai essayé de clarifier le fonctionnement des tours d'enchères.
Gareth
1
@PhiNotPi: Ne vous sentez pas coupable. Vous avez gagné dans les règles.
Steven Rumbalski

Réponses:

9

Perl

J'ai essayé un peu plus fort cette fois. C'est une stratégie complexe très simple , mais j'ai mis en place le cadre de l'expansion.

Édition: refaire complètement. Cette chose est là pour la victoire.

    sub prob{
$_[0]+$_[1]-$_[0]*$_[1]
}

$_=<>;
INPUT:{

tr/ /,/;
@in = eval;
for(1..$#in){
 $bids[$rnum][$in[$_]]++
}
for(0..$#in){
 $tbids[$rnum][$in[$_]]++
}
$rnum++;
$_=<>;
if($_ ne"\n"){redo INPUT}
}

for(0..100){$pre[$_]=0}

dirichlet: for(2..$#in/2+2){    #rough approximation, 
$pre[$_]=prob($pre[$_], 1/int($#in/2+1))
}

CDP:{
    @cdps1=(1,1,1,2,2,3,3,4);
    @cdps2=(-2,-1,0,1,1,2,2,3,3);
    for($a=0;$a<8;$a++){
    for($b=0;$b<9;$b++){
     $sum=$cdps1[$a]+$cdps2[$b];
     if($sum<1){$sum=1};
     $pre[$sum] = prob($pre[$sum], 1/72);
    }
    }
}

blazer: {
for($r=1;$r<$rnum;$r++){
winner: for($pnt=1;$pnt<101;$pnt++){
        if($tbids[$r][$pnt] == 1){
            if($pnt > 2){
                $winnum[$pnt]++;
            $wins++;
            }
        last winner
        }
}
    }
    if($wins==0){
    $pre[3]=prob($pre[3], 1);last blazer
    }
    for(1..100){
    $pre[$_]=prob($pre[$_], $winnum[$_]/$wins);
    }
}

CC1: for($pnt=1;$pnt<101;$pnt++){
    if($tbids[$rnum-1][$pnt] == 1){
        $pre[$pnt] = prob($pre[$pnt], 1);last CC1
    }
    if($pnt==100){
        for($pnt2=1;$pnt2<100;$pnt2++){
        $pre[$pnt2] = prob($pre[$pnt2], $tbids[$rnum-1][$pnt2]/($#in+1));
    }
    }
}

CC2: for($pnt=1;$pnt<101;$pnt++){
    if($rnum-2<0){$pre[7] = prob($pre[7], 1);last CC2}
    if($tbids[$rnum-2][$pnt] == 1){
        $pre[$pnt] = prob($pre[$pnt], 1);last CC2
    }
    if($pnt==100){
        $pre[7] = prob($pre[7], 1);last CC2
    }
}

one: {
$pre[1] = prob($pre[1], 1);
}

two: {
$pre[2] = prob($pre[2], 1);
}

five: {
$pre[5] = prob($pre[5], 1);
}

eight: {
$pre[8] = prob($pre[8], 1);
}

fortytwo: {
$pre[42] = prob($pre[42], 1);
}

mueller: {
    $a=($#in+2)/4;
    $pre[int$a]=prob($pre[int$a], 1)
}

schwarzenbeck: {
    $a=($#in+2)/4+1;
    $pre[int$a]=prob($pre[int$a], 1)
}

beckenbauer: {
    $a=($#in+2)/4+2;
    $pre[int$a]=prob($pre[int$a], 1)
}

totalbots: {
    $pre[$#in+1]=prob($pre[$#in+1], 1)
}

joe: {
$sum=0;
    for(1..100){
    $sum+=$tbids[$rnum-1][$_];
}
    $average=$sum/($#in+1);
    if($average==0){$average=10};
    $pre[$average]=prob($pre[$average], 1);
}

node: {
$max=0;$maxloc=0;
for(1..100){
    if($tbids[$rnum-1][$_]>$max){$max=$tbids[$rnum-1][$_];$maxloc=$_}
}
$maxloc--;
#if($maxloc==0){
$maxloc=20;
#}
if($rnum==1){$maxloc=3}
    $pre[$maxloc]=prob($pre[$maxloc], 1);
}
#print"\n@pre\n\n";

decide: for(1..100){if($pre[$_]<0.5){print; last decide}}

Ce programme prend l'entrée une ligne à la fois, suivi de deux retours à la ligne:

perl PhiNotPi2.plx
1 2 3 3 2
2 1 3 1 3
2 1 1 1 3
[empty line]
PhiNotPi
la source
Ok, cela met le métagaming à l'extrême.
Peter Taylor
@petertaylor Suis-je trop loin de la ligne? Dois-je revenir à mon original?
PhiNotPi
2
Ceci est un site connu pour les avocats des règles - il est parfaitement juste. Mais j'arrive à la conclusion que le mécanisme d'échange de pile n'est peut-être pas le meilleur pour les compétitions de roi de la colline.
Peter Taylor
J'en suis également arrivé à cette conclusion. Nous devons créer une méthode pour cacher les bots de la vue dans les compétitions futures. Pour autant que je sache, quelqu'un metagaming contre mes bots en ce moment.
PhiNotPi
Lol, c'était mon idée: P. Puisque vous avez déjà implémenté, et je me sens paresseux, je vous laisse l'avoir :) Notez que le seul type d'entrée que cela ne peut pas facilement battre sont ceux qui implémentent l'aléatoire
mellamokb
8

Chef

Puisque toujours miser 1 est désormais une stratégie perdante , la chose la plus évidente à faire est de toujours miser 2 à la place. Alors laissez-moi faire ça. Pour rendre cette entrée autrement ennuyeuse un peu plus intéressante, j'ai décidé de l'écrire dans Chef :

Shirred Eggs.

This recipe prints the number 2 and, in doing so, yields two delicious
shirred eggs.

Ingredients.
2 eggs

Cooking time: 12 minutes.

Pre-heat oven to 175 degrees Celsius.

Method.
Put eggs into mixing bowl. Pour contents of the mixing bowl into the
baking dish. Shirr the eggs. Bake the eggs until shirred.

Serves 1.

En prime, le programme fonctionne en fait plus ou moins comme une vraie recette - même banale -, même si elle se lit comme si l'écrivain était un peu, euh, cuit au four. La grammaire du chef semble rendre difficile l'écriture de tout ce qui implique quelque chose de plus compliqué que de mélanger des choses dans un bol et de les cuire et de les faire fonctionner à la fois comme programme et comme recette, surtout si l'un des verbes que l'on veut utiliser sont même légèrement irréguliers (comme "frire" → "frit").

Edit: Modification de la recette des œufs frits aux œufs rincés - merci à Blazer pour la suggestion! Le temps et la température de cuisson ne doivent être considérés qu'à titre indicatif; Je n'ai pas encore essayé la recette moi-même, donc je ne peux pas garantir leur précision.

Ilmari Karonen
la source
Je pense que cela produit 1: voir mon commentaire sur codegolf.stackexchange.com/a/4851 .
msh210
Il génère 2, au moins en utilisant l' interpréteur Acme :: Chef . La boucle finale est là juste pour l'obscurcissement, et pour que les convives n'aient pas à manger les œufs crus.
Ilmari Karonen
Ah, c'est vrai, j'ai raté le fait que les œufs étaient déjà dans le plat de cuisson et que ce n'est pas ce qui est décrémenté.
msh210
2
Vous l'appelez shirred eggs, ce qui se fait en fait dans un plat de cuisson et cela ferait de la recette une recette de cuisine valide et grammaticalement correcte. shirr the eggs. shirr the eggs until shirred.horray pour avoir une éducation culinaire à mon actif! :)
Blazer
1
le temps / température de cuisson semble à peu près correct :). bien sûr, utilisez-les uniquement à titre indicatif, car c'est le chef qui détermine si quelque chose est fait ou non, pas le temps / la température lui-même!
Blazer
4

Python (2.6)

Extrêmement simple, mais je suis toujours curieux de savoir comment cela fonctionnera par rapport aux autres approches.

import sys, random
try:
    s = sys.stdin.readlines()[-2]
    m = min(int(x) for x in s.split())
except IndexError:
    m = random.choice([1,1,1,2,2,3,3,4])
a = random.choice([-2,-1,0,1,1,2,2,3,3])
print max(m + a, 1)

Il suffit de diriger les enchères via stdin, par exemple python testbid.py < bids.txt.

EDIT : changé pour le «premier tour tous les zéros»

EDIT : changé un peu les 'nombres magiques' (une deuxième fois)

ChristopheD
la source
1
ne devrait pas l' m = random.choice(1,2,2,3,3,3)être m = random.choice([1,2,2,3,3,3])?
Blazer
Cela a jeté une erreur là où Blazer l'a dit. J'ai mis entre crochets pour le test et cela semble avoir fonctionné.
Gareth
@Blazer: oui, absolument (petite faute de frappe de ma part). Merci de l'avoir informé.
ChristopheD
4

Python (Blazer)

Ce bot analyse les tours précédents et enregistre les numéros gagnants. Les numéros gagnants qui apparaissent plus souvent auront donc plus de chances d'être sélectionnés. Il choisira ensuite au hasard des numéros parmi les numéros gagnants (autres que 1 ou 2). il choisira 2 3 à la place s'il s'agit du premier tour.

L'entrée est lue une ligne à la fois. entrez simplement une ligne vide pour ne plus accepter de saisie

Une astuce consiste à simplement coller (il accepte automatiquement chaque ligne avec \ n dans la pâte) et appuyez deux fois sur Entrée

Vous pouvez maintenant simplement exécuter le script avec un nom de fichier dans la ligne de commande:

python bidding.py bidding.txt

le fichier devrait ressembler à ceci:

10 4 12 11 12 4 7 3 3
1 2 9 15 1 15 15 9 3
3 21 6 4 3 8 6 13 1

-

import random
import sys

winning = [] # record the winning numbers

content = sys.argv[1].split('\n')  
for each in content:
    x = map(int, each.split())
    if len(x)+sum(x) == 0: 
        continue 

    y = []
    for each in x:
        if x.count(each) == 1:
            y.append(each)
    if len(y) > 0: 
        if min(y) not in [1,2]:  #never choose 1 or 2
            winning.append(min(y))

# choose an output
if len(winning) == 0:
    print 3
else:
    print random.choice(winning)

edit: ajouté or sum(rounds) == 0pour compenser la récente modification du premier tour tous les zéros

edit: les problèmes dans les commentaires ont été corrigés, ce qui a également permis de recevoir des entrées à partir d'un nom de fichier, et ne choisit plus '2' depuis que la concurrence l'a également éliminé. fonctionne avec tous les 0 comme entrée de départ ou aucune donnée dans le fichier

edit2: oublié un min ()

edit3: entrée modifiée pour répondre aux besoins d'entrée de la question

veste
la source
Provoque un petit problème avec le marqueur - je dois appuyer sur Entrée pour obtenir le score pour chaque tour. Pas beaucoup de problème pour mes essais de 10 tours, mais cela pourrait être pénible pour les 100 tours.
Gareth
@Gareth, enveloppez-le dans un script bash. echo "$@" | python bidding.pydevrait faire le travail.
Peter Taylor
J'ai essayé cela comme Peter l'a suggéré, mais j'obtiens une erreur TypeError: unsupported operand type(s) for +: 'int' and 'list'pour la ligne 23. J'utilise Python 2.6.1, est-ce le problème? ai-je besoin d'une version plus récente? J'obtiens le même problème sans utiliser le script bash.
Gareth
@Gareth serait-il utile que je fasse en sorte que l'entrée soit acheminée depuis sys.argv [1] avec un nom de fichier?
Blazer
@Blazer Je ne suis pas sûr que ce soit le problème. J'appelle le programme à partir de la ligne de commande moi-même en utilisant votre exemple d'appel et en obtenant l'erreur que j'ai donnée ci-dessus. Y a-t-il quelque chose d'incompatible avec Python 2.6.1?
Gareth
3

Schwarzenbeck (Scala)

object Schwarzenbeck extends App {
  println ((args(0).split('\n')(0).split(' ').length+1)/4+1)
}

Schwarzenbeck n'est pas censé marquer les buts. Il est le nettoyage de Beckenbauer, qui suivra bientôt. :)

Pour l'utiliser, vous avez besoin d'un compilateur et compilez-le

scalac Schwarzenbeck.scala 

Ensuite, vous pouvez l'exécuter:

scala Schwarzenbeck 'your ar-
gu-
ment' 

Edit: ajustements supplémentaires.

Utilisateur inconnu
la source
1
Étant donné que Schwarzenbeck n'était pas censé marquer les buts, je dirais qu'il a complètement échoué :-)
celtschk
Oui, j'avais un dilemme: j'ai fait une ligne de 3 joueurs et je m'attendais à ce que Müller marque le plus de points, mais d'une position stratégique, Schwarzenbeck a marqué la ligne de défense ultime. La métaphère du football a échoué, car ma ligne de défense a marqué les buts. :)
utilisateur inconnu
3

Stratège (Ruby)

Met en œuvre des centaines de stratégies simples: pour chaque tour, choisit celle qui aurait gagné le plus de tours précédents:

require 'Matrix'
def winner guesses
  g=guesses.sort
  while g[0]&&g[0]==g[1]
    g.shift while g[0]==g[1]
    g.shift
  end
  g[0]
end

def prob g
  prob=[0]*100;best=0;n=g.size*(g[0].size-1)
  g.each{|r|r[1..-1].each{|v|prob[v-1]+=1.0/n}};
  prob.map!{|v|v/n}
end    

def regression x, y, degree
  return y if x.size==1 
  x_data = x.map {|xi| (0..degree).map{|pow| (xi**pow.to_f) }}
  mx = Matrix[*x_data]
  my = Matrix.column_vector y
  begin
    r = ((mx.t * mx).inv * mx.t * my).transpose.to_a[0]
  rescue Exception => e
    r=[0]*degree;r[-1]=y[-1].to_f/(x[-1]**degree)
  end
  r
end

brains=((1..50).map{|w|[proc{|g|w},
    proc{|g|best=0;(p=prob g).each_with_index{|v,i|
      best=i if(v+i/100.0/w)<p[best]};best+1}]}+
  (1..7).map{|w|[proc{|g|p=1; if (g[1]) then h=g[1..-1];x=(1..h.size).to_a
      p=0;regression(x,h.map{|r|winner r},w).each_with_index{|v,i|
      p+=v*(g.size**i)};end;p.to_i},
    proc{|g|b=g[0].size/4;if g[1] then pred=[];h=g[1..-1]
      x=(1..h.size).to_a;h[0].size.times{|i|p=0
      regression(x,h.map{|r|r[i]},w).each_with_index{|v,i|p+=v*((x[-1]+1)**i)}
      pred<<[[p.to_i,1].max,100].min}
      (1..100).each{|i|if !pred.include?(i) then b=i;break;end};end;b}]}+
  (-1..1).map{|w|[proc{|g|r=g[0].size; if g.size>1 then
      f=g[1..-1].flatten;r=(f.inject{|s,v|s+v}/f.size.to_f+w).to_i;end;r},
    proc{|g|r=g[0].size/2; if g.size>1 then
      r=(g[1..-1].inject(0){|s,v|s+winner(v)}/(g.size.to_f-1)+w).to_i;end;r},
    proc{|g|(winner(g[-1])||9)+w}  ]}+
  [proc{|g|b=0;(p=prob g).each_with_index{|v,i|b=i if v<p[b]};b+1}]).flatten

games = ARGV[0].split("\n").map{|l|l.split.map{|v|v.to_i}}
winpct=[0]*brains.size
(games.size-1).times{|round|
  entries=games[round+1].dup
  brains.each_with_index{|b,i|
    entries[0]=pick=[b[games[0..round]],1].max
    winpct[i]+= 1.0/games.size if winner(entries)==pick 
  }
}
best=0;
winpct.each_index{|i|best = i if (winpct[i]>winpct[best])}
puts brains[best][games]

Je ne suis pas sûr d'avoir le bon format d'entrée - je ne sais pas comment générer des arguments de ligne de commande sur plusieurs lignes pour le tester sur Windows. (Cette méthode semble fonctionner sur IDEone.)

AShelly
la source
Je ne peux pas le tester pour le moment, je suis au travail et je ne rentrerai qu'après 9h30 (GMT). Cette question SO aide-t-elle avec les arguments multi-lignes?
Gareth
Je viens de tester cela et cela me donne une erreur - strategist.rb:48:in 'each': No such file or directory - 42 2 6 10 8 6 5 7 6 1 5 8 3 6 3 4 26 2 10 1 26 8 42 5 3 7 (Errno::ENOENT). J'arrêterai d'envisager de nouvelles entrées après 23 heures, mais je retarderai légèrement le score pour vous donner le temps d'examiner le bogue si vous le souhaitez.
Gareth
D'accord, je pense que le problème était que vous aviez ARGFau lieu d'ARGV. Après avoir fait ce changement, le programme devine à 1chaque fois. Avez-vous des idées sur ce que je peux faire pour y remédier?
Gareth
Pouvez-vous ajouter cette ligne en haut et me dire ce qu'elle imprime lorsque vous lui donnez l'entrée du 2e tour (2 lignes de données): p ARGV.map{|l|l};exit (Aucune des réponses SO à la question que vous référencez ou des réponses similaires ne semble me donner l'entrée attendue)
AShelly
Il s'imprime ["1 2\n3 4\n5 6\n1 2"]pour l'entrée de test dans la question.
Gareth
2

Perl

J'ai pensé que je pourrais aussi bien entrer dans l'inévitable. Entrées plus sérieuses à venir bientôt. En prime, cette participation ne perdra jamais en compétition individuelle.

print 1
PhiNotPi
la source
pas gagner toutes les compétitions. en tête-à-tête avec un autre confiant, il sera à égalité
Blazer
Non! Je ne peux pas croire que j'ai oublié cette affaire! Je vais arranger ça.
PhiNotPi
L'une de mes conclusions lorsque j'ai commencé à concevoir mon entrée est que chaque bot doit soumettre 1 au moins 1 / n du temps, pour faire sa juste part en empêchant les confiants de s'en aller.
Peter Taylor
@Peter: Ne t'inquiète pas, je m'en suis occupé . :)
Ilmari Karonen
2

JavaScript (node.js)

Compte ce qui a été le plus populaire au dernier tour et en offre un de moins que cela, enchaînant à 20 et enchérissant 3 au premier tour.

var lastRound = /[^\n]+$/.exec(process.argv[2]);
var numbers = {};
var re = /\d+/g;
var match;

while(match = re.exec(lastRound)) {
    numbers[match] = numbers[match] >>> 0 + 1;
}

var maxKey = -1;

for(var i in numbers) {
    if(maxKey === -1 || numbers[i] > numbers[maxKey]) {
        maxKey = i;
    }
}

if(maxKey == 0) {
    // First round. Bid 3.
    console.log(3);
} else if(maxKey == 1) {
    // Bid 20.
    console.log(20);
} else {
    // Bid one less.
    console.log(maxKey - 1);
}

Comment invoquer:

node script.js 'the argument'
Ry-
la source
En regardant les résultats du test le plus récent, cela ne se comporte pas comme documenté. Une idée pourquoi pas?
Peter Taylor
1
@PeterTaylor Je me demande si c'est la première forboucle? Doit if(i in numbers)être if(matches[i] in numbers)pensez-vous?
Gareth
@minitech Après un petit coup d'œil, il semble que l'expression régulière ne correspond qu'au seul numéro de l'entrée - je ne sais pas assez sur javascript ou Nodejs pour pouvoir dire pourquoi cependant. De plus, avez-vous besoin de diviser l'entrée sur les retours à la ligne pour obtenir le dernier tour?
Gareth
@Gareth: Effectivement. Mis à jour, mais s'il fonctionnait mieux à l'origine, cela ne me dérange pas :)
Ry-
Malheureusement, il lance une erreur pour chaque tour, sauf le premier maintenant:node.js:201 throw e; // process.nextTick error, or 'error' event on first tick TypeError: Cannot read property 'length' of null at Object.<anonymous> (minitech1.js:6:23)
Gareth
2

Python (CopyCat)

Encore un autre, cette fois, il copie la réponse exacte du dernier gagnant, s'il y en avait une. Il est conçu à la fois pour essayer de gagner et de bloquer d'autres soumissionnaires. offre 5si premier tour, offre un nombre aléatoire du tour précédent s'il n'y avait pas de vainqueur

content = sys.argv[1].split('\n')
x = map(int, content[-1].split())
y = []
for each in x:
    if x.count(each) == 1:
        y.append(each)
print min(y) if sum(y) > 0 else random.choice(x) if sum(x) > 0 else 5
veste
la source
2

Python (Joe)

Ce n'est en aucun cas conçu pour gagner, mais je le lance quand même pour ajouter de la couleur à la foule :) Il offre la moyenne du dernier tour (Average Joe). Invoqué la même chose que ma réponse d'origine (que je vais maintenant nommer car il semble que c'est ce que font tous les enfants sympas, et cela aide à distinguer les deux). si elle commence, elle enchère 10.

content = sys.argv[1].split('\n')  
x = map(int, content[-1].split())
print sum(x)/len(x) if sum(x) != 0 else 10

modifier: modification de la méthode de saisie pour l'adapter à la méthode de saisie de la question

veste
la source
2

Python (TotalBots)

Je pense que celui-ci sera mon dernier, mais nous verrons. Cela prend l'avantage de savoir combien il y a de robots en affichant simplement le nombre de robots concurrents, donc s'il y a 17 robots (nombre actuel de robots, plus celui-ci), il affichera17

content = sys.argv[1].split('\n')
print len(content[-1].split())
veste
la source
2

Perl (inspecteur de la santé)

print ((((((2)**(2))*((2)**(2)))/((((2)**(2))*(2))*(2)))+((((2)**(2))*(2))/((2)+((2)*(((((2)**(2))+((2)*(2)))+(((2)*(2))/((2)**(2))))**(((2)/(2))/(2)))))))+((((2)-(2))/((((2)**(2))+(2))*((2)+(2))))*(rand(2))))

Je parie que vous pouvez deviner ce que ça fait.

PhiNotPi
la source
2

C ++ (Guess instruit)

Je pensais déjà que j'aurais manqué le délai, mais grâce à l'extension je peux encore ajouter mon entrée. Ce programme se compile avec g ++. Le programme essaie de deviner les statistiques des autres entrées et de choisir la plus petite qui ne sera probablement pas choisie par une autre.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <deque>
#include <cstdlib>
#include <ctime>
#include <exception>
#include <stdexcept>

typedef std::vector<int> botvec;
typedef std::vector<botvec> scorevec;

// read all the scores from the given string
// note that this only does minimal error checking
// the result is a vector of vector, each entry of which
// represents one round. That is, the vectors in the vector
// correspond to the lines of the command line argument.
scorevec read_past_scores(char const* scoretext)
{
  scorevec past_scores;

  std::istringstream is(scoretext);
  std::string line;

  scorevec::size_type size = 0;

  while (std::getline(is, line))
  {
    past_scores.push_back(botvec());

    std::istringstream ils(line);
    int i;
    while (ils >> i)
      past_scores.back().push_back(i);
    if (size == 0)
      size = past_scores.back().size();
    else if (past_scores.back().size() != size)
      throw std::runtime_error("invalid score format");
  }
  return past_scores;
}

struct counts { int count[100]; };
struct prob { double p[100]; };

int generate_answer(scorevec& past_scores)
{
  int const number_of_players = past_scores.front().size();
  if (past_scores.front().front() == 0) // initial round
    past_scores.pop_back();

  // Pre-fill the counts to get reasonable probabilities also for
  // insufficient statistics (and the statistics *will* be
  // insufficient!). Bias in favour of small numbers.
  counts initial;
  for (int i = 0; i < 100; ++i)
    initial.count[i] =
      i < number_of_players? 100*(number_of_players-i) : 1;

  std::deque<counts> playercounts(number_of_players, initial);

  // add the actual guesses (with a high factor, to give them high
  // weight against the initial counts)
  for (int i = 0; i < past_scores.size(); ++i)
    for (int j = 0; j < number_of_players; ++j)
      playercounts[j].count[past_scores[i][j]-1]+=5000;

  // drop the own guesses
  playercounts.pop_front();

  // calculate the probabilities corresponding to the counts
  std::vector<prob> playerprobabilities(playercounts.size());
  for (int i = 0; i < playercounts.size(); ++i)
  {
    double sum = 0;
    for (int k = 0; k < 100; ++k)
      sum += playercounts[i].count[k];
    for (int k = 0; k < 100; ++k)
      playerprobabilities[i].p[k] = playercounts[i].count[k]/sum;
  }

  // for each selection, estimate the expected number of other players
  // who will bet on it. Return the first one with an expectation
  // below 1.5.
  for (int i = 0; i < 100; ++i)
  {
    double estimate = 0;
    for (int j = 0; j < number_of_players; ++j)
      estimate += playerprobabilities[j].p[i];
    if (estimate < 1.5)
      return i+1;
  }

  // in the unlikely case that such a choice doesn't exist (meaning
  // there are far more than 100 players), just return 100.
  return 100;
}

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    std::cerr << "Missing score argument!\n";
    return EXIT_FAILURE;
  }

  try
  {
    scorevec past_scores = read_past_scores(argv[1]);

    std::srand(std::time(0));

    std::cout << generate_answer(past_scores) << std::endl;

    return EXIT_SUCCESS;
  }
  catch(std::exception& e)
  {
    std::cerr << e.what() << "\n";
    return EXIT_FAILURE;
  }
  catch(...)
  {
    std::cerr << "Unknown error\n";
    return EXIT_FAILURE;
  }
}
celtschk
la source
2

Perl (Bob)

$_=<>;
INPUT:{

tr/ /,/;
@in = eval;
for(1..$#in){
 $bids[$rnum][$in[$_]]++
}
for(0..$#in){
 $tbids[$rnum][$in[$_]]++
}
$rnum++;
$_=<>;
if($_ ne"\n"){redo INPUT}
}

for(0..100){$pre[$_]=0}

blazer: {
for($r=1;$r<$rnum;$r++){
winner: for($pnt=1;$pnt<101;$pnt++){
        if($tbids[$r][$pnt] == 1){
            if($pnt > 2){
                $winnum[$pnt]++;
            $wins++;
            }
        last winner
        }
}
    }
    if($wins==0){
    $pre[3]++;last blazer
    }
}

CC1: for($pnt=1;$pnt<101;$pnt++){
    if($tbids[$rnum-1][$pnt] == 1){
        $pre[$pnt]++;last CC1
    }
}

CC2: for($pnt=1;$pnt<101;$pnt++){
    if($rnum-2<0){$pre[7]++;last CC2}
    if($tbids[$rnum-2][$pnt] == 1){
        $pre[$pnt]++;last CC2
    }
    if($pnt==100){
    $pre[7]++;last CC2
    }
}

one: {
$pre[1]+=2;
}

two: {
$pre[2]+=2;
}

five: {
$pre[5]+=2;
}

eight: {
$pre[8]+=2;
}

fortytwo: {
$pre[42]++;
}

mueller: {
    $a=($#in+2)/4;
    $pre[int$a]++;
}

schwarzenbeck: {
    $a=($#in+2)/4+1;
    $pre[int$a]++;
}

beckenbauer: {
    $a=($#in+2)/4+2;
    $pre[int$a]++;
}

totalbots: {
    $pre[$#in+1]++;
}

joe: {
$sum=0;
    for(1..100){
    $sum+=$_*$tbids[$rnum-1][$_];
}
    $average=$sum/($#in+1);
    if($average==0){$average=10};
    $pre[$average]++;
}

node: {
$max=0;$maxloc=0;
for(1..100){
    if($tbids[$rnum-1][$_]>$max){$max=$tbids[$rnum-1][$_];$maxloc=$_}
}
$maxloc--;
#if($maxloc==0){
$maxloc=20;
#}
if($rnum==1){$maxloc=3}
    $pre[$maxloc]++;
}
choice: for(1..100){
    if($pre[$_]==1){ 
$count++;
    if($count==3){print; last choice}
}
    if($_==100){print"98"}
}

Voir "Bob" pour savoir comment l'invoquer.

PhiNotPi
la source
C'est un guide très récursif de l'invocation ;-)
Gareth
Il y a en fait une chaîne de logique mise en place: Alice décrit comment elle prend les entrées. Eve mentionne qu'elle prend la même entrée que Alice. Eve mentionne également qu'elle prend la même entrée que Bob. Ainsi, Bob prend le même format d'entrée qu'Alice, qui est décrit.
PhiNotPi
2

Perl (Alice)

$_=<>;
INPUT:{

tr/ /,/;
@in = eval;
for(1..$#in){
 $bids[$rnum][$in[$_]]++
}
for(0..$#in){
 $tbids[$rnum][$in[$_]]++
}
$rnum++;
$_=<>;
if($_ ne"\n"){redo INPUT}
}

for(0..100){$pre[$_]=0}

blazer: {
for($r=1;$r<$rnum;$r++){
winner: for($pnt=1;$pnt<101;$pnt++){
        if($tbids[$r][$pnt] == 1){
            if($pnt > 2){
                $winnum[$pnt]++;
            $wins++;
            }
        last winner
        }
}
    }
    if($wins==0){
    $pre[3]++;last blazer
    }
}

CC1: for($pnt=1;$pnt<101;$pnt++){
    if($tbids[$rnum-1][$pnt] == 1){
        $pre[$pnt]++;last CC1
    }
}

CC2: for($pnt=1;$pnt<101;$pnt++){
    if($rnum-2<0){$pre[7]++;last CC2}
    if($tbids[$rnum-2][$pnt] == 1){
        $pre[$pnt]++;last CC2
    }
    if($pnt==100){
    $pre[7]++;last CC2
    }
}

one: {
$pre[1]+=2;
}

two: {
$pre[2]+=2;
}

five: {
$pre[5]+=2;
}

eight: {
$pre[8]+=2;
}

fortytwo: {
$pre[42]++;
}

mueller: {
    $a=($#in+2)/4;
    $pre[int$a]++;
}

schwarzenbeck: {
    $a=($#in+2)/4+1;
    $pre[int$a]++;
}

beckenbauer: {
    $a=($#in+2)/4+2;
    $pre[int$a]++;
}

totalbots: {
    $pre[$#in+1]++;
}

joe: {
$sum=0;
    for(1..100){
    $sum+=$_*$tbids[$rnum-1][$_];
}
    $average=$sum/($#in+1);
    if($average==0){$average=10};
    $pre[$average]++;
}

node: {
$max=0;$maxloc=0;
for(1..100){
    if($tbids[$rnum-1][$_]>$max){$max=$tbids[$rnum-1][$_];$maxloc=$_}
}
$maxloc--;
#if($maxloc==0){
$maxloc=20;
#}
if($rnum==1){$maxloc=3}
    $pre[$maxloc]++;
}
choice: for(1..100){
    if($pre[$_]==1){ 
$count++;
    if($count==2){print; last choice}
}
    if($_==100){print"99"}
}

Prend des entrées similaires à mes autres robots.

perl Alice.plx
1 4 3 12
3 2 4 11
[blank line]
PhiNotPi
la source
2

Perl (Eve)

J'ai refait complètement cette entrée pour ouvrir la voie à mes autres robots.

$_=<>;
INPUT:{

tr/ /,/;
@in = eval;
for(1..$#in){
 $bids[$rnum][$in[$_]]++
}
for(0..$#in){
 $tbids[$rnum][$in[$_]]++
}
$rnum++;
$_=<>;
if($_ ne"\n"){redo INPUT}
}

for(0..100){$pre[$_]=0}

blazer: {
for($r=1;$r<$rnum;$r++){
winner: for($pnt=1;$pnt<101;$pnt++){
        if($tbids[$r][$pnt] == 1){
            if($pnt > 2){
                $winnum[$pnt]++;
            $wins++;
            }
        last winner
        }
}
    }
    if($wins==0){
    $pre[3]++;last blazer
    }
}

CC1: for($pnt=1;$pnt<101;$pnt++){
    if($tbids[$rnum-1][$pnt] == 1){
        $pre[$pnt]++;last CC1
    }
}

CC2: for($pnt=1;$pnt<101;$pnt++){
    if($rnum-2<0){$pre[7]++;last CC2}
    if($tbids[$rnum-2][$pnt] == 1){
        $pre[$pnt]++;last CC2
    }
    if($pnt==100){
    $pre[7]++;last CC2
    }
}

one: {
$pre[1]+=2;
}

two: {
$pre[2]+=2;
}

five: {
$pre[5]+=2;
}

eight: {
$pre[8]+=2;
}

fortytwo: {
$pre[42]++;
}

mueller: {
    $a=($#in+2)/4;
    $pre[int$a]++;
}

schwarzenbeck: {
    $a=($#in+2)/4+1;
    $pre[int$a]++;
}

beckenbauer: {
    $a=($#in+2)/4+2;
    $pre[int$a]++;
}

totalbots: {
    $pre[$#in+1]++;
}

joe: {
$sum=0;
    for(1..100){
    $sum+=$_*$tbids[$rnum-1][$_];
}
    $average=$sum/($#in+1);
    if($average==0){$average=10};
    $pre[$average]++;
}

node: {
$max=0;$maxloc=0;
for(1..100){
    if($tbids[$rnum-1][$_]>$max){$max=$tbids[$rnum-1][$_];$maxloc=$_}
}
$maxloc--;
#if($maxloc==0){
$maxloc=20;
#}
if($rnum==1){$maxloc=3}
    $pre[$maxloc]++;
}
choice: for(1..100){
    if($pre[$_]==1){ 
$count++;
    if($count==1){print; last choice}
}
    if($_==100){print"100"}
}

Prend un format d'entrée: le même que "Bob" et "Alice".

PhiNotPi
la source
1

Brainfuck

Pour citer le défi:

"Vous pouvez entrer autant de bots que vous le souhaitez, donc si quelqu'un entre dans un bot qui ne fait que deviner 1, vous pouvez en entrer un autre qui fait de même pour le rendre inutile."

Eh bien, puisque PhiNotPi en a entré un , laissez-moi en entrer un autre. Juste pour être différent, je le ferai dans Brainfuck:

+++[->++++<]>[-<++++>]<+.

Bien sûr, maintenant que le pari 1 n'est plus une stratégie réalisable, la chose évidente à faire maintenant est de parier 2 à la place ...

Modifier: diviser la réponse en deux par commentaires, réécrire les deux programmes dans des langues plus intéressantes.

Ilmari Karonen
la source
Tout d'abord, une entrée par réponse s'il vous plaît. Deuxièmement, je sais que quelqu'un pourrait poster 100 réponses chacune imprimant l'un des chiffres de 1 à 100 afin de garantir de ne pas perdre - de la même manière, quelqu'un d'autre pourrait faire exactement la même chose que personne ne gagnera. Dans un match de football (soccer), les 11 joueurs pourraient se tenir sur la ligne de but pour garantir que l'autre équipe ne marque pas. Cela ne se produit jamais normalement de cette façon parce que ce serait vraiment un jeu s'ils le faisaient?
Gareth
Troisièmement, cette objection aurait vraiment dû être soulevée dans le bac à sable - après tout, c'est son but.
Gareth
@Gareth: OK, j'ai divisé la réponse en deux. Quant au caractère raisonnable des entrées, vous avez vous-même suggéré que, si quelqu'un soumettait "unsconfident", quelqu'un d'autre pourrait faire de même pour le contrer. À ce stade, bien sûr, soumettre "twosconfident" est tout aussi logique que de soumettre "onesconfident" en premier lieu, alors ...
Ilmari Karonen
1
La chose intéressante à ce sujet est que maintenant je ne peux pas supprimer mon entrée confidentielle sans permettre à cette entrée de gagner.
PhiNotPi
1
@Peter: Pourquoi le pensez-vous? Étant donné que la mienne et les programmes de PhiNotPi sont dans la course, il n'y a aucune raison pour que quelqu'un d' autre de présenter un programme qui jamais paris 1 (s'ils veulent ce programme pour gagner, qui est).
Ilmari Karonen
1

Mueller (Scala)

object Mueller extends App {
  println ((args(0).split('\n')(0).split(' ').length+1)/4)
}

Si vous connaissez Schwarzenbeck et Beckenbauer, vous vous attendiez sûrement à Mueller. Il est la. Il bénéficiera beaucoup de Beckenbauer et Schwarzenbeck et devrait gagner.

Détails sur l'exécution et la compilation: voir Schwarzenbeck

Plus près de l'objectif, maintenant.

Utilisateur inconnu
la source
1

Beckenbauer (Scala)

object Beckenbauer extends App {
  println ((args(0).split('\n')(0).split(' ').length+1)/4+2)
}

Avec l'aide de Schwarzenbeck, Beckenbauer est censé marquer des buts. Sans Schwarzenbeck, il n'est rien.

Détails sur l'exécution et la compilation: voir [Schwarzenbeck] [1]

Edit: jouer plus profondément dans la salle maintenant aussi.

Utilisateur inconnu
la source
1

Script par lots

echo 5

Ma soumission, donne 5 comme réponse à chaque fois ;-)

mellamokb
la source
1

Eight.bat

echo 8

Une autre réponse simple, donne 8 à chaque fois.

mellamokb
la source
1

FivesCancel (PHP)

Annule la solution "toujours 5" de mellamokb.

5
Ry-
la source
1

EightsCancel (PHP)

Annule la solution "toujours 8" de mellamokb. Désolé, mellamokb!

8
Ry-
la source
C'est reparti, compétition: P
mellamokb
1

Python 2.7 - Copycat2

Copie le vainqueur de l' avant- dernier tour. Oh non! sinon sorties 7.

import sys
content = sys.argv[1].split('\n')
x = map(int, content[-2].split()) if len(content) > 1 else [7]
y = []
for each in x:
    if x.count(each) == 1:
        y.append(each)
print min(y) if sum(y) > 0 else random.choice(x) if sum(x) > 0 else 7
veste
la source
1

Script shell (Deep Thought)

OK, pour avoir une seconde chance, voici une autre entrée, cette fois un script shell (devrait fonctionner avec n'importe quel shell). Cela donne toujours la réponse à la question de la vie, de l'univers et de tout.

echo 42

En fait, cet algorithme n'est pas entièrement correct car j'ai omis le retard de 7,5 millions d'années. :-)

celtschk
la source
Trop tard pour le test de ce soir, désolé, mais j'en ferai une autre le matin.
Gareth
1

dirichlet.c

#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>

main(int argc, char* argv[])
{
    int handle;
    char *str;
    int32_t bits, val, n = 0;

    if (argc) {
        for (str = argv[1]; *str; str++)
            if (*str == 32) n++;
            else if (*str == 10) break;
    }

    n /= 2;
    if (n > 99) n = 99;

    handle = open("/dev/urandom", O_RDONLY);
    do {
        read(handle, &bits, sizeof bits);
        bits &= 0x7fffffff;
        val = bits % n;
    } while (bits - val + (n-1) < 0);
    close(handle);

    printf("%d", 2 + val);
}

Je pense que cela passe par des bits aléatoires trop rapides à utiliser /dev/random , mais je préférerais beaucoup. Si quelqu'un veut le tester sur Windows, vous devrez le porter vous-même, car je n'ai pas accès à une boîte Windows avec un compilateur C.

Raisonnement

Je ne voulais pas expliquer la logique derrière cela avant la fin du tournoi, mais maintenant que le vainqueur a été annoncé, je pense qu'il est temps.

Par le principe du pigeon-hole (alias le principe de Dirichlet, d'où le nom du bot), s'il y a N bots concurrents alors il y a un nombre w dans [1..1 + N / 2] qui a gagné ou aurait gagné si choisi. Je conclus donc que la stratégie optimale ne sélectionnera pas des nombres supérieurs à 1+ N / 2. Mais si N est pair, sélectionner 1+ N / 2 crée un emplacement gagnant plus petit. Par conséquent, les emplacements qui méritent d'être sélectionnés sont [1 .. ( N +1) / 2].

Cela laisse la question de savoir comment sélectionner un emplacement. Pour un petit nombre de bots, j'ai vérifié qu'il y a un équilibre de Nash lorsque chaque bot sélectionne uniformément parmi les candidats, et je soupçonne fortement que cela continuera à être vrai.

L'écart mineur entre la stratégie de ce bot et la stratégie théorique est simplement le méta-jeu.

Peter Taylor
la source