Lelang penawaran unik terendah


22

Terima kasih untuk semua entri, tenggat waktu telah berlalu dan skor akhir ada di akhir pertanyaan.
Selamat untuk PhiNotPi atas kemenangan yang cukup komprehensif.

Ini adalah tantangan, yang tujuannya adalah untuk menciptakan sebuah program yang menang lebih sering daripada lawan-lawannya di lelang tawaran terendah yang unik.

Memasukkan

Sebagai masukan, program akan menerima semua penawaran putaran sebelumnya, satu putaran per baris, semua penawaran dipisahkan dengan spasi sebagai berikut:

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

Setiap kolom input mewakili penawaran satu bot. Kolom pertama adalah tawaran program penerima, sedangkan sisanya dalam urutan yang dibuat secara acak. Terima kasih kepada hammar dan Peter Taylor untuk masukan mereka.

Input disediakan sebagai satu-satunya argumen baris perintah (multi-baris) untuk program Anda:

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

Ini berarti bahwa program Anda harus dapat dijalankan dari baris perintah. Tolong beri contoh doa sebagai bagian dari jawaban Anda.

Di babak pertama hanya sebagai sarana untuk memberi tahu Anda berapa banyak bot yang Anda hadapi, input akan berupa garis 0s - satu untuk setiap bot.

Keluaran

Program Anda harus menampilkan penawarannya sebagai bilangan bulat dalam kisaran 1 hingga 100 (inklusif).

Program Pencetak Gol

Ini adalah program penilaian saya - saran untuk penambahan, perbaikan atau perbaikan bug akan disambut.

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

Pemain uji

Seseorang yang percaya diri Selalu menawar 1.

#include <stdio.h>

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

Random100 Tawaran secara acak di seluruh rentang

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

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

Random20 Tawaran secara acak antara 1 dan 20

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

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

Random5 Tawaran secara acak antara 1 dan 5

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

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

Contoh 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

Para pemain ini hanya untuk tujuan pengujian. Mereka TIDAK akan dimasukkan dalam kompetisi. Anda dapat memasukkan bot sebanyak yang Anda inginkan, jadi jika ada yang memasukkan bot yang hanya menebak 1, Anda bisa memasukkan bot lain yang melakukan hal yang sama untuk menjadikannya tidak berguna.

Pemenang

Bot yang menang di setiap putaran adalah yang memberikan penawaran unik terendah . Jadi diberikan ronde di mana tawaran berikut dibuat: 1 1 3 5 2 3 6 3 2 8 7pemenang akan menjadi bot yang menawar 5karena 1s, 2s dan 3s tidak unik.

Pemenang kompetisi adalah program yang menang paling banyak setelah 100 putaran. Dalam kasus seri, total penawaran yang menang akan digunakan sebagai tie-breaker, dan jika itu juga menjadi tie, tawaran pemenang terendah akan digunakan sebagai tie-breaker lebih lanjut. Semua faktor penilaian ini adalah keluaran dari program penilaian.

Saya akan menjalankan program penilaian pada semua program kerja yang telah dimasukkan 2 minggu dari hari ini ( 18 Februari sekarang diperpanjang hingga 11 malam (GMT) pada 20 Februari ). Saya akan menghapus semua entri yang berfungsi dan menerima pemenang dari proses penilaian saya.

Menjalankan penilaian terakhir

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 ... dengan aturan yang tertulis, saya benar-benar bisa merusak permainan dengan memasukkan 100 program yang masing-masing selalu menawar angka yang diberikan.
Ilmari Karonen

1
Bisakah Anda mengatakan dua kalimat, bagaimana bot yang menang dipilih? Saya tidak mengerti.
pengguna tidak dikenal

@IlmariKaronen Itu benar, Anda bisa. Tetapi saya percaya bahwa orang tidak akan melakukan itu. Saya bisa membatasi jumlah entri per orang saya kira, tapi saya pikir saya hanya akan menggunakan itu jika ada spoiler yang datang.
Gareth

@ penggunaunknown Saya sudah mencoba menjelaskan bagaimana putaran lelang bekerja.
Gareth

