การเสนอราคาประมูลต่ำสุดที่ไม่ซ้ำใคร


22

ขอบคุณสำหรับการเข้าร่วมทั้งหมดเวลาที่กำหนดได้ผ่านไปแล้วและคะแนนสุดท้ายอยู่ท้ายคำถาม
ขอแสดงความยินดีกับPhiNotPiในชัยชนะที่ครอบคลุมอย่างเป็นธรรม

นี่คือท้าทายจุดมุ่งหมายในการที่จะสร้างโปรแกรมที่ชนะบ่อยกว่าใด ๆ ของฝ่ายตรงข้ามในการประมูลเสนอราคาต่ำสุดที่ไม่ซ้ำกัน

อินพุต

เมื่อป้อนโปรแกรมจะได้รับการเสนอราคารอบก่อนหน้าทั้งหมดหนึ่งรอบต่อบรรทัดการเสนอราคาทั้งหมดคั่นด้วยช่องว่างดังนี้:

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

แต่ละคอลัมน์ของอินพุตแสดงถึงการเสนอราคาของหนึ่งบ็อต คอลัมน์แรกคือการเสนอราคาของโปรแกรมที่ได้รับขณะที่ส่วนที่เหลืออยู่ในลำดับที่สร้างแบบสุ่ม ขอบคุณhammarและPeter Taylorสำหรับการป้อนข้อมูลของพวกเขา

อินพุตมีไว้เป็นอาร์กิวเมนต์บรรทัดเดียวและบรรทัดเดียว (หลายบรรทัด) สำหรับโปรแกรมของคุณ:

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

ซึ่งหมายความว่าโปรแกรมของคุณจะต้องรันได้จากบรรทัดคำสั่ง โปรดยกตัวอย่างการเรียกร้องเป็นส่วนหนึ่งของคำตอบของคุณ

ในรอบแรกเป็นเพียงวิธีการบอกให้คุณรู้ว่ามีกี่บอทที่คุณสู้อยู่อินพุตจะเป็นหนึ่งบรรทัด0ต่อบ็อตแต่ละอัน

เอาท์พุต

โปรแกรมของคุณควรแสดงผลการเสนอราคาเป็นจำนวนเต็มในช่วง 1 ถึง 100 (รวม)

โปรแกรมแต้ม

นี่คือโปรแกรมการให้คะแนนของฉัน - ยินดีรับคำแนะนำใด ๆ สำหรับการเพิ่มเติมปรับปรุงหรือแก้ไขข้อผิดพลาด

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

ทดสอบผู้เล่น

มีความมั่นใจเสมอเสนอราคา 1

#include <stdio.h>

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

Random100 Bids ที่สุ่มตลอดช่วงทั้งหมด

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

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

Random20 Bids ที่สุ่มระหว่าง 1 ถึง 20

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

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

Random5 Bids ที่สุ่มระหว่าง 1 ถึง 5

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

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

ตัวอย่างการใช้งาน:

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

ผู้เล่นเหล่านี้มีวัตถุประสงค์เพื่อทดสอบเท่านั้น พวกเขาจะไม่รวมอยู่ในการแข่งขัน คุณสามารถป้อนบอทได้มากเท่าที่คุณต้องการดังนั้นหากใครก็ตามเข้าสู่บ็อตที่เดาได้1คุณสามารถเข้าสู่บ็อตอื่นที่ไม่เหมือนกันเพื่อทำให้มันไร้ประโยชน์

ผู้ชนะ

บอทที่ชนะในแต่ละรอบคืออันที่ให้ราคาเสนอที่ไม่ซ้ำกันต่ำที่สุด ดังนั้นในรอบที่มีการเสนอราคาต่อไปนี้: 1 1 3 5 2 3 6 3 2 8 7ผู้ชนะจะเป็นบอทที่เสนอราคา5เพราะ1s, 2s และ3s ไม่ซ้ำกัน

