Asta di offerte unica più bassa


22

Grazie per tutte le voci, la scadenza è ormai passata e i punteggi finali sono alla fine della domanda.
Congratulazioni a PhiNotPi per una vittoria abbastanza completa.

Questa è una sfida da , il cui scopo è quello di creare un programma che vince più spesso di qualsiasi altro avversario in un'asta di offerte unica più bassa.

Ingresso

Come input il programma riceverà l'offerta di tutti i round precedenti, un round per riga, tutte le offerte separate da spazi come segue:

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

Ogni colonna dell'input rappresenta l'offerta di un bot. La prima colonna è le offerte del programma ricevente, mentre il resto è in un ordine generato casualmente. Grazie a Hammar e Peter Taylor per il loro contributo.

L'input viene fornito come unico e unico argomento della riga di comando (multi-riga) per il programma:

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

Ciò significa che il tuo programma dovrà essere eseguibile dalla riga di comando. Fornisci un esempio di invocazione come parte della tua risposta.

Nel primo round solo per farti sapere a quanti robot stai affrontando, l'input sarà una linea di 0s - uno per ogni bot.

Produzione

Il tuo programma dovrebbe generare la sua offerta come numero intero nell'intervallo da 1 a 100 (incluso).

Scorer Program

Questo è il mio programma di punteggio: qualsiasi suggerimento per aggiunte, miglioramenti o correzioni di errori sarebbe il benvenuto.

#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;
}

Metti alla prova i giocatori

Uno è fiducioso Offerte sempre 1.

#include <stdio.h>

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

Casuale100 Offerte casuali su tutto l'intervallo

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

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

Casuale20 Offerte casuali tra 1 e 20

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

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

Casuale5 Offerte casuali tra 1 e 5

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

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

Esempio di run-through:

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

Questi giocatori sono solo a scopo di test. NON saranno inclusi nella competizione. Puoi inserire tutti i robot che desideri, quindi se qualcuno inserisce un bot che indovina solo 1, puoi inserirne un altro che fa lo stesso per renderlo inutile.

Vincitore

Il bot vincente in ogni round è quello che offre l' offerta unica più bassa . Quindi, dato un giro in cui sono fatte le seguenti offerte: 1 1 3 5 2 3 6 3 2 8 7il vincitore sarebbe il bot che l'offerta 5perché le 1s, 2s e 3s non sono univoci.

Il vincitore del concorso sarà il programma che vince il maggior numero di volte dopo 100 round. In caso di pareggio, il totale delle offerte vincenti verrà utilizzato come pareggio e, nel caso in cui anche questo sia un pareggio, l'offerta vincente più bassa verrà utilizzata come ulteriore pareggio. Questi fattori di punteggio sono tutti prodotti dal programma di punteggio.

Eseguirò il programma di punteggio su tutti i programmi di lavoro che sono stati inseriti tra 2 settimane da oggi ( 18 febbraio ora esteso alle 23:00 (GMT) il 20 febbraio ). Valuterò tutte le voci di lavoro e accetterò il vincitore della mia sessione di punteggio.

Pista 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

1
Hmm ... con le regole scritte così come sono, potrei davvero rovinare il gioco inserendo 100 programmi che offrono sempre ciascuno un determinato numero.
Ilmari Karonen,

1
Puoi dire due frasi, come viene scelto il bot vincente? Non capisco
utente sconosciuto

@IlmariKaronen È vero, potresti. Ma confido che la gente non lo farà. Potrei limitare il numero di voci per persona, suppongo, ma penso che farò ricorso a questo solo se ci saranno spoiler.
Gareth,

@userunknown Ho cercato di chiarire come funzionano i round delle aste.
Gareth,

1
@PhiNotPi: non sentirti in colpa. Hai vinto secondo le regole.
Steven Rumbalski,

Risposte:


9

Perl

Questa volta ho provato un po 'di più. È una strategia complessa davvero semplice , ma ho impostato il framework per l'espansione.

Modifica: completa ripetizione. Questa cosa è dentro per la vittoria.

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

Questo programma accetta input una riga alla volta, seguito da due nuove righe:

perl PhiNotPi2.plx
1 2 3 3 2
2 1 3 1 3
2 1 1 1 3
[empty line]

Ok, questo porta il metagaming agli estremi.
Peter Taylor,

@petertaylor Sto andando troppo lontano dalla linea? Devo tornare al mio originale?
PhiNotPi

