Самая низкая уникальная ставка аукциона


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

Каждый столбец ввода представляет цену одного бота. Первый столбец - это заявки принимающей программы, а остальные расположены в случайном порядке. Благодаря хаммару и Питер Тейлор за их вклад.

Входные данные предоставляются в качестве единственного аргумента командной строки (многострочный) вашей программы:

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

Это означает, что ваша программа должна быть запущена из командной строки. Пожалуйста, приведите пример вызова как часть вашего ответа.

Только в первом раунде для того, чтобы дать вам знать, с каким количеством ботов вы столкнулись, вход будет представлять собой строку0 s - по одной для каждого бота.

Выход

Ваша программа должна вывести свою ставку в виде целого числа в диапазоне от 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 Ставки в случайном порядке по всему диапазону

#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 недели с сегодняшнего дня ( 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 программ, каждая из которых всегда предлагает определенное число.
Ильмари Каронен

1
Можете ли вы сказать два предложения, как выбрать победившего бота? Я не понимаю
пользователь неизвестен

@IlmariKaronen Это правда, вы могли бы. Но я верю, что люди этого не сделают. Я мог бы ограничить количество записей на человека, я полагаю, но я думаю, что прибегну к этому, только если появятся спойлеры.
Гарет

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

Эта программа принимает по одной строке за раз, после чего следуют две новые строки:

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

Хорошо, это доводит метаигры до крайности.
Питер Тейлор

@petertaylor Я иду слишком далеко от линии? Должен ли я вернуться к своему оригиналу?
PhiNotPi

2
Этот сайт печально известен правилами юристов - это совершенно справедливо. Но я прихожу к выводу, что механизм обмена стека может быть не самым лучшим для соревнований типа «король горы».
Питер Тейлор

Я также пришел к такому выводу. Нам нужно создать метод сокрытия ботов от просмотра на будущих соревнованиях. Насколько я знаю, сейчас кто-то ведет метагейминг против моих ботов.
PhiNotPi

Lol, это была моя идея: 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

Он выводит 2, по крайней мере, используя интерпретатор Acme :: Chef . Последний цикл предназначен только для запутывания, так что посетителям не придется есть сырые яйца.
Ильмари Каронен

Ах, да, я пропустил тот факт, что яйца уже были в форме для выпечки, и что это не то, что уменьшилось.
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)

Просто труба в ставках через стандартный ввод, например 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: да, абсолютно (маленькая опечатка с моей стороны). Спасибо за уведомление.
ChristopheD

4

Питон (блейзер)

Этот бот анализирует предыдущие раунды и записывает числа победителей. Поэтому выигрышные номера, которые появляются чаще, будут иметь больше шансов быть выбранными. Затем он будет случайным образом выбирать номера из выигрышных номеров (кроме 1 или 2). вместо этого он выберет 2 3, если это первый раунд.

Ввод читается по одной строке за раз. просто введите пустую строку, чтобы прекратить прием ввода

Хитрость заключается в том, чтобы просто вставить (он автоматически принимает каждую строку с \ n внутри вставки) и дважды нажать клавишу ввода

Теперь вы можете просто запустить скрипт с именем файла в командной строке:

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чтобы компенсировать недавнее изменение первого раунда всех нулей

edit: исправлены проблемы в комментариях, также он позволял получать входные данные из имени файла, и никогда больше не выбирал «2», так как соревнование также отсеивало это. работает либо со всеми 0 в качестве начального ввода, либо вообще без данных в файле

edit2: забыл мин ()

edit3: изменил ввод в соответствии с потребностями ввода вопроса


Вызывает небольшую проблему с бомбардиром - я должен нажать Enter, чтобы получить счет за каждый раунд. Не большая проблема для моих 10 раундов, но может быть болью для 100 раундов.
Гарет

@ Гарет, заверни его в сценарий bash. echo "$@" | python bidding.pyдолжен сделать работу.
Питер Тейлор

Я попробовал это, как предложил Питер, но я получаю сообщение об ошибке TypeError: unsupported operand type(s) for +: 'int' and 'list'для строки 23. Я использую Python 2.6.1, это проблема? мне нужна более новая версия? Я получаю ту же проблему, не используя скрипт bash.
Гарет

@ Гарет, поможет ли это, если я сделаю так, чтобы входные данные передавались из sys.argv [1] с именем файла?
Блейзер

@ Blazer Я не уверен, что это проблема. Я сам вызываю программу из командной строки, используя ваш пример вызова и получаю ошибку, которую я дал выше. Есть ли что-то несовместимое с 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 (по Гринвичу). Этот вопрос помогает с многострочными аргументами?
Гарет

Просто проверил это, и это дает мне ошибку 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 вечера, но я немного задержу запуск скоринга, чтобы дать вам время посмотреть на ошибку, если хотите.
Гарет

Ладно, я думаю, что проблема была в том, что у тебя был ARGFвместо ARGV. После этого изменения программа угадывает 1каждый раз. Любые идеи, что я могу сделать, чтобы это исправить?
Гарет

Можете ли вы добавить эту строку вверху и сказать мне, что она печатает при вводе данных во 2-м раунде (2 строки данных): p ARGV.map{|l|l};exit (Ни один из SO-ответов на вопрос, на который вы ссылаетесь, или подобные ему, похоже, не дает мне ожидаемого ввода)
AShelly

Он распечатывает ["1 2\n3 4\n5 6\n1 2"]для тестового ввода в вопросе.
Гарет

2

Perl

Я подумал, что с тем же успехом могу войти в неизбежное. Более серьезные записи в ближайшее время. В качестве бонуса эта запись никогда не проиграет в соревновании один на один.