ผู้ชนะการแข่งขันจะเป็นโปรแกรมที่ชนะมากที่สุดหลังจากรอบ 100 ในกรณีที่มีการเสมอกันการประมูลที่ชนะทั้งหมดจะถูกใช้เป็นเครื่องเบรกและในกรณีที่เสมอ ปัจจัยการให้คะแนนเหล่านี้จะถูกส่งออกทั้งหมดโดยโปรแกรมการให้คะแนน

ฉันจะเรียกใช้โปรแกรมการให้คะแนนในโปรแกรมการทำงานทั้งหมดที่เข้าร่วม 2 สัปดาห์นับจากวันนี้ ( 18 กุมภาพันธ์ ขยายเวลา 23.00 น. (GMT) ในวันที่ 20 กุมภาพันธ์ ) ฉันจะโหวตผลงานทั้งหมดและยอมรับผู้ชนะในการทำคะแนน

การให้คะแนนครั้งสุดท้าย

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
อืม ... ด้วยกติกาที่เขียนตามที่เป็นอยู่ข้าสามารถทำลายเกมได้โดยการเข้าร่วม 100 โปรแกรมที่แต่ละคนเสนอราคาตามจำนวนที่กำหนดเสมอ
Ilmari Karonen

1
คุณสามารถพูดได้สองประโยคว่าบอทที่ชนะนั้นถูกเลือกอย่างไร? ฉันไม่เข้าใจ
ผู้ใช้ไม่ทราบ

@IlmariKaronen เป็นเรื่องจริงคุณทำได้ แต่ฉันเชื่อมั่นว่าผู้คนจะไม่ทำอย่างนั้น ฉันสามารถ จำกัด จำนวนรายการต่อคนที่ฉันคิดว่า แต่ฉันคิดว่าฉันจะหันไปที่ว่าหากมีผู้ทำลายใด ๆ เกิดขึ้น
Gareth

@userunknown ฉันพยายามชี้แจงว่าการประมูลรอบทำงานอย่างไร
Gareth

1
@PhiNotPi: อย่ารู้สึกผิด คุณชนะภายในกฎ
Steven Rumbalski

คำตอบ:


9

Perl

ฉันพยายามหนักขึ้นเล็กน้อยในครั้งนี้ มันเป็นกลยุทธ์ที่ซับซ้อนอย่างง่าย ๆแต่ฉันได้กำหนดกรอบสำหรับการขยายตัว

แก้ไข: ทำซ้ำให้เสร็จสมบูรณ์ สิ่งนี้อยู่ในนั้นเพื่อชัยชนะ

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

โปรแกรมนี้รับอินพุตหนึ่งบรรทัดต่อครั้งตามด้วยบรรทัดใหม่สองบรรทัด:

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

ตกลงการดำเนินการนี้จะใช้เวลา metagaming ถึงมากสุด
ปีเตอร์เทย์เลอร์

@petertaylor ฉันออกไปไกลเกินไปหรือไม่ ฉันควรเปลี่ยนกลับเป็นต้นฉบับหรือไม่
PhiNotPi

2
นี่คือเว็บไซต์ที่มีชื่อเสียงสำหรับนักกฎหมายกฎ - มันยุติธรรมอย่างสมบูรณ์ แต่ฉันมาถึงข้อสรุปว่ากลไกการแลกเปลี่ยนสแต็คอาจไม่ใช่สิ่งที่ดีที่สุดสำหรับการแข่งขันที่ยอดเยี่ยม
Peter Taylor

ฉันก็มาถึงข้อสรุปนั้น เราจำเป็นต้องสร้างวิธีการซ่อนบ็อตจากมุมมองในการแข่งขันในอนาคต สำหรับทุกอย่างที่ฉันรู้มีคนกำลัง metagaming ต่อต้านบอทของฉันตอนนี้
PhiNotPi

ฮ่า ๆ นี่เป็นความคิดของฉัน: P เนื่องจากคุณได้ติดตั้งแล้วและฉันรู้สึกขี้เกียจฉันจะให้คุณมี :) โปรดทราบว่ารายการเดียวที่ไม่สามารถเอาชนะได้ง่ายคือรายการที่ใช้การสุ่ม
mellamokb

8

พ่อครัว

