Đấu giá đấu giá duy nhất thấp nhất


22

Cảm ơn tất cả các mục, thời hạn đã trôi qua và điểm số cuối cùng là ở cuối câu hỏi.
Xin chúc mừng PhiNotPi về một chiến thắng khá toàn diện.

Đây là một thử thách , mục đích của nó là tạo ra một chương trình chiến thắng thường xuyên hơn bất kỳ đối thủ nào trong một cuộc đấu giá đấu giá duy nhất thấp nhất.

Đầu vào

Khi nhập vào, chương trình sẽ nhận được tất cả giá thầu của các vòng trước, một vòng trên mỗi dòng, tất cả các giá thầu được phân tách bằng khoảng trắng như sau:

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

Mỗi cột của đầu vào đại diện cho việc đặt giá thầu của một bot. Cột đầu tiên là giá thầu của chương trình nhận, trong khi phần còn lại theo thứ tự được tạo ngẫu nhiên. Cảm ơn hammarPeter Taylor cho đầu vào của họ.

Đầu vào được cung cấp dưới dạng đối số một và chỉ dòng lệnh (nhiều dòng) cho chương trình của bạn:

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

Điều này có nghĩa là chương trình của bạn sẽ cần được chạy từ dòng lệnh. Vui lòng cho một ví dụ về lời mời như là một phần của câu trả lời của bạn.

Trong vòng đầu tiên chỉ là một phương tiện cho bạn biết bạn đang đối đầu với bao nhiêu bot, đầu vào sẽ là một dòng 0s - một cho mỗi bot.

Đầu ra

Chương trình của bạn sẽ xuất giá thầu dưới dạng số nguyên trong phạm vi từ 1 đến 100 (đã bao gồm).

Chương trình Vua phá lưới

Đây là chương trình chấm điểm của tôi - mọi đề xuất bổ sung, cải tiến hoặc sửa lỗi sẽ được hoan nghênh.

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

Người chơi thử

Tự tin luôn luôn trả giá 1.

#include <stdio.h>

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

Giá thầu Random100 ngẫu nhiên trên toàn bộ phạm vi

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

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

Giá thầu ngẫu nhiên20 ngẫu nhiên từ 1 đến 20

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

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

Giá thầu ngẫu nhiên5 ngẫu nhiên từ 1 đến 5

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

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

Ví dụ chạy qua:

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

Những người chơi chỉ dành cho mục đích thử nghiệm. Họ sẽ KHÔNG được đưa vào cuộc thi. Bạn có thể nhập bao nhiêu bot tùy thích, vì vậy nếu có ai vào bot chỉ đoán 1, bạn có thể nhập một bot khác để làm cho nó vô dụng.

Người chiến thắng

Bot chiến thắng trong mỗi vòng là người đưa ra giá thầu duy nhất thấp nhất . Vì vậy, được đưa ra một vòng trong đó các giá thầu sau được thực hiện: 1 1 3 5 2 3 6 3 2 8 7người chiến thắng sẽ là bot trả giá 51s, 2s và 3s không phải là duy nhất.

Người chiến thắng trong cuộc thi sẽ là chương trình chiến thắng nhiều lần nhất sau 100 vòng. Trong trường hợp hòa, tổng số giá thầu trúng thầu sẽ được sử dụng làm hòa vốn và trong trường hợp đó là hòa, giá thầu thắng thấp nhất sẽ được sử dụng làm giá thầu tiếp theo. Các yếu tố cho điểm này là tất cả đầu ra của chương trình tính điểm.

Tôi sẽ chạy chương trình tính điểm trên tất cả các chương trình làm việc đã được nhập 2 tuần kể từ hôm nay (ngày 18 tháng 2 bây giờ kéo dài đến 11 giờ tối (GMT) vào ngày 20 tháng 2 ). Tôi sẽ nâng cao tất cả các mục làm việc và chấp nhận người chiến thắng trong cuộc chạy điểm của tôi.