1
@PhiNotPi: Jangan merasa bersalah. Anda menang dalam aturan.
Steven Rumbalski

Jawaban:


9

Perl

Saya mencoba sedikit lebih keras kali ini. Ini adalah strategi kompleks yang sangat sederhana , tetapi saya telah menyiapkan kerangka kerja untuk ekspansi.

Sunting: Lengkap ulang. Hal ini ada di dalamnya untuk kemenangan.

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

Program ini mengambil input satu baris sekaligus, diikuti oleh dua baris baru:

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

Oke, ini membutuhkan metagaming hingga ekstrem.
Peter Taylor

@petertaylor Apakah saya terlalu jauh dari garis? Haruskah saya kembali ke sumber asli saya?
PhiNotPi

2
Ini adalah situs yang terkenal karena aturan pengacara - sangat adil. Tapi saya sampai pada kesimpulan bahwa mekanisme pertukaran tumpukan mungkin bukan yang terbaik untuk kompetisi king-of-the-hill.
Peter Taylor

Saya juga sampai pada kesimpulan itu. Kita perlu membuat metode menyembunyikan bot dari pandangan di kompetisi mendatang. Sejauh yang saya tahu, seseorang melakukan metagaming terhadap bot saya sekarang.
PhiNotPi

Lol, ini ideku: P. Karena Anda sudah menerapkan, dan saya merasa malas, saya akan membiarkan Anda memilikinya :) Perhatikan bahwa satu-satunya entri yang tidak dapat dengan mudah dikalahkan adalah entri yang menerapkan keacakan
mellamokb

8

Koki

Karena selalu bertaruh 1 sekarang merupakan strategi yang kalah , hal yang jelas dilakukan adalah selalu bertaruh 2 . Jadi biarkan saya melakukan itu. Untuk membuat entri yang membosankan ini sedikit lebih menarik, saya memutuskan untuk menulisnya di 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.

Sebagai bonus, program ini sebenarnya lebih atau kurang berfungsi sebagai resep nyata - jika sepele - bahkan jika dibaca seperti penulisnya sedikit, um, terpanggang. Tata bahasa Chef tampaknya membuatnya sangat sulit untuk menulis apa pun yang melibatkan sesuatu yang lebih rumit daripada mencampurkan barang ke dalam mangkuk dan memanggangnya dan tetap membuatnya berfungsi baik sebagai program dan sebagai resep, terutama jika ada kata kerja yang ingin digunakan bahkan sedikit tidak teratur (seperti "goreng" → "goreng").

Edit: Mengubah resep dari goreng menjadi telur shirred - terima kasih kepada Blazer untuk sarannya! Waktu dan suhu memasak harus dipertimbangkan hanya sebagai penasehat; Saya belum benar-benar mencoba resepnya sendiri, jadi saya tidak dapat menjamin keakuratannya.


Saya pikir ini output 1: lihat komentar saya di codegolf.stackexchange.com/a/4851 .
msh210

Ini menghasilkan 2, setidaknya menggunakan juru bahasa Acme :: Chef . Putaran terakhir ada hanya untuk kebingungan, dan agar pengunjung tidak harus makan telur mentah.
Ilmari Karonen

Ah, benar, aku merindukan fakta bahwa telur sudah ada di loyang dan itu bukan apa yang berkurang.
msh210

2
Anda menyebutnya shirred eggs, yang sebenarnya dilakukan dalam loyang dan itu akan membuat resep tersebut menjadi resep memasak yang benar dan secara tata bahasa benar. shirr the eggs. shirr the eggs until shirred.mengerikan karena memiliki pendidikan kuliner di bawah ikat pinggang saya! :)
Blazer

1
waktu / suhu memasak tampaknya benar :). tentu saja, selalu gunakan itu sebagai pedoman saja, karena cheflah yang menentukan apakah sesuatu dilakukan atau tidak, bukan waktu / suhu itu sendiri!
Blazer

4

Python (2.6)

Sangat sederhana, tetapi saya masih penasaran bagaimana kinerjanya dibandingkan dengan pendekatan lain.

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)

