最低ユニーク入札オークション


22

すべてのエントリに感謝し、締め切りは過ぎました。最終スコアは質問の最後にあります。かなり包括的な勝利を収めたPhiNotPi
おめでとうございます。

これは、挑戦であり、その目的は、最も低いユニークな入札オークションで、どの対戦相手よりも頻繁に勝つプログラムを作成することです。

入力

入力として、プログラムは、次のようにスペースで区切られたすべての以前のラウンドの入札(行ごとに1ラウンド)を受け取ります。

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

入力の各列は、1つのボットの入札を表します。最初の列は受信プログラムの入札で、残りはランダムに生成された順序です。入力してくれたhammarPeter Taylorに感謝します。

入力は、プログラムへの唯一のコマンドライン(マルチライン)引数として提供されます。

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

これは、プログラムをコマンドラインから実行できる必要があることを意味します。答えの一部として、呼び出しの例を挙げてください。

最初のラウンドでは、対戦相手のボットの数を知らせる手段としてのみ、入力は0sの行(ボットごとに1 行)になります。

出力

プログラムは、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;
}

1〜20のランダムな20の入札

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

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

1〜5のランダムな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、を、同じことを行う別のて役に立たなくすることができます。

勝者

各ラウンドで勝ったボットは、最も低いユニークな入札を与えるものです。したがって、次の入札が行われるラウンドを考えると、s、s、およびsは一意ではないため、1 1 3 5 2 3 6 3 2 8 7勝者は入札するボットになります。5123

コンテストの勝者は、100ラウンド後に最も多く勝つプログラムです。同点の場合、落札価格の合計がタイブレーカーとして使用され、それがタイでもある場合、最低落札価格が追加のタイブレーカーとして使用されます。これらのスコアリングファクターはすべて、スコアリングプログラムによって出力されます。

今日から2週間後に入力されたすべての作業プログラムでスコアリングプログラムを実行します(2月18日 は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のプログラムを入力することでゲームを台無しにすることができました。
イルマリカロネン

1
勝ったボットがどのように選択されるか、2つの文を言えますか?わかりません。
ユーザー不明

@IlmariKaronenそれは本当です。しかし、私は人々がそうしないと信じています。1人あたりのエントリ数を制限することはできますが、スポイラーが登場した場合にのみ頼るつもりです。
ガレス

@userunknownオークションのラウンドの仕組みを明確にしようとしました。
ガレス

1
@PhiNotPi:罪悪感はありません。ルール内で勝ちました。
スティーブンランバルスキー

回答:


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

このプログラムは、一度に1行ずつ入力し、その後に2つの改行が続きます。

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

わかりました、これはメタゲーミングを極端にします。
ピーターテイラー

@petertaylor行き過ぎだろうか?元に戻す必要がありますか?
PhiNotPi

2
これはルール弁護士にとって悪名高いサイトです。完全に公正です。しかし、スタック交換メカニズムは、キングオブザヒルの競技には最適ではないという結論に達しました。
ピーターテイラー

私もその結論に達しました。将来の競技会では、ボットを視界から隠す方法を作成する必要があります。私が知っている限りでは、誰かが私のボットに対して今メタゲーミングしています。
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.

ボーナスとして、プログラムは実際には多少なりとも本物のレシピとして機能します。たとえそれがライターのようなもので、ライターが少し焼き上げられているようなものであってもです。シェフの文法は、ボウルに物を混ぜて焼くよりも複雑なものを含むものを書くことをかなり難しくしているようですが、特にそれを使用したい動詞の場合は、プログラムとしてもレシピとしても動作します少し不規則です(「揚げ物」→「揚げ物」など)。

編集:レシピを目玉焼きからシャーリングエッグに変更しました—提案してくれたBlazerに感謝します!調理時間と温度は助言のみと考えるべきです。私自身はまだ実際にレシピを試していませんので、その正確さを保証することはできません。


これは1を出力すると思いますcodegolf.stackexchange.com/a/4851で私のコメントを参照してください。
msh210

少なくともAcme :: Chefインタープリターを使用して、2を出力します。最後のループは難読化のためだけにあり、卵を生で食べる必要はありません。
イルマリカロネン

ああ、そうです、私は卵がすでにグラタン皿に入っていて、それが減らされていないという事実を逃しました。
msh210

2
あなたはそれshirred eggsを実際にグラタン皿で行い、レシピを実際の有効な調理レシピにし、文法的に正しいと呼びます。shirr the eggs. shirr the eggs until shirred.私のベルトの下で料理教育を持っていることをうれしく思います!:)
ブレイザー