เนื่องจากการเดิมพันเสมอ 1ตอนนี้เป็นกลยุทธ์ที่แพ้สิ่งที่ต้องทำคือเดิมพัน2เสมอ ขอผมทำอย่างนั้นนะ ในการทำให้สิ่งนี้น่าสนใจยิ่งขึ้นไปอีกฉันตัดสินใจเขียนใน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.

ในฐานะที่เป็นโบนัสโปรแกรมจริง ๆ จะทำงานมากกว่าหรือน้อยกว่าจริง - ถ้าเป็นเรื่องไม่สำคัญ - แม้ว่ามันจะเป็นประเภทการอ่านราวกับว่านักเขียนเป็นบิตอืมอบ ไวยากรณ์ของพ่อครัวดูเหมือนจะยากที่จะเขียนสิ่งที่เกี่ยวข้องกับสิ่งที่ซับซ้อนกว่าการผสมสิ่งของในชามแล้วอบและยังคงใช้งานได้ทั้งเป็นโปรแกรมและเป็นสูตรโดยเฉพาะถ้าคำกริยาที่ต้องการใช้ แม้จะผิดปกติเล็กน้อย (เช่น "fry" → "ทอด")

แก้ไข:เปลี่ยนสูตรจากทอดshirredไข่ - ขอบคุณ Blazer สำหรับคำแนะนำ! เวลาและอุณหภูมิในการประกอบอาหารควรได้รับการพิจารณาเป็นคำแนะนำเท่านั้น ฉันยังไม่ได้ลองสูตรด้วยตัวเองดังนั้นฉันจึงไม่สามารถรับรองความถูกต้องของพวกเขาได้


ผมคิดว่าผลนี้ 1: เห็นความคิดเห็นของฉันที่codegolf.stackexchange.com/a/4851
msh210

มันส่งออก 2 อย่างน้อยใช้ล่ามAcme :: Chef วงสุดท้ายนั้นมีไว้เพื่อทำให้งงงวยและเพื่อให้นักทานไม่ต้องกินไข่ดิบ
Ilmari Karonen

ใช่แล้วฉันพลาดความจริงที่ว่าไข่อยู่ในจานอบแล้วและนั่นไม่ใช่สิ่งที่ลดลง
msh210

2
คุณเรียกมันว่าshirred eggsซึ่งทำจริงในจานอบและนั่นจะทำให้สูตรเป็นสูตรการทำอาหารที่ถูกต้องจริงและถูกต้องตามหลักไวยากรณ์ shirr the eggs. shirr the eggs until shirred.กลัวที่จะมีการศึกษาการทำอาหารภายใต้เข็มขัดของฉัน! :)
Blazer

1
เวลา / อุณหภูมิในการปรุงดูเหมือนจะถูก :) แน่นอนว่าให้ใช้คำแนะนำเหล่านี้เป็นแนวทางเท่านั้นเพราะเป็นพ่อครัวที่ตัดสินว่ามีบางสิ่งที่ทำเสร็จหรือไม่ไม่ใช่เวลา / อุณหภูมิ!
Blazer

4

Python (2.6)

เรียบง่ายมาก แต่ก็ยังสงสัยว่ามันจะทำงานได้อย่างไรเมื่อเทียบกับวิธีอื่น ๆ

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)

ท่อเพียงในการเสนอราคาผ่านทาง stdin, python testbid.py < bids.txtเช่น

แก้ไข : เปลี่ยนเป็น 'รอบแรกทุกศูนย์'

แก้ไข : เปลี่ยน 'จำนวนเวทมนตร์' เล็กน้อย (ครั้งที่สอง)


1
ไม่ควรm = random.choice(1,2,2,3,3,3)จะเป็นm = random.choice([1,2,2,3,3,3])?
Blazer

มันโยนข้อผิดพลาดที่ Blazer พูดได้ ฉันใส่ในวงเล็บเหลี่ยมสำหรับการทดสอบการทำงานและดูเหมือนว่าจะทำงานได้
Gareth

@ Blazer: ใช่แน่นอน (พิมพ์ผิดเล็ก ๆ ในส่วนของฉัน) ขอขอบคุณที่แจ้ง
ChristopheD

4