Chạy chấm điểm cuối cùng

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 ... với các quy tắc được viết như hiện tại, tôi thực sự có thể làm hỏng trò chơi bằng cách nhập 100 chương trình mà mỗi chương trình luôn đặt giá thầu cho một số nhất định.
Ilmari Karonen

1
Bạn có thể nói hai câu, làm thế nào bot chiến thắng được chọn? Tôi không hiểu
người dùng không xác định

@IlmariKaronen Điều đó đúng, bạn có thể. Nhưng tôi tin rằng mọi người sẽ không làm điều đó. Tôi có thể giới hạn số lượng mục nhập cho mỗi người mà tôi cho là, nhưng tôi nghĩ tôi sẽ chỉ dùng đến điều đó nếu có bất kỳ kẻ phá hoại nào xuất hiện.
Gareth

@userunknown Tôi đã cố gắng làm rõ cách thức các vòng đấu giá hoạt động.
Gareth

1
@PhiNotPi: Đừng cảm thấy tội lỗi. Bạn đã thắng trong các quy tắc.
Steven Rumbalski

Câu trả lời:


9

Perl

Tôi đã cố gắng hơn một chút thời gian này. Đó là một chiến lược phức tạp thực sự đơn giản , nhưng tôi đã thiết lập khuôn khổ để mở rộng.

Chỉnh sửa: Hoàn thành làm lại. Điều này là trong đó cho chiến thắng.

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

Chương trình này nhận đầu vào một dòng tại một thời điểm, theo sau là hai dòng mới:

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

Ok, điều này đưa metagaming đến cực đoan.
Peter Taylor

@petertaylor Tôi có đi quá xa không? Tôi có nên trở lại ban đầu của tôi?
PhiNotPi

2
Đây là một trang web nổi tiếng với các luật sư quy tắc - nó hoàn toàn công bằng. Nhưng tôi đi đến kết luận rằng cơ chế trao đổi ngăn xếp có thể không phải là cơ chế tốt nhất cho các cuộc thi vua.
Peter Taylor

Tôi cũng đã đi đến kết luận đó. Chúng ta cần tạo ra một phương pháp ẩn các bot khỏi tầm nhìn trong các cuộc thi trong tương lai. Đối với tất cả những gì tôi biết, có ai đó đang chuyển sang chống lại bot của tôi ngay bây giờ.
PhiNotPi

Lol, đây là ý tưởng của tôi: P. Vì bạn đã thực hiện và tôi cảm thấy lười biếng, tôi sẽ cho phép bạn có :) Lưu ý rằng loại mục duy nhất mà điều này không thể dễ dàng đánh bại là những mục thực hiện ngẫu nhiên
mellamokb

8

Đầu bếp

luôn luôn đặt cược 1 bây giờ là một chiến lược thua , điều rõ ràng cần làm là luôn luôn đặt cược 2 thay thế. Vì vậy, hãy để tôi làm điều đó. Để làm cho mục này nhàm chán hơn một chút thú vị hơn, tôi quyết định viết nó trong 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.

Như một phần thưởng, chương trình thực sự ít nhiều hoạt động như một công thức thực tế - nếu tầm thường -, ngay cả khi nó đọc kiểu như thể người viết có một chút, ừm, nướng. Ngữ pháp đầu bếp dường như làm cho nó khá khó để viết bất cứ điều gì liên quan đến một thứ gì đó phức tạp hơn là trộn các thứ vào một cái bát và nướng nó và vẫn hoạt động như một chương trình và một công thức, đặc biệt là nếu bất kỳ động từ nào người ta muốn sử dụng thậm chí hơi bất thường (như "chiên" → "chiên").

Chỉnh sửa: Thay đổi công thức từ chiên sang trứng shirred - nhờ Blazer cho gợi ý! Thời gian nấu và nhiệt độ chỉ nên được xem là tư vấn; Bản thân tôi chưa thử công thức, vì vậy tôi không thể đảm bảo tính chính xác của chúng.


