최저 순 입찰가


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

입력의 각 열은 하나의 봇의 입찰을 나타냅니다. 첫 번째 열은 수신 프로그램의 입찰이며 나머지는 무작위로 생성 된 순서입니다. 그들의 의견에 대해 hammarPeter 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;
}

전체 범위에서 무작위로 임의 100 입찰

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

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

Random20의 임의의 1 내지 20 입찰가

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

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

Random5 임의의 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와3 s가 고유하지 됩니다.

대회의 승자는 100 라운드 이후 가장 많이이기는 프로그램이 될 것입니다. 동점 인 경우 총 낙찰가는 동점자로 사용되며 동점 인 경우 최저 낙찰가는 추가 동점자로 사용됩니다. 이 점수 요소는 모두 점수 프로그램에 의해 출력됩니다.

오늘부터 2 주간 입력 한 모든 작업 프로그램 ( 2 월 20 일 오후 11시 (GMT)까지)에 채점 프로그램을 운영합니다 . 모든 출품작을 찬성하고 내 득점 경기의 승자를 수락합니다.

최종 득점 실행

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

나는 이번에 조금 더 열심히 노력했다. 그것은 정말 간단한 복잡한 전략,하지만 난 확장을위한 프레임 워크를 설정했습니다.

편집 : 다시 실행을 완료하십시오. 이 일은 승리에 있습니다.

    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]

좋아, 이것은 메타 게임을 극도로한다.
피터 테일러

@ petertaylor 내가 너무 멀리 나가는거야? 원본으로 되돌려 야합니까?
PhiNotPi

2
이 사이트는 규칙 변호사들에게 악명 높은 사이트입니다. 완벽하게 공평합니다. 그러나 스택 교환 메커니즘이 왕과의 경쟁에서 최고가 아닐 수도 있다는 결론에 도달했습니다.
피터 테일러

나는 또한 그 결론에 도달했다. 향후 경쟁에서 봇을 보이지 않게 숨기는 방법을 만들어야합니다. 내가 아는 한, 누군가 지금 내 봇과 대결하고 있습니다.
PhiNotPi

롤, 이건 내 생각이야 당신이 이미 구현했고, 게으름을 느끼고 있기 때문에, 나는 당신에게 그것을 드리겠습니다 :) 이것이 쉽게 이길 수없는 유일한 종류는 무작위성을 구현하는 것입니다
mellamokb

8

요리사

때문에 항상 일을 베팅하는 것은 지금이다 지는 전략 , 할 수있는 분명한 것은 항상 내기하는 것입니다 (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.

보너스로,이 프로그램은 작가가 약간 음, 구운 것처럼 보이는 것처럼 보이지만 실제로는 (사소한 경우에) 레시피로 작동합니다. Chef 문법은 그릇에 물건을 섞어 굽는 것보다 복잡한 것을 쓰는 것을 꽤 어렵게 만드는 것 같습니다. 특히 동사 중 하나를 사용하려는 경우 프로그램과 조리법으로 작동합니다. 약간 불규칙합니다 (예 : "튀김"→ "튀김").

편집 : 에 튀김에서 조리법을 변경 주름진 계란 - 감사 재킷에 제안을 위해! 조리 시간과 온도는 단지 자문으로 간주되어야합니다. 나는 실제로 조리법을 실제로 시도하지 않았으므로 정확성을 보증 할 수 없습니다.


나는 이것이 1 출력 이라고 생각 합니다 : codegolf.stackexchange.com/a/4851 에서 내 의견을 보십시오 .
msh210

적어도 Acme :: Chef 인터프리터를 사용하여 2를 출력 합니다. 마지막 고리는 난독 화를 위해 존재하므로 식당은 계란을 날 것으로 먹을 필요가 없습니다.
Ilmari Karonen

아, 맞아요. 계란이 이미 베이킹 접시에 들어 있고 그것이 줄어드는 것이 아니라는 사실을 놓쳤습니다.
msh210

2
당신은 전화를 shirred eggs실제로 베이킹 접시에서 수행하고 그 제조법 실제 유효 요리 레시피와 문법적으로 정확한 할 것이다. shirr the eggs. shirr the eggs until shirred.내 벨트 아래 요리 교육을 받다 니 :)
Blazer