Python (เสื้อเบลเซอร์)

บอทนี้ทำการวิเคราะห์รอบก่อนหน้าและบันทึกหมายเลขที่ชนะ หมายเลขที่ชนะที่ปรากฏบ่อยขึ้นจะทำให้มีโอกาสในการเลือกมากขึ้น จากนั้นจะสุ่มเลือกหมายเลขจากหมายเลขที่ชนะ (นอกเหนือจาก 1 หรือ 2) มันจะเลือก2 3 แทนถ้ามันเป็นรอบแรก

อินพุตถูกอ่านทีละหนึ่งบรรทัด เพียงป้อนบรรทัดว่างเพื่อหยุดรับอินพุต

เคล็ดลับคือการวาง (รับโดยอัตโนมัติแต่ละบรรทัดด้วย \ n ภายในการวาง) และกด Enter สองครั้ง

ตอนนี้คุณสามารถรันสคริปต์ด้วยชื่อไฟล์ในบรรทัดคำสั่ง:

python bidding.py bidding.txt

ไฟล์ควรมีลักษณะเช่นนี้:

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)

แก้ไข: เพิ่มor sum(rounds) == 0เพื่อชดเชยการเปลี่ยนแปลงรอบแรกรอบทั้งหมดศูนย์

แก้ไข: ปัญหาในการแสดงความคิดเห็นได้รับการแก้ไขทำให้สามารถรับข้อมูลจากชื่อไฟล์และไม่เคยเลือก '2' อีกต่อไปเนื่องจากการแข่งขันได้กำจัดสิ่งนั้นออกไปเช่นกัน ทำงานร่วมกับทั้ง -0 เป็นอินพุตเริ่มต้นหรือไม่มีข้อมูลในไฟล์เลย

แก้ไข 2: ลืมนาที ()

edit3: เปลี่ยนอินพุตให้เหมาะกับความต้องการของคำถาม


ทำให้เกิดปัญหาเล็ก ๆ กับผู้บันทึกคะแนน - ฉันต้องกด Enter เพื่อรับคะแนนในแต่ละรอบ มีปัญหาไม่มากสำหรับการทดสอบรอบ 10 ของฉัน แต่อาจเป็นปัญหาสำหรับการวิ่ง 100 รอบ
Gareth

@ Gareth ห่อมันด้วยสคริปต์ทุบตี echo "$@" | python bidding.pyควรทำงาน
Peter Taylor

ฉันได้ลองสิ่งนี้ตามที่ Peter แนะนำ แต่ฉันได้รับข้อผิดพลาดTypeError: unsupported operand type(s) for +: 'int' and 'list'สำหรับบรรทัดที่ 23 ฉันใช้ Python 2.6.1 นั่นเป็นปัญหาหรือไม่ ฉันต้องการเวอร์ชันที่ใหม่กว่านี้ได้อย่างไร ฉันพบปัญหาเดียวกันโดยไม่ใช้สคริปต์ทุบตี
Gareth

@ กาเร็ ธ จะช่วยได้ไหมถ้าฉันสร้างมันขึ้นมาดังนั้นข้อมูลจะถูกส่งจาก sys.argv [1] ด้วยชื่อไฟล์หรือไม่?
Blazer

@ เบลเซอร์ฉันไม่แน่ใจว่านั่นเป็นปัญหา ฉันกำลังเรียกโปรแกรมจากบรรทัดคำสั่งด้วยตนเองโดยใช้ตัวอย่างการเรียกใช้ของคุณและรับข้อผิดพลาดที่ฉันให้ไว้ข้างต้น มีบางอย่างในที่นั่นที่เข้ากันไม่ได้กับ Python 2.6.1?
Gareth

3

Schwarzenbeck (Scala)

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

ชวาร์เซนเบ็คไม่ควรทำประตู เขาคือการทำความสะอาดของ Beckenbauer ซึ่งจะตามมาในไม่ช้า :)

ในการใช้งานคุณต้องมีคอมไพเลอร์และเรียบเรียง

scalac Schwarzenbeck.scala 

จากนั้นคุณสามารถเรียกใช้:

scala Schwarzenbeck 'your ar-
gu-
ment' 

แก้ไข: การปรับเพิ่มเติม


1
ระบุว่า Schwarzenbeck ไม่ควรจะทำประตูที่ผมว่ามันล้มเหลวอย่างสิ้นเชิง :-)
celtschk

ใช่ฉันมีภาวะที่กลืนไม่เข้าคายไม่ออก: ฉันสร้างผู้เล่น 3 คนและคาดว่าMüllerจะทำคะแนนให้ได้มากที่สุด แต่จากตำแหน่งเชิงกลยุทธ์ชวาร์เซนเบคเป็นแนวป้องกันที่ดีที่สุด Metapher ฟุตบอลล้มเหลวเนื่องจากแนวป้องกันของฉันทำประตูได้ :)
ผู้ใช้ที่ไม่รู้จัก

3

นักยุทธศาสตร์ (ทับทิม)

ใช้กลยุทธ์ง่าย ๆ หลายร้อย: ในแต่ละรอบเลือกหนึ่งนัดซึ่งจะชนะมากที่สุดในรอบก่อนหน้า:

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]

ฉันไม่แน่ใจว่าฉันมีรูปแบบอินพุตที่ถูกต้อง - ฉันไม่แน่ใจว่าจะสร้างอาร์กิวเมนต์บรรทัดคำสั่งแบบหลายบรรทัดสำหรับทดสอบบน windows ได้อย่างไร (วิธีนี้ดูเหมือนว่าจะทำงานบน IDEone)


ฉันไม่สามารถทดสอบได้ตอนนี้ฉันทำงานอยู่และจะไม่กลับบ้านจนกว่าจะหลัง 9.30 น. (GMT) คำถาม SO นี้ช่วยในเรื่องอาร์กิวเมนต์หลายบรรทัดหรือไม่?
Gareth

เพิ่งผ่านการทดสอบนี้และจะให้ฉันข้อผิดพลาด 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)- ฉันจะหยุดพิจารณารายการใหม่หลัง 23.00 น. แต่ฉันจะชะลอการให้คะแนนเล็กน้อยเพื่อให้เวลาคุณดูข้อผิดพลาดหากคุณต้องการ
Gareth

โอเคฉันคิดว่าปัญหาคือคุณมีARGFแทนที่จะเป็น ARGV หลังจากทำการเปลี่ยนแปลงนั้นโปรแกรมจะเดา1ทุกครั้ง ความคิดเห็นใดที่ฉันสามารถทำได้เพื่อแก้ไข
Gareth

คุณสามารถเพิ่มบรรทัดนี้ไปที่ด้านบนและบอกสิ่งที่มันพิมพ์เมื่อให้มันรอบที่ 2 (2 บรรทัดของข้อมูล): p ARGV.map{|l|l};exit (ไม่มีคำตอบดังนั้นสำหรับคำถามที่คุณอ้างอิงหรือคนที่คล้ายกันดูเหมือนจะให้ฉันป้อนที่คาดหวัง)
AShelly

มันพิมพ์ออกมา["1 2\n3 4\n5 6\n1 2"]สำหรับอินพุตทดสอบในคำถาม
Gareth

2

Perl

ฉันคิดว่าฉันอาจป้อนสิ่งที่หลีกเลี่ยงไม่ได้เช่นกัน รายการที่รุนแรงมากขึ้นในเร็ว ๆ นี้ เป็นโบนัสรายการนี้จะไม่แพ้ในการแข่งขันแบบตัวต่อตัว

print 1

ไม่ชนะทุกการแข่งขัน ในแบบตัวต่อตัวกับคนอื่นมันจะผูก
Blazer

No! ฉันไม่อยากจะเชื่อว่าฉันลืมเรื่องนั้นไป! ฉันจะแก้ไขมัน
PhiNotPi

หนึ่งในข้อสรุปของฉันเมื่อฉันเริ่มออกแบบรายการของฉันคือแต่ละบอทควรส่ง 1 อย่างน้อย 1 / n ของเวลาเพื่อทำส่วนแบ่งที่ยุติธรรมของพวกเขาในการป้องกันไม่ให้คนออกจากกันด้วยความมั่นใจ
Peter Taylor