Tôi nghĩ kết quả này 1: xem nhận xét của tôi tại codegolf.stackexchange.com/a/4851 .
msh210

Nó xuất ra 2, ít nhất là sử dụng trình thông dịch Acme :: Chef . Vòng lặp cuối cùng chỉ dành cho việc xáo trộn, và để thực khách không phải ăn trứng sống.
Ilmari Karonen

À, đúng rồi, tôi đã bỏ lỡ thực tế là trứng đã có trong món nướng và đó không phải là thứ đã giảm.
msh210

2
Bạn gọi nó shirred eggs, thực sự được thực hiện trong một món nướng và điều đó sẽ làm cho công thức trở thành một công thức nấu ăn hợp lệ thực sự và đúng ngữ pháp. shirr the eggs. shirr the eggs until shirred.kinh khủng vì có giáo dục ẩm thực dưới vành đai của tôi! :)
Blazer

1
thời gian nấu / nhiệt độ có vẻ đúng :). tất nhiên, luôn luôn chỉ sử dụng chúng làm hướng dẫn, vì chính đầu bếp sẽ quyết định liệu có việc gì được thực hiện hay không, chứ không phải thời gian / nhiệt độ!
Blazer

4

Con trăn (2.6)

Vô cùng đơn giản, nhưng tôi vẫn tò mò về cách nó sẽ thực hiện so với các phương pháp khác.

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)

Chỉ cần đường ống trong hồ sơ dự thầu thông qua stdin, ví dụ python testbid.py < bids.txt.

EDIT : đã thay đổi cho 'vòng đầu tiên tất cả số không'

EDIT : đã thay đổi 'số ma thuật' một chút (lần thứ hai)


1
không nên m = random.choice(1,2,2,3,3,3)m = random.choice([1,2,2,3,3,3])?
Blazer

Nó đã ném một lỗi mà Blazer nói nó có thể. Tôi đã đặt trong dấu ngoặc vuông cho lần chạy thử và có vẻ như nó đã hoạt động.
Gareth

@Blazer: có, hoàn toàn (lỗi đánh máy nhỏ về phía tôi). Cảm ơn đã thông báo.
BarsheD

4

Con trăn (áo cộc tay)

Bot này phân tích các vòng trước và ghi lại những con số chiến thắng. Do đó, những con số chiến thắng xuất hiện thường xuyên hơn sẽ có cơ hội được chọn cao hơn. Sau đó, nó sẽ chọn ngẫu nhiên các số từ các số trúng (trừ 1 hoặc 2). thay vào đó, nó sẽ chọn 2 3 nếu là vòng đầu tiên.

Đầu vào được đọc một dòng tại một thời điểm. chỉ cần nhập một dòng trống để dừng chấp nhận đầu vào

Một mẹo nhỏ là chỉ cần dán (nó tự động chấp nhận từng dòng có \ n trong khi dán) và nhấn enter hai lần

Bây giờ bạn có thể chỉ viết lại tập lệnh với tên tệp trong dòng lệnh:

python bidding.py bidding.txt

tập tin sẽ trông như thế này:

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)

chỉnh sửa: được thêm vào or sum(rounds) == 0để bù cho sự thay đổi của vòng đầu tiên gần đây

chỉnh sửa: các vấn đề trong các bình luận đã được sửa, cũng khiến nó có thể nhận đầu vào từ tên tệp và không bao giờ chọn '2' nữa vì cạnh tranh cũng đã loại bỏ điều đó. hoạt động với all-0 là đầu vào bắt đầu hoặc không có dữ liệu nào trong tệp

chỉnh sửa2: quên một phút ()

chỉnh sửa 3: thay đổi đầu vào cho phù hợp với nhu cầu đầu vào của câu hỏi


Gây ra một vấn đề nhỏ với người ghi bàn - Tôi phải nhấn enter để lấy điểm cho mỗi vòng. Không có nhiều vấn đề cho bài kiểm tra vòng 10 của tôi, nhưng có thể là một nỗi đau cho vòng chạy 100 vòng.
Gareth

