Найнижчий унікальний аукціон


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'

Це означає, що вашу програму потрібно буде запускати з командного рядка. Наведіть приклад виклику як частину вашої відповіді.

У першому раунді лише як засіб повідомити, скільки ботів ви проти, вхід буде рядком 0s - по одному для кожного бота.

Вихідні дані

Ваша програма повинна вивести свою ставку як ціле число в межах від 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;
}

Випадкові20 Ставки випадково між 1 і 20

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

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

Випадкові ставки5 навмання від 1 до 5

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

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

Приклад пробігу:

1 38 5 2 onesconfident
1 66 13 5 onesconfident
1 94 1 3 random5
1 22 9 1 random20
1 50 17 4 onesconfident
1 78 5 2 onesconfident
1 6 13 5 onesconfident
1 34 1 3 random5
1 62 9 1 random20
1 90 17 4 onesconfident

Results:
Bot Score   Total   Lowest
onesconfident   6   6   1
random100   0   0   101
random20    2   18  9
random5 2   6   3

Ці гравці призначені лише для тестування. Вони НЕ будуть включені у змагання. Ви можете ввести скільки завгодно ботів, тож якщо хто-небудь введе бота, який тільки здогадується 1, ви можете ввести іншого, який робить те саме, щоб зробити його марним.

Переможець

Бот, який виграє в кожному раунді, - це той, хто дає найнижчу унікальну ставку. Таким чином, враховуючи раунд, в якому робляться наступні ставки: 1 1 3 5 2 3 6 3 2 8 7переможцем став би бот, який подав заявку, 5оскільки 1s, 2s та 3s не є унікальними.

Переможцем змагань стане програма, яка виграє найбільше разів після 100 турів. У разі вирівнювання, загальна кількість виграшних пропозицій буде використана як безперервна ставка, а у випадку, якщо вона також буде нічиєю, найнижча ставка на виграш буде використана як подальший розіграш. Ці коефіцієнти балів виводяться програмою підрахунків.

Я буду запускати програму підрахунку всіх робочих програм, які були введені через 2 тижні з сьогоднішнього дня ( 18 лютого продовжено до 23 вечора (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

Лол, це була моя ідея: P. Оскільки ви вже реалізували, і я лінуюся, я дозволю вам це зауважити :) Зауважте, що єдиним типом запису, який це неможливо легко перемогти, є ті, які реалізують випадковість
mellamokb

8

Шеф-кухар

Оскільки завжди ставка 1 є програшною стратегією , очевидно, що завжди робити ставку 2 . Тож дозвольте мені це зробити. Щоб зробити цей інакше нудний запис трохи цікавішим, я вирішив написати його в шеф-кухаря :

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.

Як бонус, програма насправді більш-менш працює як справжній - якщо тривіальний - рецепт, навіть якщо він читання начебто так, ніби письменник трохи, гм, запечений. Граматика шеф-кухаря, здається, робить досить складно написати щось, що передбачає щось складніше, ніж перемішування речей у мисці та випікання, і все-таки він працює як як програма, так і як рецепт, особливо якщо будь-який із дієслів хочеться використовувати навіть трохи нерегулярні (наприклад, «смажити» → «смажити»).

Редагувати: Змінили рецепт із смажених на подрібнені яйця - дякую Блейзеру за пропозицію! Час і температуру приготування слід вважати лише рекомендаційними; Насправді я ще не спробував рецепт, тому не можу порушити їхню точність.


Я думаю, що це результат 1: дивіться мій коментар на codegolf.stackexchange.com/a/4851 .
msh210

Він виводить 2, принаймні за допомогою інтерпретатора Acme :: Chef . Заключна петля існує лише для затуманення, і тому їдальникам не доведеться їсти яйця сирими.
Ільмарі Каронен

Ага, правда, я пропустив той факт, що яйця вже були у форму для запікання і що це не те, що знежирене.
msh210

2
Ви називаєте це shirred eggs, що насправді робиться в форму для випічки, і це зробило б рецепт дійсним дійсним рецептом приготування та граматично правильним. shirr the eggs. shirr the eggs until shirred.жах за те, що кулінарна освіта під моїм поясом! :)
Blazer

1
час / температура приготування здається приблизно :). Звичайно, завжди використовуйте їх лише як настанови, оскільки саме шеф-кухар визначає, чи щось робиться чи ні, а не час / температура сама!
Блейзер

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.

EDIT : змінено на "перший раунд усіх нулів"

EDIT : трохи змінив "магічні числа" (вдруге)


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щоб компенсувати нещодавню зміну першого раунду всіх нулів

редагувати: проблеми в коментарях виправлені, вони також давали можливість отримувати дані від імені файлу, і ніколи більше не вибирає "2", оскільки конкуренція також відміняла це. працює з усіма 0 або як вихідні дані або взагалі відсутні дані у файлі

edit2: забув хв ()

edit3: змінено вхід, щоб відповідати потребам введення запитання


Викликає невелику проблему з бомбардиром - мені потрібно натиснути клавішу Enter, щоб отримати рахунок за кожен раунд. Немало проблем для моїх 10-ти турових пробіжок, але це може бути болем для 100-ти турів.
Гарет