1
調理時間/温度はほぼ正しいようです:)。もちろん、時間/温度自体ではなく、何かを行うかどうかを決定するのはシェフであるため、常にガイドラインとしてのみ使用してください!
ブレイザー

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です。

編集:「最初のラウンドすべてゼロ」の変更

編集:「マジックナンバー」を少し変更しました(2回目)


1
べきではないm = random.choice(1,2,2,3,3,3)ことm = random.choice([1,2,2,3,3,3])
ブレイザー

ブレイザーがそうするかもしれないと言ったところ、それはエラーを投げました。テスト実行のために角括弧を入れましたが、うまくいったようです。
ガレス

@ブレイザー:はい、絶対に(私の側の小さなミス)。お知らせいただきありがとうございます。
クリストフ

4

Python(ブレザー)

このボットは以前のラウンドを分析し、勝った数字を記録します。そのため、より頻繁に表示される当選番号が選択される可能性が高くなります。次に、当選番号(1または2以外)からランダムに番号を選択します。最初のラウンドの場合、代わりに2 3 を選択します。

入力は一度に1行ずつ読み取られます。空の行を入力して入力の受け入れを停止するだけです

コツは、貼り付けるだけで(貼り付け内に\ nが含まれる各行を自動的に受け入れます)、Enterキーを2回押すことです

これで、コマンドラインにファイル名を指定してスクリプトを実行できます。

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」を選択することはなくなりました。開始入力としてall-0を使用するか、ファイルにデータがまったくない状態で動作します

edit2:min()を忘れました

edit3:質問の入力ニーズに合わせて入力を変更しました


得点者に小さな問題を引き起こします-各ラウンドの得点を得るためにエンターを押さなければなりません。私の10ラウンドのテスト実行ではそれほど問題ではありませんが、100ラウンドの実行では苦痛になる可能性があります。
ガレス

@ Gareth、bashスクリプトでラップします。echo "$@" | python bidding.py仕事をする必要があります。
ピーターテイラー

Peterが提案したようにこれを試しましたが、TypeError: unsupported operand type(s) for +: 'int' and 'list'23行目でエラーが発生しています。Python2.6.1を使用していますが、それは問題ですか?新しいバージョンが必要ですか?bashスクリプトを使用しなくても同じ問題が発生します。
ガレス

@Garethは、入力がsys.argv [1]からファイル名でパイプされるようにした場合に役立ちますか?
ブレイザー

@ブレイザー私はそれが問題だと確信していません。例の呼び出しを使用して、コマンドラインからプログラムを自分で呼び出して、上記のエラーを取得しています。Python 2.6.1と互換性のないものがそこにありますか?
ガレス

3

シュワルツェンベック(スカラ)

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

シュワルツェンベックはゴールを決めることはできません。彼はすぐに続くベッケンバウアーのクリーンアップです。:)

それを使用するには、コンパイラが必要であり、コンパイルします

scalac Schwarzenbeck.scala 

それからそれを実行できます:

scala Schwarzenbeck 'your ar-
gu-
ment' 

編集:さらに調整します。


1
シュワルツェンベックがゴールを決めることになっていないことを考えると、それは完全に失敗したと思います:
celtschk

はい、ジレンマがありました。3人のプレイヤーでラインを作り、ミュラーが最も多くのポイントを獲得することを期待していましたが、戦略的な位置から、シュワルツェンベックは究極の防衛ラインをマークしました。私の防衛線がゴールを決めたため、フットボールのメタファーは失敗しました。:)
ユーザー不明

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質問は、複数行の引数に役立ちますか?
ガレス