@ Peter: ไม่ต้องกังวลฉันดูแลมัน :)
Ilmari Karonen

2

JavaScript (node.js)

นับสิ่งที่ได้รับความนิยมมากที่สุดในรอบสุดท้ายและเสนอราคาต่ำกว่าหนึ่งรอบและเท่ากับ 20 และเสนอราคา 3 ในรอบแรก

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

วิธีการเรียกใช้:

node script.js 'the argument'

ดูผลลัพธ์ของการทดสอบล่าสุดซึ่งไม่ได้มีการบันทึกไว้ ความคิดใดทำไม?
Peter Taylor

1
@ PeterTaylor ฉันสงสัยว่ามันเป็นforวงแรกหรือไม่? ควรif(i in numbers)จะ if(matches[i] in numbers)ทำอย่างไรคุณคิดว่า?
Gareth

@minitech หลังจากนิดหน่อยก็ดูเหมือนว่า regex จะจับคู่เพียงหนึ่งในอินพุต - ไม่รู้จัก javascript หรือ Nodejs เพียงพอที่จะพูดได้ว่าทำไม นอกจากนี้คุณต้องแยกอินพุตในบรรทัดใหม่เพื่อให้ได้รอบสุดท้ายหรือไม่
Gareth

@ กาเร็ ธ : แน่นอน Updated แต่ถ้ามันทำได้ดี แต่เดิมแล้วฉันไม่คิด :)
Ry-

น่าเสียดายที่มันมีข้อผิดพลาดเกิดขึ้นทุกรอบยกเว้นตอนแรก: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)
กาเร็ ธ

2

Python (CopyCat)

อีกครั้งคราวนี้มันคัดลอกคำตอบที่แน่นอนที่ผู้ชนะคนสุดท้ายมีถ้ามี ทั้งสองพยายามที่จะชนะและบล็อกผู้ประมูลรายอื่น การเสนอราคา5หากรอบแรกเสนอราคาแบบสุ่มจากรอบก่อนหน้าหากไม่มีผู้ชนะ

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) เรียกเช่นเดียวกับฉันคำตอบดั้งเดิม (ซึ่งตอนนี้ฉันจะตั้งชื่อเพราะดูเหมือนว่าเป็นสิ่งที่เด็กเจ๋ง ๆ ทุกคนกำลังทำและช่วยแยกความแตกต่างระหว่างสองคนนี้) 10ถ้าเริ่มต้นรอบก็เสนอราคา

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

แก้ไข: เปลี่ยนวิธีการป้อนข้อมูลให้เหมาะสมกับวิธีป้อนข้อมูลของคำถาม


2

Python (จำนวนรวมทั้งหมด)

ฉันคิดว่าอันนี้จะเป็นครั้งสุดท้ายของฉัน แต่เราจะเห็น ต้องใช้ความได้เปรียบในการทราบจำนวนบอทที่มีเพียงแค่แสดงจำนวนบอทที่แข่งขันกันดังนั้นหากมี 17 บอท (จำนวนบอทปัจจุบันรวมทั้งอันนี้) จะส่งออก17

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

2

Perl (สารวัตรสุขภาพ)

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

ฉันเดิมพันคุณสามารถคาดเดาสิ่งที่มันทำ


2

C ++ (เดาการศึกษา)

ฉันคิดว่าฉันจะพลาดวันครบกำหนด แต่ต้องขอบคุณส่วนขยายที่ฉันยังคงสามารถเพิ่มรายการของฉันได้ โปรแกรมนี้คอมไพล์ด้วย g ++ โปรแกรมจะพยายามเดาสถิติของรายการอื่นและเลือกรายการที่เล็กที่สุดที่ไม่น่าจะเลือกโดยผู้อื่น

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

ดู "Bob" สำหรับวิธีการเรียกใช้


นั่นเป็นคำแนะนำแบบเรียกซ้ำสำหรับการขอร้อง ;-)
Gareth