1
요리 시간 / 온도가 옳은 것 같습니다 :). 물론 시간 / 온도 자체가 아닌 무언가가 행해졌는지 여부를 결정하는 요리사이기 때문에 항상 지침으로 만 사용하십시오!
Blazer

4

파이썬 (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.

편집 : '첫 번째 모든 라운드 0'에 대한 변경

편집 : '매직 숫자'를 조금 변경했습니다 (두 번째)


1
하지 말아야 m = random.choice(1,2,2,3,3,3)m = random.choice([1,2,2,3,3,3])?
Blazer

Blazer가 말한 곳에서 오류가 발생했습니다. 테스트 실행을 위해 대괄호를 넣었으며 제대로 작동하는 것으로 보입니다.
Gareth

@ 블레이저 : 예, 절대적으로 (나의 작은 오타). 알려 주셔서 감사합니다.
ChristopheD

4

파이썬 (블레이저)

이 봇은 이전 라운드를 분석하고 승리 한 숫자를 기록합니다. 더 자주 등장하는 숫자는 더 잘 뽑힐 가능성이 높습니다. 그런 다음 무작위로 승리 한 숫자 (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최근 1 차 전체 0의 변화를 보완하기 위해 추가

편집 : 주석의 문제가 수정되어 파일 이름에서 입력을받을 수 있었고 경쟁이 그 점을 제거했기 때문에 더 이상 '2'를 선택하지 않았습니다. 모든 입력을 시작 입력으로 사용하거나 파일에 데이터가 전혀없는 경우

edit2 : 분을 잊었다 ()

edit3 : 질문의 입력 요구에 맞게 입력 변경


득점 선수에게 작은 문제를 일으 킵니다-각 라운드의 점수를 얻으려면 enter 키를 눌러야합니다. 내 10 라운드 테스트 실행에는별로 문제가 없지만 100 라운드 실행에는 고통이 될 수 있습니다.
Gareth

@Gareth, bash 스크립트로 래핑하십시오. echo "$@" | python bidding.py일을해야합니다.
피터 테일러

Peter가 제안한대로 이것을 시도했지만 TypeError: unsupported operand type(s) for +: 'int' and 'list'23 줄에 오류가 발생 합니다. Python 2.6.1을 사용하고 있습니다. 문제입니까? 최신 버전이 필요합니까? bash 스크립트를 사용하지 않고 동일한 문제가 발생합니다.
Gareth

@Gareth 입력하면 파일 이름이 sys.argv [1]에서 입력됩니다.
Blazer

@ 블레이저 문제인지 잘 모르겠습니다. 예제 호출을 사용하여 명령 줄에서 직접 프로그램을 호출하고 위에서 지정한 오류가 발생합니다. 거기에 파이썬 2.6.1과 호환되지 않는 것이 있습니까?
Gareth

3

슈 바르 첸벡 (Scala)

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

Schwarzenbeck은 골을 넣지 않습니다. 그는 곧 Beckenbauer의 정리입니다. :)

그것을 사용하려면 컴파일러가 필요합니다.

scalac Schwarzenbeck.scala 

그런 다음 실행할 수 있습니다.

scala Schwarzenbeck 'your ar-
gu-
ment' 

편집 : 추가 조정.


1
목표 점수를 안했다 Schwarzenbeck, 나는 그것이 완전히 :-) 실패라고 말하고 싶지만 점을 감안
celtschk