これをテストしただけで、エラーが発生します- 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時以降は新しいエントリの検討を停止しますが、必要に応じてバグを確認する時間を確保するために、採点の実行を少し遅らせます。
ガレス

さて、ARGFARGVの代わりにあなたが持っていたことが問題だったと思います。その変更を行った後、プログラムは1毎回推測します。私がそれを修正するためにできることはありますか?
ガレス

あなたが一番上に次の行を追加し、第2ラウンドの入力(データの2本のライン)を与えるとき、それは印刷さを教えすることができますp ARGV.map{|l|l};exit (質問へのSOの回答のなしをあなたが参照するか、同様のものが私に期待される入力を与えるように見えます)
AShelly

["1 2\n3 4\n5 6\n1 2"]質問のテスト入力用に出力します。
ガレス

2

Perl

私も避けられないものに入るかもしれないと考えました。より深刻なエントリが近日公開されます。ボーナスとして、このエントリーは1対1の競争で負けることはありません。

print 1

すべての競争に勝つわけではありません。自信を持って他の人と一対一で、それは結びつきます
ブレイザー

いや!そのことを忘れたなんて信じられない!それを修正します。
PhiNotPi

エントリの設計を開始したときの私の結論の1つは、各ボットが少なくとも1 / nの時間を1回送信して、自信を持ってそれを持ち去らないようにすることです。
ピーターテイラー

@ピーター:心配しないで、私はそれを大事にした。:)
イルマリカロネン

2

JavaScript(node.js)

最後のラウンドで最も人気のあったものをカウントし、それより1つ少ない入札で、最初のラウンドで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)だと思いますか?
ガレス

@minitech少し調べてみると、正規表現は入力の1つの数字にのみ一致しているように見えます。javascriptまたはNodejsについて十分な知識がなくても、理由を言うことができません。また、最後のラウンドを取得するには、改行で入力を分割する必要がありますか?
ガレス

@ガレス:確かにそうです。更新されましたが、元々より良いパフォーマンスだったとしても気にしません:)
Ry-

残念ながら、最初の1回を除くすべてのラウンドでエラーが発生します。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)

さらに別の場合、今回は、最後の勝者がいた場合、最後の勝者が持っていた正確な答えをコピーします。それは、他の入札者を勝ち取り、ブロックしようとするために設計されました。入札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(ジョー)

これは決して勝つように設計されたものではありませんが、とにかく群衆に色を追加するためにそこに投げています:)最後のラウンドの平均を入札します(平均ジョー)。私の元の答えと同じように呼び出しました(これは、すべてのクールな子供たちがしていることのように見えるので、これから名前を付けます。2つの区別に役立ちます)。ラウンドを開始する場合は、入札し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(TotalBots)

これは私の最後になると思いますが、私たちは見るでしょう。競合するボットの数を単純に出力することで、ボットの数を知ることの利点があります。したがって、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(ボブ)

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

実際には、一連のロジックが配置されています。アリスは入力をどのように取るかを説明します。イブは、彼女がアリスと同じ入力を取ることを述べています。イブは、ボブと同じように入力を受け取ることにも言及しています。したがって、ボブはアリスと同じ入力形式を使用します。これについて説明します。
PhiNotPi

2

Perl(アリス)

$_=<>;
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(イブ)

私はこのエントリを完全に再編集して、他のボットへの道を開いた。

$_=<>;
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つの入力形式を使用します。


1

ブレインファック

課題から引用するには:

「好きなだけボットを入力できるので、だれかが推測するだけのボットを入力した場合1、同じことをする別のボットを入力して役に立たないようにすることができます。」

さて、PhiNotPiが1つを入力したので、別のものを入力させてください。違うだけで、私はそれをBrainfuckでやる:

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

もちろん、1をベットすることはもはや実行可能な戦略ではないので、今やるべきことは2ベットすることですです...

編集:コメントごとに回答を2つに分割し、両方のプログラムをより興味深い言語に書き換えました。