อลิซอธิบายถึงวิธีการป้อนข้อมูลของเธอ อีฟกล่าวว่าเธอรับข้อมูลเช่นเดียวกับอลิซ อีฟยังกล่าวอีกว่าเธอรับข้อมูลเหมือนบ๊อบ ดังนั้น Bob จะใช้รูปแบบอินพุตเดียวกันกับ Alice ซึ่งอธิบายไว้
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"}
}

ใช้อินพุตคล้ายกับบ็อตอื่นของฉัน

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

2

Perl (Eve)

ฉันนำรายการนี้ไปทำใหม่เพื่อช่วยปูทางไปสู่บ็อตอื่นของฉัน

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

ใช้รูปแบบอินพุตหนึ่งเดียว: เหมือนกับ "Bob" และ "Alice"


1

brainfuck

อ้างจากความท้าทาย:

"คุณสามารถป้อนบอทได้มากเท่าที่คุณต้องการดังนั้นหากใครก็ตามเข้าสู่บอทที่เดาได้เพียง1คุณสามารถเข้าสู่บ็อตอื่นที่เหมือนกันเพื่อให้มันไร้ประโยชน์"

ทีนี้, เนื่องจากพี่น๊อตปี้เข้ามาได้หนึ่ง , ขอให้ฉันเข้าไปอีกอัน เพียงเพื่อจะแตกต่างกันฉันจะทำมันใน Brainfuck:

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

แน่นอนว่าตอนนี้การเดิมพัน 1 ไม่ใช่กลยุทธ์ที่เป็นไปได้อีกต่อไปสิ่งที่ต้องทำตอนนี้คือการเดิมพัน 2 แทน ...

แก้ไข:แบ่งคำตอบเป็นสองความคิดเห็นต่อเขียนทั้งสองโปรแกรมเป็นภาษาที่น่าสนใจยิ่งขึ้น


ประการแรกโปรดหนึ่งรายการต่อคำตอบ ประการที่สองฉันรู้ว่าบางคนสามารถโพสต์ได้ 100 คำตอบแต่ละการพิมพ์หนึ่งในตัวเลขตั้งแต่ 1 ถึง 100 เพื่อรับประกันว่าจะไม่สูญเสีย ในเกมฟุตบอล (ฟุตบอล) ผู้เล่นทั้ง 11 คนสามารถยืนอยู่บนเส้นประตูเพื่อรับประกันว่าทีมอื่นจะไม่ได้คะแนน มันไม่เคยเกิดขึ้นแบบนั้นเพราะมันจะเป็นเกมมากถ้าพวกเขาทำมัน?
Gareth

ประการที่สามการคัดค้านนี้ควรได้รับการหยิบยกขึ้นมาในกล่องทรายจริง ๆ - หลังจากทั้งหมดนั่นคือจุดประสงค์ของมัน
Gareth

@ กาเร็ ธ : โอเคฉันได้แบ่งคำตอบออกเป็นสองข้อ สำหรับความสมเหตุสมผลของรายการคุณเองแนะนำว่าถ้าใครต้องส่ง "คนที่มั่นใจ" คนอื่นสามารถทำแบบเดียวกันเพื่อตอบโต้มัน ณ จุดนั้นแน่นอนว่าการส่ง "twosconfident" ทำให้รู้สึกเท่า ๆ กับการส่ง "คนที่มั่นใจ" ได้ในตอนแรกดังนั้น ...
Ilmari Karonen

1
สิ่งที่เรียบร้อยเกี่ยวกับเรื่องนี้คือตอนนี้ฉันไม่สามารถลบรายการที่มั่นใจได้โดยไม่อนุญาตให้รายการนี้ชนะ
PhiNotPi

1
@ Peter: ทำไมคุณคิดอย่างนั้น เนื่องจากว่าทั้งโปรแกรม Mine และโปรแกรมของ PhiNotPi อยู่ในการแข่งขันจึงไม่มีเหตุผลที่คนอื่นจะส่งโปรแกรมที่เคยเดิมพัน 1 (หากพวกเขาต้องการให้โปรแกรมนั้นชนะนั่นคือ)
Ilmari Karonen

1

มูลเลอร์ (สกาลา)

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