Cukup masukkan penawaran melalui stdin, mis python testbid.py < bids.txt .

EDIT : diubah untuk 'putaran pertama semua nol'

EDIT : sedikit mengubah 'angka ajaib' (kedua kalinya)


1
seharusnya tidak m = random.choice(1,2,2,3,3,3)menjadi m = random.choice([1,2,2,3,3,3])?
Blazer

Itu membuat kesalahan di mana Blazer mengatakan itu mungkin. Saya telah memasukkan tanda kurung siku untuk uji coba dan tampaknya berhasil.
Gareth

@ Blazer: ya, tentu saja (kesalahan ketik kecil di pihak saya). Terima kasih telah memberi tahu.
ChristopheD

4

Python (Blazer)

Bot ini menganalisis putaran sebelumnya dan mencatat angka yang menang. Karenanya, nomor pemenang yang lebih sering muncul akan memiliki peluang lebih baik untuk dipilih. Kemudian akan secara acak memilih angka dari angka yang menang (selain 1 atau 2). itu akan memilih 2 3 sebagai gantinya jika itu adalah babak pertama.

Input dibaca satu baris setiap kali. cukup masukkan baris kosong untuk berhenti menerima input

Caranya adalah dengan hanya menempelkan (itu secara otomatis menerima setiap baris dengan \ n di dalam tempel) dan tekan enter dua kali

Anda sekarang bisa saja meretas skrip dengan nama file di baris perintah:

python bidding.py bidding.txt

file akan terlihat seperti ini:

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)

sunting: ditambahkan or sum(rounds) == 0 untuk mengkompensasi perubahan putaran pertama semua-nol baru-baru ini

sunting: masalah dalam komentar diperbaiki, juga membuatnya dapat menerima input dari nama file, dan tidak pernah memilih '2' lagi karena kompetisi telah menyingkirkan itu juga. bekerja dengan semua-0 sebagai input awal atau tidak ada data dalam file sama sekali

edit2: lupa min ()

sunting3: input yang diubah sesuai dengan kebutuhan input pertanyaan


Menyebabkan masalah kecil dengan pencetak gol - Saya harus menekan enter untuk mendapatkan skor untuk setiap babak. Tidak banyak masalah untuk menjalankan 10 putaran tes saya, tetapi bisa menjadi rasa sakit untuk putaran 100 putaran.
Gareth

@ Gareth, bungkus dalam skrip bash. echo "$@" | python bidding.pyharus melakukan pekerjaan.
Peter Taylor

Saya sudah mencoba ini seperti yang disarankan Peter, tapi saya mendapatkan kesalahan TypeError: unsupported operand type(s) for +: 'int' and 'list'untuk baris 23. Saya menggunakan Python 2.6.1, apakah itu masalahnya? apakah saya memerlukan versi yang lebih baru? Saya mendapatkan masalah yang sama tanpa menggunakan skrip bash.
Gareth

@ Gareth akan membantu jika saya membuatnya jadi input disalurkan dari sys.argv [1] dengan nama file?
Blazer

@ Blazer saya tidak yakin itu masalahnya. Saya memanggil program dari baris perintah sendiri menggunakan contoh doa Anda dan mendapatkan kesalahan yang saya berikan di atas. Apakah ada sesuatu di sana yang tidak kompatibel dengan Python 2.6.1?
Gareth

3

Schwarzenbeck (Scala)

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

Schwarzenbeck tidak seharusnya mencetak gol. Dia adalah pembersihan untuk Beckenbauer, yang segera menyusul. :)

Untuk menggunakannya, Anda memerlukan kompiler dan kompilasi

scalac Schwarzenbeck.scala 

Maka Anda dapat menjalankannya:

scala Schwarzenbeck 'your ar-
gu-
ment' 

Sunting: Penyesuaian lebih lanjut.


1
Mengingat bahwa Schwarzenbeck tidak seharusnya mencetak gol, saya akan mengatakan itu benar-benar gagal :-)
celtschk

