En düşük benzersiz teklif açık artırması


22

Tüm kayıtlar için teşekkürler, son tarih geçti ve son puanlar sorunun sonunda. PhiNotPi'ye oldukça kapsamlı bir zafer
için tebrikler .

Bu, en düşük benzersiz teklif açık artırmasında rakiplerinden herhangi birinden daha sık kazanan bir program yaratmak olan, olan bir meydan okumadır.

Giriş

Girdi olarak, program önceki tüm turların tekliflerini, her satıra bir tur olacak, tüm teklifler boşluklarla ayrılmış olarak alacak:

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

Girdinin her sütunu bir botun teklifini temsil eder. İlk sütun alıcı programın teklifleridir, gerisi rastgele oluşturulmuş bir sıradadır. Hammar ve Peter Taylor'a katkılarından dolayı teşekkür ederiz .

Giriş, programınıza bir ve tek komut satırı (çok satırlı) argümanı olarak sağlanır:

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

Bu, programınızın komut satırından çalıştırılabilir olması gerektiği anlamına gelir. Lütfen cevabınızın bir parçası olarak bir çağrı örneği verin.

İlk rauntta, yalnızca kaç 0botla karşı karşıya olduğunuzu bilmenin bir yolu olarak, giriş her bot için bir - bir satır olacaktır .

Çıktı

Programınız, teklifini 1 ila 100 (dahil) aralığında bir tam sayı olarak vermelidir.

Golcü Programı

Bu benim puanlama programım - eklemeler, iyileştirmeler veya hata düzeltmeleri için önerileriniz memnuniyetle karşılanacaktır.

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

Test oyuncuları

Biri kendine güveniyor Daima 1 teklif veriyor.

#include <stdio.h>

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

Random100 Tüm seri boyunca rastgele teklifler

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

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

Random20 1 ile 20 arası rastgele teklifler

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

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

Rastgele5 1-5 arası rastgele teklifler

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

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

Örnek geçiş:

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

Bu oyuncular sadece test amaçlıdır. Yarışmaya dahil edilmeyeceklerdir. İstediğiniz kadar çok bot girebilirsiniz, böylece herhangi biri yalnızca tahmin eden bir bot girerse 1, onu işe yaramaz kılmak için aynı şeyi yapan başka bir girebilirsiniz.

kazanan

Her turdaki kazanan bot, en düşük benzersiz teklifi verendir. Dolayısıyla, aşağıdaki tekliflerin verildiği bir tur verildiğinde: 1 1 3 5 2 3 6 3 2 8 7kazanan, teklif veren bot olacaktır 5çünkü 1s, 2s ve 3s benzersiz değildir.

Yarışmanın galibi 100 turdan sonra en çok kazanan program olacak. Beraberlik durumunda, kazanan tekliflerin toplamı beraberlik kırıcı olarak kullanılacak ve ayrıca beraberlik olması durumunda, en düşük kazanan teklif bir başka bağlayıcı olarak kullanılacaktır. Bu puanlama faktörlerinin hepsi puanlama programı tarafından üretilir.

Puanlama programını bugünden 2 hafta önce girilmiş olan tüm çalışma programlarında çalıştıracağım ( 18 Şubat şimdi, 20 Şubat'ta saat 11: 00'e (GMT) kadar ). Tüm çalışan girişleri oylayacağım ve puanlama koşumun kazananını kabul edeceğim.

Final puanlama koşusu

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 ... olduğu gibi yazılan kurallar sayesinde, her zaman belirli bir sayı teklif eden 100 program girerek oyunu gerçekten bozabilirim.
Ilmari Karonen

1
Kazanan botun nasıl seçildiğini iki cümle söyler misiniz? Anlamadım.
kullanıcı bilinmeyen

@IlmariKaronen Bu doğru olabilir. Ama insanların bunu yapmayacağına güveniyorum. Sanırım kişi başına giriş sayısını sınırlandırabilirim, ancak herhangi bir spoiler ortaya çıkarsa buna başvuracağımı düşünüyorum.
Gareth,