2
Questo è un sito noto per gli avvocati delle regole - è perfettamente giusto. Ma sto arrivando alla conclusione che il meccanismo di scambio di stack potrebbe non essere il migliore per le competizioni di King of the Hill.
Peter Taylor,

Sono anche giunto a questa conclusione. Dobbiamo creare un metodo per nascondere i robot alla vista nelle competizioni future. Per quanto ne so, qualcuno sta metagaming contro i miei robot in questo momento.
PhiNotPi

Lol, questa è stata la mia idea: P. Dato che hai già implementato, e mi sento pigro, te lo permetterò :) Nota che l'unico tipo di voce che questo non può facilmente battere sono quelli che implementano la casualità
mellamokb

8

capocuoco

Dato che scommettere sempre 1 ora è una strategia perdente , la cosa ovvia da fare è invece puntare sempre 2 . Quindi lasciami fare questo. Per rendere questa voce altrimenti noiosa un po 'più interessante, ho deciso di scriverla in 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.

Come bonus, il programma in realtà funziona più o meno come una ricetta reale, anche se banale, anche se fa un po 'di lettura come se lo scrittore fosse un po', um, cotto. La grammatica dello Chef sembra rendere abbastanza difficile scrivere qualsiasi cosa implichi qualcosa di più complicato che mescolare cose in una ciotola e cuocerle e farlo funzionare ancora sia come programma che come ricetta, specialmente se uno qualsiasi dei verbi che si desidera usare sono anche leggermente irregolari (come "friggere" → "fritto").

Modifica: cambiata la ricetta dalle uova fritte a quelle shirred - grazie a Blazer per il suggerimento! Il tempo e la temperatura di cottura devono essere considerati solo consultivi; Non ho ancora provato la ricetta da solo, quindi non posso garantire la loro precisione.


Penso che questo produca 1: vedi il mio commento su codegolf.stackexchange.com/a/4851 .
msh210,

Emette 2, almeno usando l' interprete Acme :: Chef . Il ciclo finale è lì solo per l'offuscamento e in modo che i commensali non debbano mangiare le uova crude.
Ilmari Karonen,

Ah, giusto, mi sono perso il fatto che le uova erano già nella teglia e che non è quello che è diminuito.
msh210,

2
Lo chiami shirred eggs, che in realtà viene fatto in una teglia e che renderebbe la ricetta una ricetta di cottura valida e grammaticalmente corretta. shirr the eggs. shirr the eggs until shirred.orribile per avere l'educazione culinaria alle mie spalle! :)
Blazer

1
il tempo / la temperatura di cottura sembrano giusti :). ovviamente, usa sempre quelli solo come linee guida, poiché è lo chef che determina se qualcosa viene fatto o no, non il tempo / la temperatura stessa!
Blazer

4

Python (2.6)

Estremamente semplice, ma sono ancora curioso di sapere come si comporterà rispetto agli altri approcci.

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)

Inserisci le offerte tramite stdin, ad es python testbid.py < bids.txt.

EDIT : modificato per il "primo round all zeros"

EDIT : ha cambiato un po 'i "numeri magici" (una seconda volta)


1
non dovrebbe m = random.choice(1,2,2,3,3,3)essere m = random.choice([1,2,2,3,3,3])?
Blazer,

Ha generato un errore in cui Blazer ha detto che potrebbe. Ho inserito le parentesi quadre per l'esecuzione del test e sembra aver funzionato.
Gareth,

@Blazer: sì, assolutamente (piccolo errore di battitura da parte mia). Grazie per aver avvisato.
ChristopheD,

4

Python (Blazer)

Questo bot analizza i round precedenti e registra i numeri che vincono. I numeri vincenti che appaiono più spesso avranno quindi maggiori possibilità di essere scelti. Sceglierà casualmente i numeri tra quelli vincenti (diversi da 1 o 2). sceglierà 2 3 invece se è il primo round.

L'input viene letto una riga alla volta. inserisci semplicemente una riga vuota per interrompere l'accettazione dell'input

Un trucco è semplicemente incollare (accetta automaticamente ogni riga con \ n all'interno dell'incolla) e premere invio due volte

Ora puoi semplicemente eseguire il runt dello script con un nome file nella riga di comando:

python bidding.py bidding.txt

il file dovrebbe apparire così:

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)