Ya, saya memiliki dilema: Saya membuat 3 pemain, dan berharap Müller mencetak poin terbanyak, tetapi dari posisi strategis, Schwarzenbeck menandai garis pertahanan pamungkas. Metapher sepakbola gagal, karena garis pertahanan saya mencetak gol. :)
pengguna tidak diketahui

3

Ahli Strategi (Ruby)

Menerapkan ratusan strategi sederhana: untuk setiap putaran, pilih satu yang akan memenangkan putaran sebelumnya:

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]

Saya tidak yakin saya memiliki format input yang benar - Saya tidak yakin bagaimana cara menghasilkan argumen baris perintah multi-baris untuk mengujinya di windows. (Metode ini tampaknya berfungsi pada IDEone.)


Saya tidak bisa mengujinya sekarang, saya sedang bekerja dan tidak akan pulang sampai setelah jam 9.30 (GMT). Apakah pertanyaan SO ini membantu dengan argumen multi-baris?
Gareth

Baru saja menguji ini dan itu memberi saya kesalahan - 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). Saya akan berhenti mempertimbangkan entri baru setelah jam 11 malam, tetapi saya akan menunda sedikit skor untuk memberi Anda waktu untuk melihat bug jika Anda mau.
Gareth

Oke, saya pikir masalahnya adalah Anda ARGFbukan ARGV. Setelah melakukan perubahan itu, program menebak 1setiap kali. Adakah yang bisa saya lakukan untuk memperbaikinya?
Gareth

Dapatkah Anda menambahkan baris ini ke atas dan memberi tahu saya apa yang tercetak saat memberikan input putaran ke-2 (2 baris data): p ARGV.map{|l|l};exit (Tidak ada jawaban SO untuk pertanyaan yang Anda referensi atau yang serupa tampaknya memberi saya input yang diharapkan)
AShelly

Mencetak ["1 2\n3 4\n5 6\n1 2"]untuk input tes dalam pertanyaan.
Gareth

2

Perl

Saya pikir saya mungkin juga memasuki yang tak terhindarkan. Entri yang lebih serius segera hadir. Sebagai bonus, entri ini tidak akan pernah kalah dalam kompetisi satu lawan satu.

print 1

tidak memenangkan setiap kompetisi. dalam satu-satu dengan yang lain percaya diri, itu akan mengikat
Blazer

Tidak! Saya tidak percaya saya lupa tentang kasus itu! Saya akan memperbaikinya.
PhiNotPi

Salah satu kesimpulan saya ketika saya mulai mendesain entri saya adalah bahwa setiap bot harus mengirimkan setidaknya 1 / n dari waktu, untuk melakukan bagian yang adil dalam mencegah orang percaya diri berjalan menjauh darinya.
Peter Taylor

@ Peter: Jangan khawatir, aku sudah urus itu . :)
Ilmari Karonen

2

JavaScript (node.js)

Menghitung apa yang paling populer pada babak terakhir dan menawar satu lebih sedikit dari itu, membungkus ke 20 dan menawar 3 pada putaran pertama.

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

Cara memohon:

node script.js 'the argument'

Melihat hasil uji coba terbaru, ini tidak berperilaku seperti yang didokumentasikan. Tahu kenapa tidak?
Peter Taylor

1
@PeterTaylor Saya ingin tahu apakah ini forloop pertama ? Harus if(i in numbers)menjadi if(matches[i] in numbers)yang Anda pikir?
Gareth

@minitech Setelah sedikit mencari-cari, sepertinya regex hanya cocok dengan satu nomor input - tidak cukup tahu tentang javascript atau Nodejs untuk bisa mengatakan mengapa. Juga, apakah Anda perlu membagi input pada baris baru untuk mendapatkan putaran terakhir?
Gareth

@ Gareth: Memang benar. Diperbarui, meskipun jika kinerjanya lebih baik pada awalnya maka saya tidak keberatan :)
Ry-

Sayangnya itu membuat kesalahan untuk setiap putaran kecuali yang pertama sekarang: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)

Lain lagi, kali ini salinan jawaban yang tepat yang dimiliki pemenang terakhir, jika ada. Ini baik untuk mencoba menang dan memblokir penawar lainnya. tawaran 5jika babak pertama, tawaran nomor acak dari babak sebelumnya jika entah bagaimana tidak ada pemenang

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)