@ userunknown Açık artırma turlarının nasıl çalıştığını açıklamaya çalıştım.
Gareth,

1
@PhiNotPi: Suçluluk hissetme. Kurallar dahilinde kazandın.
Steven Rumbalski,

Yanıtlar:


9

Perl

Bu sefer biraz daha denedim. Bu gerçekten basit ve karmaşık bir strateji, ancak genişleme için çerçeve hazırladım.

Düzenleme: Yinele tamamlayın. Bu şey içinde kazanmak için var.

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

Bu program bir seferde bir satırlık girdi ve ardından iki yeni satır geliyor:

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

Tamam, bu metagamingi aşırı uçlara götürüyor.
Peter Taylor

@petertaylor Çok fazla çizgi dışına mı gidiyorum? Orijinalime geri dönmeli miyim?
PhiNotPi

2
Bu kural avukatlar için ünlü bir site - tamamen adil. Ancak yığın değişim mekanizmasının, tepe kralı yarışmalar için en iyisi olamayacağı sonucuna varıyorum.
Peter Taylor

Ben de bu sonuca vardım. Gelecekteki yarışmalarda botları gizlemek için bir yöntem yaratmamız gerekiyor. Bildiğim kadarıyla, şu anda biri botlarımda metagaming yapıyor.
PhiNotPi

Lol, bu benim fikrimdi: P. Siz zaten uygulamış olduğunuzdan ve tembel olduğum için, size izin vereceğim :) Kolayca yenemeyeceğiniz tek tür girişin rastgelelik uygulayanlar olduğunu unutmayın
mellamokb

8

Şef

Yana hep 1 bahis şimdi ise kaybeden strateji , yapılacak bariz şey her zaman bahis etmektir 2 yerine. Öyleyse yapmama izin ver. Bu aksi halde sıkıcı girişi biraz daha ilginç hale getirmek için, Chef'e yazmaya karar verdim :

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.

Bir bonus olarak, program aslında az ya da çok gerçek - eğer önemsiz - bir tarif gibi çalışır, yazar biraz pişmiş gibi okunsa bile. Şef dilbilgisi, bir kabın içindeki malzemelerin karıştırılması ve pişirilmesinden daha karmaşık bir şey içeren bir şey yazmayı oldukça zorlaştırıyor gibi görünüyor, ancak yine de bir fiil kullanmak isterse, hem program hem de yemek tarifi olarak çalışmasını sağlayın. hatta biraz düzensiz ("kızartma" → "kızartılmış" gibi).

Düzenleme: Tarifi kızartmadan büzülmüş yumurtalara değiştirdi - öneri için Blazer sayesinde! Pişirme süresi ve sıcaklık sadece tavsiye olarak kabul edilmelidir; Aslında tarifi henüz kendim denemedim, bu yüzden doğruluğu için kefil olamıyorum.


Bunun çıktı 1 olduğunu düşünüyorum : codegolf.stackexchange.com/a/4851 adresindeki yorumuma bakın .
msh210

En azından Acme :: Chef tercümanı kullanarak 2 çıktı verir . Son döngü sadece şaşkınlık için orada ve böylece diners yumurtaları çiğ yemek zorunda kalmayacak.
Ilmari Karonen

Ah, doğru, yumurtaların zaten pişirme tabağında olduğu ve azalmış olanın olmadığını özledim.
msh210

2
Buna shirred eggsaslında bir fırın tabağında yapılan ve tarifi gerçek bir geçerli yemek tarifi yapan ve dilbilgisi açısından doğru olan bir şey diyorsunuz . shirr the eggs. shirr the eggs until shirred.Kemerimin altında mutfak eğitimi için horray! :)
Blazer

1
pişirme süresi / sıcaklık doğru görünüyor :). Tabii ki, her zaman sadece kılavuz olarak kullanın, çünkü bir şeyin yapılıp yapılmayacağını belirleyen şef, zaman / sıcaklık değil!
Blazer

4

Python (2.6)