@Gareth, gói nó trong một tập lệnh bash. echo "$@" | python bidding.pynên làm công việc.
Peter Taylor

Tôi đã thử điều này như Peter đề xuất, nhưng tôi gặp lỗi TypeError: unsupported operand type(s) for +: 'int' and 'list'cho dòng 23. Tôi đang sử dụng Python 2.6.1, đó có phải là vấn đề không? Tôi có cần một phiên bản mới hơn không? Tôi gặp vấn đề tương tự mà không sử dụng tập lệnh bash.
Gareth

@Gareth nó có giúp ích gì không nếu tôi thực hiện nó để đầu vào được chuyển từ sys.argv [1] với tên tệp?
Blazer

@Blazer Tôi không chắc đó là vấn đề. Tôi đang tự gọi chương trình từ dòng lệnh bằng cách sử dụng lời mời ví dụ của bạn và nhận được lỗi tôi đã đưa ra ở trên. Có thứ gì đó trong đó không tương thích với Python 2.6.1 không?
Gareth

3

Schwarzenbeck (Scala)

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

Schwarzenbeck không cần phải ghi bàn. Anh ấy là người dọn dẹp cho Beckenbauer, sẽ sớm ra mắt. :)

Để sử dụng nó, bạn cần một trình biên dịch và biên dịch nó

scalac Schwarzenbeck.scala 

Sau đó, bạn có thể chạy nó:

scala Schwarzenbeck 'your ar-
gu-
ment' 

Chỉnh sửa: Điều chỉnh thêm.


1
Cho rằng Schwarzenbeck không được ghi bàn, tôi nói rằng nó hoàn toàn thất bại :-)
celtschk

Vâng, tôi đã có một vấn đề nan giải: Tôi đã tạo ra một dòng gồm 3 cầu thủ và dự kiến ​​Müller sẽ ghi được nhiều điểm nhất, nhưng từ vị trí chiến lược, Schwarzenbeck đã đánh dấu tuyến phòng thủ cuối cùng. Siêu nhân bóng đá thất bại, vì hàng phòng ngự của tôi đã ghi bàn thắng. :)
người dùng không xác định

3

Chiến lược gia (Ruby)

Thực hiện hàng trăm chiến lược đơn giản: cho mỗi vòng, chọn ra một chiến thắng sẽ giành chiến thắng trong các vòng trước:

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]

Tôi không chắc chắn mình đã có định dạng đầu vào đúng - Tôi không chắc chắn cách tạo đối số dòng lệnh nhiều dòng để kiểm tra nó trên windows. (Phương pháp này dường như hoạt động trên IDEone.)


Tôi không thể kiểm tra nó ngay bây giờ, tôi đang làm việc và sẽ không ở nhà cho đến sau 9h30 (GMT). Câu hỏi SO này có giúp được với các đối số nhiều dòng không?
Gareth

Chỉ cần thử nghiệm điều này và nó cho tôi một lỗi - 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). Tôi sẽ ngừng xem xét các mục mới sau 11 giờ tối, nhưng tôi sẽ trì hoãn việc chấm điểm một chút để cho bạn thời gian xem xét lỗi nếu bạn muốn.
Gareth

Được rồi, tôi nghĩ vấn đề là bạn đã có ARGFthay vì ARGV. Sau khi thực hiện thay đổi, chương trình đoán 1mỗi lần. Bất kỳ ý tưởng những gì tôi có thể làm để sửa chữa nó?
Gareth

Bạn có thể thêm dòng này lên trên cùng và cho tôi biết nó in gì khi đưa nó vào đầu vào vòng 2 (2 dòng dữ liệu): p ARGV.map{|l|l};exit (Không có câu trả lời SO nào cho câu hỏi bạn tham khảo hoặc các câu hỏi tương tự có thể cung cấp cho tôi đầu vào dự kiến)
AShelly