Ini sama sekali tidak dirancang untuk menang, tapi saya tetap melemparkannya di luar sana untuk menambahkan warna ke kerumunan :) Itu tawaran rata-rata dari babak terakhir (Average Joe). Dipanggil sama dengan jawaban asli saya (yang sekarang akan saya beri nama karena sepertinya itulah yang dilakukan semua anak keren, dan membantu membedakan keduanya). jika memulai putaran, itu tawaran 10.

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

sunting: metode input yang diubah agar sesuai dengan metode input pertanyaan


2

Python (TotalBots)

Saya pikir ini akan menjadi yang terakhir, tetapi kita akan lihat nanti. Dibutuhkan keuntungan dari mengetahui berapa banyak bot yang ada dengan hanya mengeluarkan jumlah bot yang bersaing, jadi jika ada 17 bot (jumlah bot saat ini, ditambah yang satu ini), itu akan menghasilkan17

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

2

Perl (Inspektur Kesehatan)

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

Saya yakin Anda bisa menebak apa fungsinya.


2

C ++ (Guucated Guess)

Saya sudah berpikir saya akan melewatkan tenggat waktu, tetapi berkat ekstensi saya masih bisa menambahkan entri saya. Program ini dikompilasi dengan g ++. Program ini mencoba untuk menebak statistik dari entri lain, dan untuk memilih yang terkecil tidak akan dipilih oleh yang lain.

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

Lihat "Bob" untuk cara memohon.


Itu panduan yang sangat rekursif untuk doa ;-)
Gareth

Sebenarnya ada rantai logika yang ditempatkan: Alice menjelaskan bagaimana dia mengambil input. Eve menyebutkan bahwa ia menerima input yang sama dengan Alice. Eve juga menyebutkan bahwa dia mengambil input yang sama dengan Bob. Dengan demikian, Bob mengambil format input yang sama dengan Alice, yang dijelaskan.
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"}
}

Mengambil input yang mirip dengan bot saya yang lain.

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

2

Perl (Hawa)

Saya benar-benar redid entri ini untuk membantu membuka jalan bagi bot saya yang lain.

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

Mengambil satu format input: sama dengan "Bob" dan "Alice".


1

Brainfuck

Mengutip dari tantangan:

"Anda dapat memasukkan bot sebanyak yang Anda inginkan, jadi jika ada yang memasukkan bot yang hanya menebak 1, Anda bisa memasukkan bot lain yang melakukan hal yang sama untuk menjadikannya tidak berguna."

Yah, karena PhiNotPi memang memasukkan satu , biarkan saya memasukkan yang lain. Agar berbeda, saya akan melakukannya di Brainfuck:

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

Tentu saja, sekarang taruhan 1 bukan lagi strategi yang layak, hal yang jelas harus dilakukan sekarang adalah bertaruh 2 ...

Sunting: Pisahkan jawaban menjadi dua per komentar, tulis ulang kedua program dalam bahasa yang lebih menarik.


Pertama, satu entri per jawaban. Kedua, saya tahu bahwa seseorang dapat memposting 100 jawaban, masing-masing mencetak satu digit dari 1 hingga 100 untuk menjamin tidak akan kalah - dengan cara yang sama orang lain dapat melakukan hal yang persis sama dengan tidak ada seorang pun yang akan menang. Dalam permainan sepakbola (sepak bola) semua 11 pemain bisa berdiri di garis gawang untuk menjamin bahwa tim lain tidak mencetak gol. Biasanya tidak pernah terjadi seperti itu karena akan banyak permainan jika mereka melakukannya?
Gareth

Ketiga, keberatan ini seharusnya benar-benar diajukan di kotak pasir - setelah semua itu tujuannya.
Gareth

@ Gareth: Oke, saya sudah membagi jawabannya menjadi dua. Adapun kewajaran dari entri, Anda sendiri menyarankan bahwa, jika ada orang yang mengirimkan "kepercayaan diri", orang lain dapat melakukan hal yang sama untuk melawannya. Pada titik itu, tentu saja, mengirimkan "twosconfident" sama masuk akalnya dengan mengirimkan "onesconfident" pada awalnya, jadi ...
Ilmari Karonen