Son derece basit, ama yine de diğer yaklaşımlara göre nasıl bir performans göstereceğini merak ediyorum.

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)

Teklifleri sadece stdin üzerinden yönlendirin, örn python testbid.py < bids.txt.

EDIT : 'Tüm sıfırların ilk turu' için değiştirildi

EDIT : 'sihirli sayıları' biraz değiştirdi (ikinci kez)


1
olmamalıdır m = random.choice(1,2,2,3,3,3)olmak m = random.choice([1,2,2,3,3,3])?
Blazer

Blazer'ın söyleyebileceği bir hata yaptı. Test çalışması için köşeli parantezleri yerleştirdim ve işe yaradığı anlaşılıyor.
Gareth,

@ Blazer: evet, kesinlikle (benim tarafımda küçük yazım hatası). Bildirdiğiniz için teşekkürler.
ChristopheD

4

Python (Blazer)

Bu bot önceki turları analiz eder ve kazanan sayıları kaydeder. Bu nedenle, daha sık görünen sayıları kazanmak, daha iyi bir seçim şansına sahip olacak. Daha sonra rastgele sayıları kazanan numaralardan seçecektir (1 veya 2 dışında). ilk tursa, 2 3 seçecektir .

Giriş her seferinde bir satır okunur. sadece girişi kabul etmeyi durdurmak için boş bir satır girin

Bir hile sadece yapıştırmaktır (yapıştırma içinde \ n ile her satırı otomatik olarak kabul eder) ve iki kez enter tuşuna basın

Şimdi komut dosyasını, komut satırında bir dosya adıyla yürütebilirsiniz:

python bidding.py bidding.txt

dosya şöyle görünmeli:

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)

düzenleme: or sum(rounds) == 0son ilk-hepsi-hepsi-sıfır-değişimini telafi etmek için eklendi

düzenleme: yorumlarda yaşanan sorunlar giderildi, dosya adından girdi alınabildi ve rekabet de buna aykırı olduğu için hiçbir zaman '2'yi seçmedi. başlangıç ​​girişi olarak all-0'larla çalışır veya dosyada hiçbir veri yoktur

edit2: bir dakika unuttum ()

edit3: Sorunun girdi ihtiyaçlarına uyacak şekilde girdi değiştirildi


Golcüyle ilgili küçük bir soruna neden oluyor - Her turdaki puanı almak için enter tuşuna basmam gerekiyor. 10 tur test çalışmam için pek sorun değil, 100 tur koşusu için bir acı olabilir.
Gareth

@Gareth, bir bash betiğine sar. echo "$@" | python bidding.pyişi yapmalı.
Peter Taylor

Bunu Peter'ın önerdiği gibi denedim, ama TypeError: unsupported operand type(s) for +: 'int' and 'list'satır 23 için hata alıyorum . Python 2.6.1 kullanıyorum, sorun bu mu? daha yeni bir sürüme ihtiyacım var mı? Bash betiğini kullanmadan da aynı sorunu alıyorum.
Gareth,

@Gareth, girişin sys.argv [1] 'den bir dosya adı ile aktarılmasını sağlayacak olsaydı yardımcı olurdu?
Blazer

@ Blazer Sorunun bu olduğundan emin değilim. Örnek çağrınızı kullanarak ve yukarıda verdiğim hatayı alıp, programı komut satırından kendim arıyorum. Python 2.6.1 ile uyumlu olmayan bir şey var mı?
Gareth,

3

Schwarzenbeck (Scala)

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

Schwarzenbeck'in gol atmaması gerekiyordu. Yakında takip eden Beckenbauer’ın temizliği. :)

Kullanmak için bir derleyiciye ihtiyacınız var ve derleyin

scalac Schwarzenbeck.scala 

O zaman çalıştırabilirsiniz:

scala Schwarzenbeck 'your ar-
gu-
ment' 

Düzenleme: Diğer ayarlamalar.


1
Schwarzenbeck'in golü
atmaması