modifica: aggiunto or sum(rounds) == 0per compensare la recente modifica del primo turno di tutti zeri

modifica: i problemi nei commenti risolti, hanno anche reso in grado di ricevere input da un nome file e non scelgono più '2' poiché la concorrenza ha eliminato anche questo. funziona con tutti gli 0 come input iniziale o nessun dato nel file

edit2: dimenticato un min ()

edit3: input modificato per soddisfare le esigenze di input della domanda


Provoca un piccolo problema con il segnapunti - Devo premere Invio per ottenere il punteggio per ogni round. Non è un grosso problema per i miei 10 round test, ma potrebbe essere un dolore per il 100 round.
Gareth,

@Gareth, avvolgilo in uno script bash. echo "$@" | python bidding.pydovrebbe fare il lavoro.
Peter Taylor,

Ho provato questo come ha suggerito Peter, ma sto ricevendo un errore TypeError: unsupported operand type(s) for +: 'int' and 'list'per la linea 23. Sto usando Python 2.6.1, è questo il problema? ho bisogno di una versione più recente? Ottengo lo stesso problema senza usare lo script bash.
Gareth,

@Gareth sarebbe d'aiuto se lo avessi fatto così l'input viene reindirizzato da sys.argv [1] con un nome file?
Blazer

@Blazer Non sono sicuro che sia questo il problema. Sto chiamando io stesso il programma dalla riga di comando usando la tua chiamata di esempio e ricevendo l'errore che ho dato sopra. C'è qualcosa là dentro che è incompatibile con Python 2.6.1?
Gareth,

3

Schwarzenbeck (Scala)

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

Schwarzenbeck non dovrebbe segnare gli obiettivi. È la pulizia di Beckenbauer, che seguirà presto. :)

Per usarlo, è necessario un compilatore e compilarlo

scalac Schwarzenbeck.scala 

Quindi puoi eseguirlo:

scala Schwarzenbeck 'your ar-
gu-
ment' 

Modifica: ulteriori regolazioni.


1
Dato che Schwarzenbeck non avrebbe dovuto segnare gli obiettivi, direi che fallì completamente :-)
Celtschk,

Sì, ho avuto un dilemma: ho fatto una linea di 3 giocatori e mi aspettavo che Müller segnasse il maggior numero di punti, ma da una posizione strategica, Schwarzenbeck ha segnato la linea di difesa definitiva. La metafora del calcio fallì, poiché la mia linea di difesa segnò i goal. :)
utente sconosciuto

3

Strategista (Ruby)

Implementa centinaia di strategie semplici: per ogni round, seleziona quella che avrebbe vinto i round più precedenti:

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]

Non sono sicuro di avere il formato di input corretto - non sono sicuro di come generare argomenti della riga di comando su più righe per testarlo su Windows. (Questo metodo sembra funzionare su IDEone.)


Non posso provarlo adesso, sono al lavoro e non sarò a casa fino a dopo le 9.30 (GMT). Questa domanda SO aiuta con gli argomenti multilinea?
Gareth,

Ho appena provato questo e mi sta dando un errore - 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). Smetterò di prendere in considerazione nuove voci dopo le 23:00, ma ritarderò leggermente l'esecuzione del punteggio per darti il ​​tempo di esaminare il bug, se lo desideri.
Gareth,

Okay, penso che il problema fosse che hai avuto ARGFinvece di ARGV. Dopo aver apportato tale modifica, il programma indovina 1ogni volta. Qualche idea su cosa posso fare per risolverlo?
Gareth,

Puoi aggiungere questa riga all'inizio e dirmi cosa stampa quando gli dai l'input del 2 ° round (2 righe di dati): p ARGV.map{|l|l};exit (Nessuna delle risposte SO alla domanda che fai riferimento o simili sembrano darmi l'input previsto)
ASelly

Stampa ["1 2\n3 4\n5 6\n1 2"]per l'input di test nella domanda.
Gareth,

2

Perl

Ho pensato che avrei potuto anche entrare nell'inevitabile. Entrate più serie in arrivo. Come bonus, questa voce non perderà mai in una competizione uno contro uno.

print 1

non vincere ogni competizione. in uno contro uno con un altro fiducioso, legherà
Blazer il

No! Non posso credere di essermi dimenticato di quel caso! Lo aggiusterò.
PhiNotPi

Una delle mie conclusioni quando ho iniziato a progettare la mia voce è che ogni bot dovrebbe presentare 1 almeno 1 / n del tempo, per fare la loro giusta parte nell'impedire a un falso fiducioso di andarsene.
Peter Taylor,

@Peter: non preoccuparti, me ne sono occupato . :)
Ilmari Karonen,