Nó in ra ["1 2\n3 4\n5 6\n1 2"]cho đầu vào thử nghiệm trong câu hỏi.
Gareth

2

Perl

Tôi hình dung rằng tôi cũng có thể bước vào điều không thể tránh khỏi. Sắp có nhiều mục nghiêm trọng Như một phần thưởng, mục này sẽ không bao giờ thua trong cuộc thi một đối một.

print 1

không chiến thắng mọi cuộc thi. trong một đối một với một người khác tự tin, nó sẽ ràng buộc
Blazer

Không! Tôi không thể tin rằng tôi đã quên trường hợp đó! Tôi sẽ sửa nó.
PhiNotPi

Một trong những kết luận của tôi khi tôi bắt đầu thiết kế mục nhập của mình là mỗi bot nên gửi ít nhất 1 / n thời gian, để chia sẻ công bằng của họ trong việc ngăn chặn những người tự tin bỏ đi với nó.
Peter Taylor

@Peter: Đừng lo lắng, tôi đã quan tâm đến điều đó . :)
Ilmari Karonen

2

JavaScript (node.js)

Đếm những gì phổ biến nhất vòng trước và trả giá ít hơn một lần, bao gồm 20 và đấu giá 3 trên vòng đầu tiên.

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

Cách gọi:

node script.js 'the argument'

Nhìn vào kết quả của lần chạy thử gần đây nhất, điều này không hoạt động như tài liệu. Bất cứ ý tưởng tại sao không?
Peter Taylor

1
@PeterTaylor Tôi tự hỏi nếu đó là forvòng lặp đầu tiên ? Nên if(i in numbers)được if(matches[i] in numbers)làm bạn nghĩ?
Gareth

@minitech Sau khi chọc vào nó một chút, có vẻ như regex chỉ khớp với một số đầu vào - không biết đủ về javascript hoặc Nodejs để có thể nói tại sao. Ngoài ra, bạn có cần phải phân chia đầu vào trên dòng mới để có được vòng cuối cùng không?
Gareth

@Gareth: Thật vậy. Đã cập nhật, mặc dù nếu nó hoạt động tốt hơn ban đầu thì tôi không phiền :)
Ry-

Thật không may, nó đã gây ra lỗi cho mỗi vòng trừ lần đầu tiên ngay bây giờ: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)

Tuy nhiên, lần này, nó sao chép câu trả lời chính xác mà người chiến thắng cuối cùng có, nếu có. Nó được chỉ định để cả hai cố gắng để giành chiến thắng và chặn các nhà thầu khác. trả giá 5nếu vòng đầu tiên, trả giá một số ngẫu nhiên từ vòng trước nếu không có người chiến thắng

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

Con trăn (Joe)

Điều này không có nghĩa là được thiết kế để giành chiến thắng, nhưng dù sao tôi cũng ném nó ra ngoài để thêm chút màu sắc cho đám đông :) Nó trả giá trung bình của vòng cuối cùng (Average Joe). Được gọi giống như câu trả lời ban đầu của tôi (mà bây giờ tôi sẽ đặt tên vì có vẻ như đó là những gì tất cả những đứa trẻ tuyệt vời đang làm, và nó giúp phân biệt hai điều này). nếu bắt đầu vòng, nó trả giá 10.

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

chỉnh sửa: thay đổi phương thức nhập liệu cho phù hợp với phương thức nhập liệu của câu hỏi


2

Python (TotalBots)

Tôi nghĩ cái này sẽ là cái cuối cùng của tôi, nhưng chúng ta sẽ thấy. Cần có lợi thế để biết có bao nhiêu bot bằng cách xuất ra số lượng bot cạnh tranh, vì vậy nếu có 17 bot (số bot hiện tại, cộng với bot này), nó sẽ xuất ra17

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

2

Perl (Thanh tra y tế)

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

Tôi cá là bạn có thể đoán nó làm gì.