Evet, bir ikilem yaşadım: 3 oyuncudan oluşan bir çizgi yaptım ve Müller'in en fazla puanı kazanmasını bekledim, ancak stratejik bir pozisyondan Schwarzenbeck nihai savunma hattını işaretledi. Futbol metaferi başarısız oldu, çünkü savunma hattım golleri attı. :)
kullanıcı bilinmeyen

3

Stratejist (Yakut)

Yüzlerce basit strateji uygular: her turda en çok turu kazanacak olanı seçer:

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]

Giriş biçimini doğru aldığımdan emin değilim - pencerelerde test etmek için çok satırlı komut satırı bağımsız değişkenlerini nasıl oluşturacağımı bilmiyorum. (Bu yöntem IDEone'da çalışıyor gibi görünüyor.)


Şu anda test edemiyorum, işteyim ve saat 9: 30'a (GMT) kadar evde olmayacağım. Bu SO sorusu çok satırlı argümanlara yardımcı oluyor mu?
Gareth,

Sadece bunu test ettim ve bu bana bir hata veriyor - 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). Saat 11: 00'den sonra yeni girişleri düşünmeyi bırakacağım, ancak puanlamayı biraz geciktireceğim ve isterseniz hataya bakmanız için size zaman tanıyacağım.
Gareth,

Tamam, sanırım sorun ARGFARGV yerine senin olmandı. Bu değişikliği yaptıktan sonra program 1her zaman tahmin eder . Düzeltmek için ne yapabilirim?
Gareth

Bu satırı en üste ekleyip bana 2. tur girişini verirken ne yazdırdığını söyler misiniz (2 satır veri): p ARGV.map{|l|l};exit (Başvurduğunuz veya benzer sorulardan hiçbiri bana beklenen girişi vermiyor gibi görünmez.)
AShelly

Söz ["1 2\n3 4\n5 6\n1 2"]konusu test girişi için yazdırılır .
Gareth,

2

Perl

Kaçınılmaz olarak girebileceğimi düşündüm. Daha ciddi girişler çok yakında. Bir bonus olarak, bu giriş birebir bir yarışmada asla kaybolmayacak.

print 1

her yarışmayı kazanmadım. Birinde birebir olanlardan biriyle, bağlar
Blazer

Yok hayır! Bu davayı unuttuğuma inanamıyorum! Bunu düzelteceğim.
PhiNotPi

Girişimi tasarlamaya başladığımdaki sonuçlardan biri, her bir botun, kendinden emin olanların gitmesini engellemede adil paylarını almak için en az 1 / n teklif vermesi gerektiğidir.
Peter Taylor,

@Peter: Endişelenme, ben hallettim . :)
Ilmari Karonen

2

JavaScript (node.js)

Son turda en popüler olanı sayar ve bundan daha az teklif verir, 20'ye tamamlanır ve ilk turda 3 teklif verir.

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

Nasıl çağırılır:

node script.js 'the argument'

En son yapılan testin sonuçlarına baktığımızda, bu belgelenmiş gibi davranmaz. Herhangi bir fikrin neden olmasın?
Peter Taylor,

1
@PeterTaylor İlk fordöngü olup olmadığını merak ediyorum ? Meli if(i in numbers)olmak if(matches[i] in numbers)sence?
Gareth,

@ minitech Etrafında biraz dürtme yaptıktan sonra, regex yalnızca girişin bir rakamıyla eşleşiyor gibi görünüyor - javascript veya Nodejs hakkında nedenini söyleyebilmek için yeterince bilgim yok. Ayrıca, son rauntu almak için girişi yeni hatlara bölmeniz mi gerekiyor?
Gareth,

@Gareth: Gerçekten de öyle. Aslında daha iyi performans gösterse de güncellendi, o zaman umrumda değil :)
Ry -

Maalesef ilk tur hariç her rauntta bir hata atıyor: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)

Bir diğeri, bu kez, eğer varsa, son kazananın tam cevabını kopyalar. Diğer teklif sahiplerinin ikisini de kazanmaya ve engellemeye çalışacak şekilde atanmış. 5eğer birinci rauntta teklif verilirse, önceki turdan rastgele bir sayı alırsa, bir şekilde galibi olmazsa

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)