まず、回答ごとに1つのエントリをお願いします。第二に、負けないことを保証するために誰かが1から100までの数字の1つを印刷する100の答えを投稿できることを知っています-同様に他の誰かが誰も勝てないというまったく同じ意味をすることができます。フットボールの試合(サッカー)では、11人のプレーヤー全員がゴールラインに立って、他のチームが得点しないことを保証できます。彼らがそれをした場合、それはゲームの多くになるので、それは通常、そのようには決して起こりませんか?
ガレス

第三に、この異議はサンドボックスで実際に提起されたはずです-結局それがその目的です。
ガレス

@Gareth:OK、答えを2つに分割しました。エントリの合理性については、「onesconfident」を誰かが送信した場合、他の誰かがそれを打ち消すために同じことをすることができるとあなた自身が提案しました。「onesconfident」提出するので、最初の場所でやったように、その時点では、当然のことながら、「twosconfident」を提出することだけではあまり意味となります...
イルマリKaronen

1
これについてのすてきなことは、このエントリが勝つことを許可せずに自分のonesconfidentエントリを削除できないことです。
PhiNotPi

1
@ピーター:なぜそう思うのですか?鉱山とPhiNotPiのプログラムの両方がレースになっていることを考えると、他の誰がそのプログラムを提出するために理由はありません今までベット1は、(彼らはそのプログラムが勝つにしたい場合は、それはあります)。
イルマリカロネン

1

ミューラー(スカラ)

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

シュワルツェンベックとベッケンバウアーを知っていれば、きっとミュラーを期待していました。ここにいる。彼はベッケンバウアーとシュワルツェンベックから多くの利益を得て、勝つことになっています。

実行とコンパイルの詳細:Schwarzenbeckを参照

今、目標に近づいています。


1

ベッケンバウアー(スカラ)

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

シュワルツェンベックの助けを借りて、ベッケンバウアーはいくつかのゴールを決めることになっています。シュワルツェンベックがなければ、彼は何もありません。

実行とコンパイルの詳細:[Schwarzenbeck] [1]を参照してください

編集:部屋の奥深くでもプレイします。


1

バッチスクリプト

echo 5

私の提出は、その答えとして毎回5を与えます;-)



1

FivesCancel(PHP)

mellamokbの「常に5」ソリューションをキャンセルします。

5

1

EightsCancel(PHP)

mellamokbの「常に8」ソリューションをキャンセルします。すみません、mellamokb!

8

ここで再び行きます、競争:P
mellamokb

1

Python 2.7-Copycat2

最後の2番目のラウンドの勝者をコピーします。あらいやだ!それ以外の場合は、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

シェルスクリプト(深い思考)

さて、もう1つチャンスがあります。ここに別のエントリがあります。今回はシェルスクリプトです(どのシェルでも動作するはずです)。これは常に、生命、宇宙、すべての問題に対する答えを提供します。

echo 42

実際、750万年の遅延を省略したため、このアルゴリズムは完全に正しいわけではありません。:-)


今夜のテストは遅すぎて申し訳ありませんが、午前中に別のテストを行います。
ガレス

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ボックスにアクセスできないため、自分で移植する必要があります。

根拠

トーナメントが終了する前に、この背後にあるロジックを説明したくありませんでしたが、勝者が発表されたので、今がその時だと思います。

ピジョンホールの原理(別名ディリクレの原理、したがってボットの名前)により、競合するボットがN個ある場合、[1..1 + N / 2]にwがあり、それが勝った場合または勝った場合選択されました。したがって、最適な戦略では1+ N / 2 より大きい数値は選択されないと結論します。ただし、Nが偶数の場合、1 + N / 2を選択すると、より小さな勝利スロットが作成されます。したがって、選択する価値のあるスロットは[1 ..(N +1)/ 2]です。

スロットを選択する方法の問題が残ります。少数のボットについて、各ボットが候補の間で均一に選択するときにナッシュの均衡があることを確認しました。これは引き続き当てはまると思います。

このボットの戦略と理論上の戦略とのわずかな違いは、単なるメタゲーミングです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.