2

C ++ (Đoán có giáo dục)

Tôi đã nghĩ rằng tôi đã bỏ lỡ thời hạn, nhưng nhờ phần mở rộng mà tôi vẫn có thể thêm mục nhập của mình. Chương trình này biên dịch với g ++. Chương trình cố gắng đoán số liệu thống kê của các mục khác và để chọn mục nhỏ nhất không có khả năng được chọn bởi bất kỳ mục nào khác.

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

Xem "Bob" để biết cách gọi.


Đó là một hướng dẫn rất đệ quy cho việc gọi ;-)
Gareth

Thực sự có một chuỗi logic được đưa vào: Alice mô tả cách cô ấy nhận đầu vào. Eve đề cập rằng cô ấy nhận đầu vào giống như Alice. Eve cũng đề cập rằng cô ấy nhận đầu vào giống như Bob. Do đó, Bob có định dạng đầu vào giống như Alice, được mô tả.
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"}
}

Có đầu vào tương tự như các bot khác của tôi.

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

2

Perl (đêm giao thừa)

Tôi hoàn toàn làm lại mục này để giúp mở đường cho các bot khác của tôi.

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

Có một định dạng đầu vào: giống như "Bob" và "Alice".


1

Brainfuck

Để trích dẫn từ thử thách:

"Bạn có thể nhập bao nhiêu bot tùy thích, vì vậy nếu có ai vào bot chỉ đoán 1, bạn có thể nhập một bot khác giống như vậy để khiến nó vô dụng."

Chà, vì PhiNotPi đã nhập một cái , hãy để tôi nhập cái khác. Để khác biệt, tôi sẽ làm điều đó trong Brainfuck:

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

Tất nhiên, bây giờ cá cược 1 không còn là một chiến lược khả thi, điều hiển nhiên cần làm bây giờ là đặt cược 2 thay vào đó ...

Chỉnh sửa: Chia câu trả lời thành hai cho mỗi bình luận, viết lại cả hai chương trình bằng các ngôn ngữ thú vị hơn.


Đầu tiên, một mục nhập cho mỗi câu trả lời xin vui lòng. Thứ hai, tôi biết rằng ai đó có thể đăng 100 câu trả lời mỗi lần in một trong các chữ số từ 1 đến 100 để đảm bảo không bị thua - tương tự ai đó có thể thực hiện chính xác cùng một nghĩa mà không ai sẽ thắng. Trong một trận bóng đá (bóng đá), tất cả 11 cầu thủ có thể đứng trên vạch đích để đảm bảo rằng đội kia không ghi bàn. Nó không bao giờ thường xảy ra theo cách đó bởi vì nó sẽ là một trò chơi nếu họ làm điều đó?
Gareth

Thứ ba, sự phản đối này thực sự đã được nêu ra trong hộp cát - sau tất cả đó là mục đích của nó.
Gareth

@Gareth: OK, tôi đã chia câu trả lời thành hai. Đối với tính hợp lý của các mục, bản thân bạn đề nghị rằng, nếu bất kỳ ai gửi "tự tin", người khác có thể làm điều tương tự để chống lại nó. Tại thời điểm đó, tất nhiên, việc gửi "twosautident" có ý nghĩa tương tự như việc gửi "thông tin cá nhân" đã làm ngay từ đầu, vì vậy ...
Ilmari Karonen

1
Điều thú vị về điều này là bây giờ tôi không thể xóa mục nhập tự tin của mình mà không cho phép mục này giành chiến thắng.
PhiNotPi

1
@Peter: Tại sao bạn nghĩ như vậy? Cho rằng cả hai chương trình PhiNotPi mỏ và đang trong cuộc đua, không có lý do cho bất cứ ai khác để nộp một chương trình mà bao giờ cược 1 (nếu họ muốn chương trình đó để giành chiến thắng, đó là).
Ilmari Karonen

1

Mueller (Scala)

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