Bu kazanmak için tasarlanan bir yöntem değil, ama yine de kalabalığa renk katmak için onu fırlatıp atıyorum :) Son turun ortalamasını veriyor (Ortalama Joe). Özgün cevabımla aynı şekilde çağrıldım (ki şimdi isimlendireceğim çünkü tüm havalı çocukların yaptıkları gibi görünüyor ve ikisini ayırt etmeye yardımcı oluyor). Başlarsanız, teklif verir 10.

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

düzenleme: değiştirilen giriş yöntemi, sorunun giriş yöntemine uygun


2

Python (TotalBots)

Sanırım bu benim sonum olacak ama göreceğiz. Kaç tane bot bulunduğunu bilmek, rakip bot sayısını göstererek avantaj sağlar, bu nedenle eğer 17 bot varsa (mevcut bot sayısı, artı bu),17

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

2

Perl (Sağlık Müfettişi)

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

Eminim ne yaptığını tahmin edebilirsin.


2

C ++ (Eğitimli Tahmin)

Son başvuru tarihini kaçıracağımı düşünüyordum, ancak uzatma sayesinde hala girişimi ekleyebilirim. Bu program g ++ ile derlenir. Program, diğer girdilerin istatistiklerini tahmin etmeye ve başka biri tarafından seçilme olasılığı olmayan en küçük olanı seçmeye çalışır.

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

Nasıl çağırılacağı hakkında "Bob".


Bu, çağırma için çok özyineli bir rehber ;-)
Gareth,

Gerçekleştirilen bir mantık zinciri var: Alice nasıl girdiğini açıklar. Eve, Alice ile aynı girişi yaptığını söyler. Eve ayrıca, Bob ile aynı girişi yaptığını söyler. Böylece, Bob açıklanan Alice ile aynı giriş biçimini alır.
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"}
}

Diğer botlarıma benzer girdi alır.

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

2

Perl (Havva)

Diğer botlarımın önünü açmak için bu girişi tamamen yeniden yazdım.

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

Bir giriş formatı alır: "Bob" ve "Alice" ile aynı.


1

brainfuck

Mücadeleden alıntı yapmak için:

“İstediğiniz kadar bot girebilirsiniz, böylece herhangi biri yalnızca tahmin eden bir bot girerse 1, onu işe yaramaz kılmak için aynı şeyi yapan başka birine girebilirsiniz .”

PhiNotPi bir tanesine girdiğinden beri, bir başkasına girmeme izin verin. Sadece farklı olmak için, bunu Brainfuck'ta yapacağım:

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

Tabii ki, şimdi bahis 1 artık uygulanabilir bir strateji değil, şimdi yapılacak en önemli şey bunun yerine 2 bahis yapmak. ...

Düzenleme: Yanıtı yorum başına ikiye bölün, her iki programı daha ilginç dillerde yeniden yazın.


Öncelikle, cevap başına bir giriş lütfen. İkincisi, birisinin kaybetmemeyi garanti etmek için 1'den 100'e kadar olan rakamlardan birini basan her birinin 100 cevap verebileceğini biliyorum - eşit olarak başka biri hiç kimsenin kazanmayacağı anlamına gelebilir. Bir futbol oyununda (futbol), diğer takımın gol atamadığından emin olmak için 11 oyuncunun tümü gol çizgisinde durabilirdi. Normalde asla böyle olmaz, çünkü yaparlarsa bir oyun çok olur.
Gareth,

Üçüncüsü, bu itiraz kum havuzunda gerçekten yapılmış olmalıydı - ondan sonra amacı bu.
Gareth

@Gareth: Tamam, cevabı ikiye böldüm. Girdilerin makul olup olmadığı konusunda, kendiniz, “kendinden emin olanları” sunacak olsaydı, başkasının buna karşı koymak için aynı şeyi yapabileceğini önerdiniz. Elbette, bu noktada, "iki güvenceyi" göndermek, ilk başta "kendinden eminlerini" sunmak kadar anlamlı, yani ...
Ilmari Karonen