2

JavaScript (node.js)

Conta ciò che era più popolare nell'ultimo round e ne offre uno in meno, arrivando a 20 e offrendo 3 al primo round.

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);
}

Come invocare:

node script.js 'the argument'

Guardando i risultati dell'ultimo test eseguito, questo non si comporta come documentato. Qualche idea sul perché no?
Peter Taylor,

1
@PeterTaylor Mi chiedo se è il primo forciclo? Dovresti if(i in numbers)essere if(matches[i] in numbers)?
Gareth,

@minitech Dopo avergli dato una piccola occhiata, sembra che il regex corrisponda al solo numero dell'input - non so abbastanza su javascript o Nodejs per essere in grado di dire perché. Inoltre, devi dividere l'input su newline per ottenere l'ultimo round?
Gareth,

@Gareth: In effetti lo è. Aggiornato, anche se in origine ha funzionato meglio, non mi dispiace :)
Ry

Purtroppo sta lanciando un errore per ogni round tranne il primo ora: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)

Ancora un altro, questa volta copia la risposta esatta dell'ultimo vincitore, se ce n'era uno. È progettato sia per cercare di vincere che per bloccare altri offerenti. fa offerte 5se al primo turno, offre un numero casuale dal turno precedente se in qualche modo non c'era vincitore

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

2

Python (Joe)

Questo non è affatto progettato per vincere, ma lo sto comunque lanciando per aggiungere un po 'di colore alla folla :) Offre la media dell'ultimo round (Average Joe). Invocato come la mia risposta originale (che ora chiamerò perché sembra che sia quello che stanno facendo tutti i ragazzi fighi, e aiuta a distinguere i due). se inizia il giro, fa offerte 10.

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

modifica: metodo di input modificato per adattarsi al metodo di input della domanda


2

Python (TotalBots)

Penso che questo sarà il mio ultimo, ma vedremo. Sfrutta il vantaggio di sapere quanti robot ci sono semplicemente emettendo il numero di robot concorrenti, quindi se ci sono 17 robot (numero attuale di robot, più questo), produrrà17

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

2

Perl (ispettore sanitario)

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))))

Scommetto che puoi indovinare cosa fa.


2

C ++ (Educated Guess)

Pensavo già che avrei perso la scadenza, ma grazie all'estensione posso ancora aggiungere la mia voce. Questo programma viene compilato con g ++. Il programma tenta di indovinare le statistiche delle altre voci e di scegliere quella più piccola che non è probabile che venga scelta da un'altra.

#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;
  }
}

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

Vedi "Bob" per come invocare.


Questa è una guida molto ricorsiva all'invocazione ;-)
Gareth

In realtà c'è una catena di logica messa in atto: Alice descrive come prende input. Eva menziona che prende input come Alice. Eve menziona anche che accetta input come Bob. Pertanto, Bob ha lo stesso formato di input di Alice, che è descritto.
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"}
}

Accetta input simili ai miei altri robot.

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

2

Perl (Eva)

Ho completamente rifatto questa voce per aiutare a spianare la strada per gli altri miei robot.

$_=<>;
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"}
}

Utilizza un formato di input: lo stesso di "Bob" e "Alice".


1

Brainfuck

Per citare la sfida:

"Puoi inserire tutti i robot che desideri, quindi se qualcuno inserisce un bot che solo indovina 1, puoi inserirne un altro che fa lo stesso per renderlo inutile."

Bene, poiché PhiNotPi ne ha inserito uno , consentitemi di inserirne un altro. Solo per essere diverso, lo farò in Brainfuck:

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

Certo, ora che scommettere 1 non è più una strategia fattibile, la cosa ovvia da fare ora è puntare 2 invece ...

Modifica: dividi la risposta in due per commenti, riscrivi entrambi i programmi in lingue più interessanti.


Innanzitutto, una voce per risposta, per favore. In secondo luogo, so che qualcuno potrebbe pubblicare 100 risposte ciascuna stampando una delle cifre da 1 a 100 per garantire di non perdere - allo stesso modo qualcun altro potrebbe fare esattamente lo stesso significato che nessuno vincerà. In una partita di calcio (calcio) tutti e 11 i giocatori potrebbero stare sulla linea di porta per garantire che l'altra squadra non segnare. Normalmente non succede mai in quel modo perché sarebbe un gioco se lo facessero?
Gareth,