Nếu bạn biết Schwarzenbeck và Beckenbauer, bạn chắc chắn mong đợi Mueller. Anh ta đây rồi. Anh ta sẽ được hưởng lợi nhiều từ Beckenbauer và Schwarzenbeck và được cho là sẽ giành chiến thắng.

Chi tiết về chạy và biên dịch: Xem Schwarzenbeck

Gần hơn với mục tiêu, bây giờ.


1

Beckenbauer (Scala)

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

Với sự giúp đỡ của Schwarzenbeck, Beckenbauer có nhiệm vụ ghi một số bàn thắng. Không có Schwarzenbeck, anh chẳng là gì cả.

Chi tiết về chạy và biên dịch: Xem [Schwarzenbeck] [1]

Chỉnh sửa: Chơi sâu hơn trong phòng bây giờ, quá.


1

Tập lệnh hàng loạt

echo 5

Bài dự thi của tôi, đưa ra 5 câu trả lời mỗi lần ;-)


1

Tám giờ

echo 8

Một câu trả lời đơn giản khác, đưa ra 8 lần mỗi lần.


1

Fives Hủy (PHP)

Hủy bỏ giải pháp "luôn luôn 5" của mellamokb.

5

1

Eights Hủy (PHP)

Hủy bỏ giải pháp "luôn luôn 8" của mellamokb. Xin lỗi, mellamokb!

8

Ở đây chúng tôi đi một lần nữa, cạnh tranh: P
mellamokb

1

Python 2.7 - Copycat2

Sao chép người chiến thắng vòng thứ hai cuối cùng. Ồ không! mặt khác đầu ra 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

Kịch bản Shell (Suy nghĩ sâu sắc)

OK, để tôi có cơ hội thứ hai, đây là một mục khác, lần này là một tập lệnh shell (nên hoạt động với bất kỳ shell nào). Điều này luôn đưa ra câu trả lời cho câu hỏi về cuộc sống, vũ trụ và mọi thứ.

echo 42

Trên thực tế thuật toán này không hoàn toàn chính xác vì tôi đã bỏ qua sự chậm trễ 7,5 triệu năm. :-)


Quá muộn cho buổi kiểm tra tối nay, xin lỗi, nhưng tôi sẽ làm việc khác vào buổi sáng.
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);
}

Tôi nghĩ rằng điều này đi qua các bit ngẫu nhiên quá nhanh để sử dụng /dev/random , tuy nhiên tôi rất thích. Nếu bất cứ ai muốn kiểm tra nó trên Windows, bạn sẽ phải tự chuyển nó, vì tôi không có quyền truy cập vào hộp Windows có trình biên dịch C.

Cơ sở lý luận

Tôi không muốn giải thích logic đằng sau điều này trước khi giải đấu kết thúc, nhưng bây giờ người chiến thắng đã được công bố, tôi nghĩ đã đến lúc.

Theo nguyên tắc hố bồ câu (còn gọi là nguyên tắc Dirichlet, do đó là tên của bot), nếu có N bot cạnh tranh thì sẽ có một số w trong [1..1 + N / 2] có thể thắng hoặc sẽ thắng nếu đã chọn. Do đó, tôi kết luận rằng chiến lược tối ưu sẽ không chọn các số lớn hơn 1+ N / 2. Nhưng nếu N chẵn, chọn 1+ N / 2 sẽ tạo ra một khe thắng nhỏ hơn. Do đó, các vị trí đáng chọn là [1 .. ( N +1) / 2].

Điều đó để lại câu hỏi làm thế nào để chọn một vị trí. Đối với một số lượng nhỏ bot tôi đã xác minh rằng có trạng thái cân bằng Nash khi mỗi bot chọn thống nhất giữa các ứng cử viên và tôi hoàn toàn nghi ngờ rằng điều này sẽ tiếp tục đúng.

Sự sai lệch nhỏ trong chiến lược của bot này so với lý thuyết đơn giản là siêu hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.