네, 딜레마가있었습니다. 저는 3 명으로 라인을 만들었고 ül 러가 가장 높은 점수를 얻길 기대했지만 전략적인 입장에서 Schwarzenbeck은 최고의 방어선을 표시했습니다. 내 방어선이 골을 넣었으므로 축구 메타 퍼가 실패했습니다. :)
사용자가 알 수 없음

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). 오후 11시 이후에 새로운 출품작을 고려하지 않겠지 만, 원한다면 버그를 볼 시간을주기 위해 점수 매기기 실행을 약간 늦출 것입니다.
Gareth

좋아, 문제는 당신이 ARGFARGV 대신 했다는 것입니다. 변경 후 프로그램은 1매번 추측 합니다. 내가 고칠 수있는 아이디어가 있습니까?
Gareth

이 줄을 맨 위에 추가하고 두 번째 라운드 입력 (2 줄의 데이터)을 줄 때 인쇄 내용을 알려주십시오. p ARGV.map{|l|l};exit (질문에 대한 SO 응답 없음을 당신은 참조하거나 유사한 사람이 나에게 기대 입력을 제공하는 것)
AShelly February

["1 2\n3 4\n5 6\n1 2"]문제의 테스트 입력을 위해 인쇄합니다 .
Gareth

2

나는 필연적으로 들어갈 수 있다고 생각했다. 더 심각한 항목이 곧 올 것입니다. 보너스로,이 항목은 일대일 경쟁에서 결코 잃지 않습니다.

print 1

모든 경쟁에서이기는 것은 아닙니다. 다른 사람과 일대일로 자신감을 가지면, 묶을 것입니다
Blazer

아니! 나는 그 사건을 잊었다는 것을 믿을 수 없다! 내가 고칠 게
PhiNotPi

출품작 디자인을 시작했을 때의 결론 중 하나는 각 봇이 적어도 1 / n의 시간을 제출하여 상대방이 자신의 행동을 피할 수 있도록 공정한 몫을 수행해야한다는 것입니다.
피터 테일러

@ 피터 : 걱정하지 마십시오, 내가 처리했다 . :)
Ilmari Karonen

2

자바 스크립트 (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'

가장 최근의 테스트 실행 결과를 보면 문서화 된대로 작동하지 않습니다. 왜 안 되 겠어요?
피터 테일러

1
@PeterTaylor 첫 번째 for루프 인지 궁금합니다 . 해야 if(i in numbers)if(matches[i] in numbers)당신이 생각합니까?
Gareth

@minitech 조금 둘러 본 후에 정규 표현식이 입력의 숫자와 일치하는 것처럼 보입니다.하지만 javascript 또는 Nodejs에 대해 충분히 알지 못해 이유를 말할 수는 없습니다. 또한 마지막 라운드를 얻으려면 줄 바꿈으로 입력을 분할해야합니까?
Gareth

@Gareth : 그렇습니다. 원래의 성능이 더 좋으면 업데이트되지 않지만 업데이트되지 않습니다. :)
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)
Gareth

2

파이썬 (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

파이썬 (Joe)

이것은 결코 승리하기 위해 설계된 것이 아니지만 어쨌든 군중에게 색을 더하기 위해 던지고 있습니다 :) 마지막 라운드의 평균을 입찰합니다 (Average 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

파이썬 (TotalBots)

나는 이것이 마지막이 될 것이라고 생각하지만, 우리는 볼 수 있습니다. 경쟁하는 봇 수를 간단히 출력하여 봇 수를 아는 것이 유리하므로 17 개의 봇 (현재 봇 수와이 봇 수)이 있으면 출력됩니다.17

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

2

펄 (건강 검사관)

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

펄 (밥)

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

호출하는 방법은 "밥"을 참조하십시오.


그것은 호출에 대한 매우 재귀적인 가이드입니다 ;-)
Gareth