@Gareth, загортай це в баш сценарій. echo "$@" | python bidding.pyповинен виконати роботу.
Пітер Тейлор

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

@Gareth, чи допоможе це, якщо я зробив так, що вхід є від 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

Стратег (Ruby)

Реалізує сотні простих стратегій: для кожного раунду вибирайте ту, яка виграла б більшість попередніх раундів:

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


Я зараз не можу перевірити це, я на роботі і не буду вдома до 21:30 (GMT). Чи допомагає це запитання про багаторядкові аргументи?
Гарет

Просто перевірив це, і це дає мені помилку - 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:00, але я трохи затягнуть пробіг балів, щоб дати вам час подивитися на помилку, якщо хочете.
Гарет

Гаразд, я думаю, що проблема полягала в тому, що ти мав ARGFзамість ARGV. Після цього 1щоразу міняйте програму . Будь-які ідеї, що я можу зробити, щоб це виправити?
Гарет

Чи можете ви додати цей рядок до вершини та скажіть, що він друкує, надаючи йому вхід 2-го раунду (2 рядки даних): p ARGV.map{|l|l};exit (Жоден із відповідей ТА на запитання, на яке ви посилаєтесь, або подібні з них, здається, не дає мені очікуваного введення)
AShelly

Він роздруковує ["1 2\n3 4\n5 6\n1 2"]тестовий вхід у питанні.
Гарет

2

Perl

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

print 1

не вигравати в кожному конкурсі. в один на один з іншим onesconfident, він буде пов'язувати
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, щоб можна було сказати, чому все-таки. Крім того, чи потрібно розділити дані на нові рядки, щоб отримати останній раунд?
Гарет

@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)
Гарет

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

Бере один формат введення: такий самий, як "Bob" та "Alice".


1

Брейнфук

Щоб процитувати виклик:

"Ви можете ввести скільки завгодно ботів, тому якщо хто-небудь введе бота, який тільки здогадується 1, ви можете ввести іншого, який робить те саме, щоб зробити його марним."

Ну, оскільки PhiNotPi ввів один , дозвольте мені ввести інший. Просто щоб бути іншим, я зроблю це в Brainfuck:

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

Звичайно, тепер, коли ставка 1 - це вже не реальна стратегія, очевидно, що зараз потрібно зробити ставку 2, а не ...

Редагувати: розділіть відповіді на два на коментарі, переписав обидві програми на більш цікаві мови.


По-перше, один запис на відповідь, будь ласка. По-друге, я знаю, що хтось міг опублікувати 100 відповідей на кожен друк однієї з цифр від 1 до 100, щоб гарантувати не програти - однаково хтось інший міг би зробити точно той же сенс, що ніхто не виграє. У грі у футбол (футбол) всі 11 гравців могли стояти на лінії воріт, щоб гарантувати, що інша команда не забиває. Це зазвичай ніколи не буває так, бо це була б велика гра, якби вони це зробили?
Гарет

По-третє, це заперечення справді повинно було бути висунуте в пісочниці - адже це його мета.
Гарет

@Gareth: Гаразд, я розділив відповідь на два. Що стосується обґрунтованості записів, то ви самі запропонували, якщо хтось подає "ті, хто впевнений", хтось інший міг би зробити те саме, щоб протидіяти цьому. У той момент, звичайно, подання "двоконфіденційності" має стільки ж сенсу, як і подання "тих самовпевненостей" в першу чергу, тому ...
Ільмарі Каронен

1
Акуратне в цьому полягає в тому, що тепер я не можу видалити свої записи про впевненість у собі, не дозволяючи цьому запису виграти.
PhiNotPi

1
@ Петер: Чому ти так вважаєш? Зважаючи на те, що і моя, і програма PhiNotPi беруть участь у змаганнях, немає жодної причини подавати програму, яка коли-небудь ставить 1 (якщо вони хочуть, щоб програма виграла, тобто).
Ільмарі Каронен

1

Мюллер (Scala)

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

Вісім.бат

echo 8

Ще одна проста відповідь - дає 8 кожного разу.


1

FivesCancel (PHP)

Скасовує рішення "завжди 5" mellamokb.

5

1

EightsCancel (PHP)

Скасовує рішення "завжди 8" mellamokb. Вибачте, mellamokb!

8

Ось ми знову йдемо, конкуренція: P
mellamokb

1

Python 2.7 - Copycat2

Копіює переможця другого останнього туру. О ні! інакше виходить 7.

import sys
content = sys.argv[1].split('\n')
x = map(int, content[-2].split()) if len(content) > 1 else [7]
y = []
for each in x:
    if x.count(each) == 1:
        y.append(each)
print min(y) if sum(y) > 0 else random.choice(x) if sum(x) > 0 else 7

1

Сценарій оболонки (глибока думка)

Гаразд, так що я отримую невеликий другий шанс, ось ще один запис, цього разу скрипт оболонки (повинен працювати з будь-якою оболонкою). Це завжди дає відповідь на питання про життя, Всесвіт і все.

echo 42

Насправді цей алгоритм не зовсім коректний, тому що я пропустив 7,5 мільйонів затримок на рік. :-)


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

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.