หากคุณรู้จัก Schwarzenbeck และ Beckenbauer คุณก็คาดหวังว่า Mueller ที่นี่เขาอยู่ เขาจะได้รับประโยชน์มากมายจาก Beckenbauer และ Schwarzenbeck และคาดว่าจะชนะ

รายละเอียดเกี่ยวกับการวิ่งและการรวบรวม: ดูSchwarzenbeck

ใกล้ชิดกับเป้าหมายตอนนี้


1

Beckenbauer (Scala)

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

ด้วยความช่วยเหลือของ Schwarzenbeck, Beckenbauer ควรทำประตูได้บ้าง หากปราศจากชวาร์เซนเบคเขาก็ไม่มีอะไร

รายละเอียดเกี่ยวกับการวิ่งและการรวบรวม: ดู [Schwarzenbeck] [1]

แก้ไข: เล่นลึกลงไปในห้องตอนนี้ด้วย





1

EightsCancel (PHP)

ยกเลิกการแก้ปัญหา "เสมอ 8" ของ mellamokb ขออภัย mellamokb!

8

ที่นี่เราไปอีกครั้งการแข่งขัน: P
mellamokb

1

Python 2.7 - Copycat2

สำเนาที่สองผู้ชนะรอบสุดท้ายของ ไม่นะ! มิฉะนั้นจะแสดงผล 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

เชลล์สคริปต์ (ความคิดลึก)

ตกลงเพื่อให้ฉันได้รับโอกาสที่สองเล็กน้อยนี่เป็นอีกรายการหนึ่งคราวนี้เชลล์สคริปต์ (ควรทำงานกับเชลล์ใดก็ได้) สิ่งนี้จะให้คำตอบสำหรับคำถามเกี่ยวกับชีวิตจักรวาลและทุกสิ่ง

echo 42

อันที่จริงอัลกอริทึมนี้ไม่ถูกต้องทั้งหมดเพราะฉันละทิ้งความล่าช้า 7.5 ล้านปี :-)


สายเกินไปสำหรับการทดสอบคืนนี้ขอโทษ แต่ฉันจะทำอีกในตอนเช้า
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);
}

ฉันคิดว่ามันต้องใช้บิตสุ่มเร็วเกินไปที่จะใช้ /dev/randomแต่ฉันต้องการ หากใครต้องการทดสอบบน Windows คุณจะต้องทำการพอร์ตด้วยตัวเองเพราะฉันไม่สามารถเข้าถึงกล่อง Windows ด้วยคอมไพเลอร์ C

หลักการและเหตุผล

ฉันไม่ต้องการอธิบายเหตุผลเบื้องหลังนี้ก่อนการแข่งขันสิ้นสุดลง แต่ตอนนี้ผู้ชนะได้รับการประกาศฉันคิดว่าถึงเวลาแล้ว

โดยหลักการของนกพิราบรู (หรือที่รู้จักกันดีในนามของ Dirichlet ดังนั้นชื่อของบอท) หากมีบอทN ที่แข่งขันกันก็จะมีตัวเลขwใน [1..1 + N / 2] ซึ่งชนะหรือจะชนะถ้า เลือก ฉันจึงสรุปว่ากลยุทธ์ที่ดีที่สุดจะไม่เลือกตัวเลขที่มากกว่า 1+ N / 2 แต่ถ้าNยังเท่ากันการเลือก 1+ N / 2 จะสร้างช่องชนะที่เล็กกว่า ดังนั้นช่องที่ควรเลือกคือ [1 .. ( N +1) / 2]

นั่นเป็นคำถามของวิธีการเลือกสล็อต สำหรับบอทจำนวนน้อยฉันตรวจสอบว่ามีความสมดุลของแนชเมื่อแต่ละบอทเลือกอย่างเท่าเทียมกันในหมู่ผู้สมัครและฉันสงสัยอย่างยิ่งว่าสิ่งนี้จะยังคงเป็นจริงต่อไป

การเบี่ยงเบนเล็กน้อยในกลยุทธ์ของบอทนี้จากทฤษฎีหนึ่งคือการวาง metagaming

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.