실제로는 일련의 논리가 배치되어 있습니다. Alice는 입력을받는 방법을 설명합니다. Eve는 자신이 Alice와 동일한 입력을받는다고 언급합니다. Eve는 또한 Bob과 동일한 입력을받는다고 언급합니다. 따라서 Bob은 설명 된 Alice와 동일한 입력 형식을 사용합니다.
PhiNotPi

2

펄 (앨리스)

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

펄 (이브)

다른 봇의 길을 개척하는 데 도움이되도록이 항목을 완전히 수정했습니다.

$_=<>;
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 쓸모 없게 만들 수 있습니다."

글쎄, PhiNotPi가 하나를 입력 했기 때문에 다른 것을 입력하겠습니다. 다르게하려면 Brainfuck에서 해보겠습니다.

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

물론, 이제 1 베팅이 더 이상 실현 가능한 전략이 아니므로 지금해야 할 일은 2 베팅하는 것입니다 .

편집 : 댓글마다 두 개로 답을 나누고 두 가지 프로그램을 더 흥미로운 언어로 다시 작성하십시오.


첫째, 답변 당 하나의 항목을 입력하십시오. 둘째, 누군가 잃지 않도록 보장하기 위해 1에서 100 사이의 숫자 중 하나를 인쇄하는 각 사람이 100 개의 답변을 게시 할 수 있음을 알고 있습니다. 축구 경기 (축구)에서는 11 명의 선수가 골대에 서서 다른 팀이 득점하지 못하도록 할 수 있습니다. 그들이 그렇게한다면 많은 게임이 될 것이기 때문에 보통 그런 식으로 일어나지 않습니까?
Gareth

셋째,이 반대는 실제로 샌드 박스 에서 제기되어야합니다 .
Gareth

@ 가레스 : 좋아, 나는 대답을 두 가지로 나 ve 다. 출품작의 합리성에 관해서는, 만일 누군가가 "일종의 자신감"을 제출한다면, 다른 누군가가 그 일을 반대 할 수 있다고 제안했습니다. 그 시점에서 물론 "twosconfident"를 제출하는 것은 "onesconfident"를 제출하는 것이 처음부터 한 것처럼 의미가 있습니다.
Ilmari Karonen

1
이것에 대한 깔끔한 점은 이제이 항목을 이기지 않으면 서 내 onesconfident 항목을 삭제할 수 없다는 것입니다.
PhiNotPi

1
@ 피터 : 왜 그렇게 생각하십니까? 광산 및 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

베켄 바우어 (스칼라)

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

Schwarzenbeck의 도움으로 Beckenbauer는 몇 가지 목표를 달성해야합니다. Schwarzenbeck이 없으면 그는 아무것도 아닙니다.

실행 및 컴파일에 대한 세부 사항 : [Schwarzenbeck] [1] 참조

편집 : 지금 방에서 더 깊이 재생합니다.


1

배치 스크립팅

echo 5

내 제출, 매번 5 답변을 제공합니다 ;-)


1

여덟 박쥐

echo 8

또 다른 간단한 대답은 매번 8을 제공합니다.


1

파이브 캔슬 (PHP)

mellamokb의 "항상 5"솔루션을 취소합니다.

5

1

여덟 취소 (PHP)

mellamokb의 "항상 8"솔루션을 취소합니다. 죄송합니다, 멜라 목브!

8

우리는 다시 간다, 경쟁 : P
mellamokb

1

파이썬 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

실제로이 알고리즘은 750 만 년 지연을 생략했기 때문에 완전히 정확하지 않습니다. :-)


오늘 밤 시운전에 너무 늦어서 미안하지만, 나는 아침에 또 다른 일을 할 것이다.
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에서 테스트하려는 사람은 C 컴파일러로 Windows 상자에 액세스 할 수 없으므로 직접 포트해야합니다.

이론적 해석

토너먼트가 끝나기 전에 이것의 논리를 설명하고 싶지 않았지만 이제 승자가 발표되었으므로 이제 시간이라고 생각합니다.

비둘기 구멍 원리 (일명 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.