1
Hal yang rapi tentang ini adalah bahwa sekarang saya tidak dapat menghapus entri percaya diri saya tanpa membiarkan entri ini menang.
PhiNotPi

1
@ Peter: Mengapa menurut Anda begitu? Mengingat bahwa kedua program saya dan PhiNotPi sedang berlomba, tidak ada alasan bagi orang lain untuk mengirimkan program yang pernah bertaruh 1 (jika mereka ingin program itu menang, itu adalah).
Ilmari Karonen

1

Mueller (Scala)

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

Jika Anda mengenal Schwarzenbeck dan Beckenbauer, Anda tentu mengharapkan Mueller. Ini dia. Dia akan mendapat banyak manfaat dari Beckenbauer dan Schwarzenbeck dan seharusnya menang.

Detail tentang menjalankan dan kompilasi: Lihat Schwarzenbeck

Lebih dekat ke tujuan, sekarang.


1

Beckenbauer (Scala)

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

Dengan bantuan Schwarzenbeck, Beckenbauer seharusnya mencetak beberapa gol. Tanpa Schwarzenbeck, dia bukan siapa-siapa.

Detail tentang menjalankan dan kompilasi: Lihat [Schwarzenbeck] [1]

Sunting: Bermain lebih dalam di ruangan sekarang juga.


1

Script Batch

echo 5

Kiriman saya, berikan 5 sebagai jawabannya setiap kali ;-)


1

Eight.bat

echo 8

Jawaban sederhana lain, memberi 8 setiap kali.


1

FivesCancel (PHP)

Membatalkan solusi "selalu 5" mellamokb.

5

1

EightsCancel (PHP)

Membatalkan solusi "selalu 8" mellamokb. Maaf, mellamokb!

8

Ini dia lagi, kompetisi: P
mellamokb

1

Python 2.7 - Copycat2

Salinan pemenang babak terakhir kedua . Oh tidak! jika tidak, output 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

Script Shell (Pemikiran Dalam)

OK, jadi saya mendapat sedikit kesempatan kedua, inilah entri lain, kali ini skrip shell (harus bekerja dengan shell apa pun). Ini selalu memberikan jawaban untuk pertanyaan tentang kehidupan, alam semesta dan segalanya.

echo 42

Sebenarnya algoritma ini tidak sepenuhnya benar karena saya menghilangkan penundaan 7,5 juta tahun. :-)


Sudah terlambat untuk ujian malam ini, maaf, tapi aku akan melakukan yang lain di pagi hari.
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);
}

Saya pikir ini melewati bit acak terlalu cepat untuk digunakan /dev/random, betapapun saya lebih suka. Jika ada yang ingin mengujinya di Windows Anda harus porting sendiri, karena saya tidak memiliki akses ke kotak Windows dengan kompiler C.

Alasan

Saya tidak ingin menjelaskan logika di balik ini sebelum turnamen berakhir, tetapi sekarang setelah pemenangnya diumumkan, saya pikir sudah waktunya.

Dengan prinsip lubang-merpati (prinsip Dirichlet alias, maka nama bot), jika ada bot N bersaing maka ada nomor w di [1..1 + N / 2] yang baik menang atau akan menang jika terpilih. Karena itu saya menyimpulkan bahwa strategi optimal tidak akan memilih angka yang lebih besar dari 1+ N / 2. Tetapi jika N adalah genap, memilih 1+ N / 2 menciptakan slot kemenangan yang lebih kecil. Oleh karena itu slot yang layak dipilih adalah [1 .. ( N +1) / 2].

Itu meninggalkan pertanyaan tentang bagaimana memilih slot. Untuk sejumlah kecil bot saya memverifikasi bahwa ada keseimbangan Nash ketika setiap bot memilih secara seragam di antara para kandidat, dan saya sangat curiga bahwa ini akan terus berlaku.

Penyimpangan kecil dalam strategi bot ini dari yang teoretis hanyalah metagaming.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.