In terzo luogo, questa obiezione avrebbe davvero dovuto essere sollevata nella sandbox , dopo tutto quello che è il suo scopo.
Gareth,

@Gareth: OK, ho diviso la risposta in due. Per quanto riguarda la ragionevolezza delle voci, tu stesso hai suggerito che, se qualcuno dovesse presentare "onesconfident", qualcun altro potrebbe fare lo stesso per contrastarlo. A quel punto, ovviamente, l'invio di "twosconfident" ha lo stesso significato della presentazione di "onesconfident" in primo luogo, quindi ...
Ilmari Karonen,

1
La cosa bella di questo è che ora non posso cancellare la mia voce onconfident senza permettere a questa voce di vincere.
PhiNotPi

1
@Peter: Perché la pensi così? Dato che sia i miei che i programmi di PhiNotPi sono in gara, non c'è motivo per chiunque altro di presentare un programma che scommette sempre 1 (se vogliono che quel programma vinca, cioè).
Ilmari Karonen,

1

Mueller (Scala)

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

Se conosci Schwarzenbeck e Beckenbauer, sicuramente ti aspettavi Mueller. Eccolo. Beneficerà molto di Beckenbauer e Schwarzenbeck e dovrebbe vincere.

Dettagli sulla corsa e la compilazione: vedi Schwarzenbeck

Più vicino all'obiettivo, ora.


1

Beckenbauer (Scala)

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

Con l'aiuto di Schwarzenbeck, Beckenbauer dovrebbe segnare alcuni gol. Senza Schwarzenbeck, non è niente.

Dettagli su esecuzione e compilazione: vedi [Schwarzenbeck] [1]

Modifica: ora gioca anche più in profondità nella stanza.


1

Scripting batch

echo 5

La mia presentazione, dà 5 come risposta ogni volta ;-)


1

Eight.bat

echo 8

Un'altra semplice risposta, dà 8 ogni volta.


1

FivesCancel (PHP)

Annulla la soluzione "sempre 5" di mellamokb.

5

1

EightsCancel (PHP)

Annulla la soluzione "sempre 8" di mellamokb. Scusa, mellamokb!

8

Eccoci di nuovo qui, competizione: P
mellamokb,

1

Python 2.7 - Copycat2

Copia il vincitore del secondo round scorso. Oh no! altrimenti produce 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

1

Shell script (Deep Thought)

OK, così ho una seconda possibilità, ecco un'altra voce, questa volta uno script di shell (dovrebbe funzionare con qualsiasi shell). Questo dà sempre la risposta alla domanda sulla vita, l'universo e tutto.

echo 42

In realtà questo algoritmo non è del tutto corretto perché ho omesso il ritardo di 7,5 milioni di anni. :-)


Scusate troppo tardi per il test di stasera, ma ne farò un altro domani mattina.
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);
}

Penso che questo passi attraverso bit casuali troppo veloci da usare /dev/random, per quanto preferirei. Se qualcuno vuole testarlo su Windows, dovrai portarlo tu stesso, perché non ho accesso a una finestra di Windows con un compilatore C.

Fondamento logico

Non volevo spiegare la logica dietro questo prima della fine del torneo, ma ora che il vincitore è stato annunciato, penso che sia il momento.

Secondo il principio del buco del piccione (alias il principio di Dirichlet, da cui il nome del bot), se ci sono N robot in competizione, allora c'è un numero w in [1..1 + N / 2] che ha vinto o avrebbe vinto se selezionato. Concludo pertanto che la strategia ottimale non selezionerà numeri maggiori di 1+ N / 2. Ma se N è pari, selezionando 1+ N / 2 si crea uno slot vincente più piccolo. Pertanto, gli slot che vale la pena selezionare sono [1 .. ( N +1) / 2].

Questo lascia la domanda su come selezionare uno slot. Per un numero limitato di bot ho verificato che c'è un equilibrio di Nash quando ogni bot seleziona uniformemente tra i candidati e sospetto fortemente che questo continuerà a essere vero.

La minima deviazione nella strategia di questo bot da quella teorica è semplicemente il metagaming.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.