1
Bununla ilgili en güzel şey şu ki, kendime güvendiğim girişi bu girişin kazanmasına izin vermeden silemiyorum.
PhiNotPi

1
@Peter: Neden öyle düşünüyorsun? Maden ve PhiNotPi programları hem yarışta olduğu göz önüne alındığında, herkesten bir program sunmayı için hiçbir neden yok hiç bahisler 1 (isterlerse o program olduğunu, kazanmak için).
Ilmari Karonen

1

Mueller (Scala)

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

Schwarzenbeck ve Beckenbauer'ı tanıyorsanız, Mueller’i mutlaka umuyorsunuz. İşte burada. Beckenbauer ve Schwarzenbeck'ten çok faydalanacak ve kazanması gerekiyor.

Koşma ve derleme hakkında ayrıntılar: See Schwarzenbeck

Hedefe daha yakın, şimdi.


1

Beckenbauer (Scala)

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

Schwarzenbeck'in yardımıyla, Beckenbauer'in bazı golleri atması gerekiyordu. Schwarzenbeck olmadan o bir hiç.

Koşma ve derleme hakkında detaylar: Bkz. [Schwarzenbeck] [1]

Düzenleme: Şimdi de odada daha derinlerde oynamak.


1

Toplu Komut Dosyası

echo 5

Gönderim, her zaman cevabı olarak 5 verir ;-)


1

Eight.bat

echo 8

Bir başka basit cevap, her seferinde 8 verir.


1

FivesCancel (PHP)

Mellamokb'un "her zaman 5" çözümünü iptal eder.

5

1

EightsCancel (PHP)

Mellamokb'un "her zaman 8" çözümünü iptal eder. Üzgünüm mellamokb!

8

İşte yine başlıyoruz, yarışma: P
mellamokb

1

Python 2.7 - Kopyalayıcı2

Kopya ikinci Geçen yuvarlaklık kazanan. Oh hayır! Aksi takdirde 7 çıktılar.

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

Kabuk betiği (Derin Düşünce)

Tamam, ikinci bir şansım olsun ki, işte başka bir giriş, bu sefer bir kabuk betiği (herhangi bir kabuk ile çalışması gerekir). Bu her zaman yaşam, evren ve her şey sorusuna cevap verir.

echo 42

Aslında bu algoritma tam olarak doğru değil çünkü 7,5 milyon yıllık gecikmeyi ihmal ettim. :-)


Bu akşamki test için çok geç kaldım ama sabah başka bir şey yaparım.
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);
}

Bunun kullanım için çok hızlı rastgele bitlerden geçtiğini düşünüyorum /dev/random istediğim . Herhangi biri Windows'ta test etmek istiyorsa, kendiniz taşımak zorunda kalacaksınız, çünkü C derleyicili bir Windows kutusuna erişimim yok.

gerekçe

Turnuva bitmeden bunun arkasındaki mantığı açıklamak istemedim, ama şimdi kazanan açıklandı, sanırım zamanı geldi.

Güvercin deliği ilkesine göre (aka Dirichlet'in ilkesi, dolayısıyla botun adı), eğer N yarışan botlar varsa, o zaman [1..1 + N / 2] 'de kazanılan veya kazanacak olan bir sayı w . seçilen. Bu nedenle, optimal stratejinin 1+ N / 2'den büyük rakamları seçmeyeceği sonucuna varıyorum . Fakat eğer N ise, 1+ N / 2 seçilmesi daha küçük bir kazanan slot oluşturur. Bu nedenle seçmeye değer yuvalar [1 .. ( N + 1) / 2].

Bu, bir slotun nasıl seçileceği sorusunu bırakıyor. Küçük bot sayıları için, her bir bot adaylar arasında eşit olarak seçildiğinde bir Nash dengesi olduğunu doğruladım ve bunun devam edeceğinden şüpheliyim.

Bu botun stratejisinde teorik olandan küçük bir sapma sadece metagaming.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.