print 1

Не выиграть все соревнования. в один на один с другим неуверенным, это свяжет
Blazer

Нет! Я не могу поверить, что я забыл об этом случае! Я исправлю это.
PhiNotPi

Один из моих выводов, когда я начал разрабатывать свою запись, состоит в том, что каждый бот должен подавать 1 по крайней мере 1 / n времени, чтобы сделать все возможное, чтобы не дать уверенному человеку уйти с ним.
Питер Тейлор


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'

Если посмотреть на результаты последнего тестового прогона, это не ведет себя так, как задокументировано. Есть идеи почему бы и нет?
Питер Тейлор

1
@PeterTaylor Интересно, это первый forцикл? Должно if(i in numbers)быть if(matches[i] in numbers)ты думаешь?
Гарет

@minitech После небольшого возни с этим, похоже, что регулярное выражение совпадает только с одним номером ввода - не знаю достаточно о javascript или Nodejs, чтобы хотя бы сказать, почему. Кроме того, вам нужно разделить ввод на новые строки, чтобы получить последний раунд?
Гарет

@ Гарет: Это действительно так. Обновленный, хотя, если это
работало

К сожалению, теперь выдает ошибку для каждого раунда, кроме первого: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

Питон (Джо)

Это ни в коем случае не предназначено для победы, но я все равно добавляю немного цвета в толпу :) Это означает среднее значение за последний раунд (Среднее число Джо). Вызывается так же, как и мой первоначальный ответ (который я сейчас назову, потому что кажется, что это то, что делают все классные дети, и это помогает различить их). если начать раунд, он делает ставку 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"}
}

Смотрите "Боб", чтобы узнать, как вызвать.


Это очень рекурсивное руководство по вызову ;-)
Гарет

На самом деле существует цепочка логики: Алиса описывает, как она принимает данные. Ева упоминает, что она воспринимает то же, что и Алиса. Ева также упоминает, что она принимает то же самое, что и Боб. Таким образом, Боб принимает тот же формат ввода, что и Алиса, который описан.
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"}
}

Принимает один формат ввода: такой же, как «Боб» и «Алиса».


1

Brainfuck

Чтобы процитировать вызов:

«Вы можете ввести столько ботов, сколько пожелаете, поэтому, если кто-то введет бота, который только догадывается 1 , вы можете ввести другого, который сделает то же самое, чтобы сделать его бесполезным».

Ну, так как PhiNotPi вошел в один , позвольте мне войти в другой. Просто чтобы быть другим, я сделаю это в Brainfuck:

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

Конечно, теперь, когда ставка 1 больше не является выполнимой стратегией, очевидное, что нужно сделать сейчас, это поставить 2 вместо ...

Редактировать: разделить ответ на два в комментариях, переписать обе программы на более интересных языках.


Во-первых, одна запись на ответ, пожалуйста. Во-вторых, я знаю, что кто-то может опубликовать 100 ответов для каждой печати, печатая одну из цифр от 1 до 100, чтобы гарантировать, что не проиграет - в равной степени кто-то другой может сделать то же самое, что никто не победит. В игре в футбол (футбол) все 11 игроков могут стоять на линии ворот, чтобы гарантировать, что другая команда не забьет. Обычно так не бывает, потому что если бы они это сделали, это было бы большой частью игры?
Гарет

В-третьих, это возражение должно было быть выдвинуто в песочнице - ведь это его цель.
Гарет

@ Гарет: ОК, я разделил ответ на две части. Что касается обоснованности записей, вы сами предположили, что, если кто-то представит «один уверенный в себе», кто-то другой может сделать то же самое, чтобы противостоять ему. В этот момент, конечно же, отправка «дважды уверенного в себе» имеет такой же смысл, как и отправка «одного уверенного» в первую очередь, так что ...
Ильмари Каронен

1
Важно то, что теперь я не могу удалить свою уверенную в себе запись, не позволив этой записи выиграть.
PhiNotPi

1
@Peter: Почему ты так думаешь? Учитывая, что в гонке участвуют как моя, так и 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

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

Сценарий оболочки (Deep Thought)

Хорошо, так что у меня есть небольшой второй шанс, вот еще одна запись, на этот раз сценарий оболочки (должен работать с любой оболочкой). Это всегда дает ответ на вопрос жизни, вселенной и всего остального.

echo 42

На самом деле этот алгоритм не совсем корректен, потому что я пропустил задержку в 7,5 миллионов лет. :-)


Слишком поздно для сегодняшнего пробного запуска, извините, но я сделаю еще один утром.
Гарет

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.

обоснование

Я не хотел объяснять логику этого до окончания турнира, но теперь, когда объявлен победитель, думаю, пришло время.

По принципу «голубиного отверстия» (он же принцип Дирихле, отсюда и название бота), если есть N конкурирующих ботов, то в [1..1 + N / 2] есть число w, которое либо выиграло, либо выиграло бы, если бы выбран. Поэтому я делаю вывод, что оптимальная стратегия не будет выбирать числа больше 1 + N / 2. Но если N четное, выбор 1+ N / 2 создает меньший выигрышный слот. Поэтому слоты, которые стоит выбрать, это [1 .. ( N +1) / 2].

Это оставляет вопрос о том, как выбрать слот. Для небольшого числа ботов я проверил, что существует равновесие Нэша, когда каждый бот выбирает равномерно среди кандидатов, и я сильно подозреваю, что это будет продолжаться.

Небольшое отклонение в стратегии этого бота от теоретического - просто метагейминг.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.