Dzięki za wszystkie zgłoszenia, termin już minął, a ostateczne wyniki są na końcu pytania.
Gratulacje dla PhiNotPi za dość kompleksowe zwycięstwo.
Jest to wyzwanie na szczycie wzgórza , którego celem jest stworzenie programu, który wygrywa częściej niż którykolwiek z jego przeciwników w aukcji o najniższej możliwej ofercie.
Wkład
Jako dane wejściowe program otrzyma licytację wszystkich poprzednich rund, jedną rundę na linię, wszystkie oferty oddzielone spacjami w następujący sposób:
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
Każda kolumna danych wejściowych reprezentuje licytację jednego bota. Pierwsza kolumna to oferty programu odbierającego, podczas gdy reszta jest losowo generowana. Podziękowania dla hammara i Petera Taylora za ich wkład.
Dane wejściowe są dostarczane jako jedyny argument wiersza polecenia (wielu wierszy) do programu:
./test1 '1 2
3 4
5 6
1 2'
Oznacza to, że Twój program będzie musiał być uruchamiany z wiersza poleceń. Podaj przykład wywołania jako część swojej odpowiedzi.
W pierwszej rundzie tylko w celu poinformowania Cię o liczbie botów, z którymi walczysz, dane wejściowe będą równe 0
s - jeden dla każdego bota.
Wydajność
Twój program powinien wypisać swoją ofertę jako liczbę całkowitą z zakresu od 1 do 100 (włącznie).
Program strzelców
To jest mój program oceniania - wszelkie sugestie dotyczące dodatków, ulepszeń lub poprawek błędów byłyby mile widziane.
#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;
}
Testuj graczy
Pewny siebie Zawsze licytuje 1.
#include <stdio.h>
int main()
{
printf("1");
return 0;
}
Random 100 losowych ofert w całym zakresie
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(getpid());
printf("%d",rand()%100+1);
return 0;
}
Losowo 20 ofert losowych od 1 do 20
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(getpid());
printf("%d",rand()%20+1);
return 0;
}
Losowe 5 ofert losowych od 1 do 5
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(getpid());
printf("%d",rand()%5+1);
return 0;
}
Przykładowy przebieg:
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
Gracze ci służą wyłącznie do testowania. NIE zostaną one uwzględnione w konkursie. Możesz wprowadzić tyle botów, ile chcesz, więc jeśli ktoś wejdzie do bota, który tylko zgaduje 1
, możesz wprowadzić innego bota, który robi to samo, aby uczynić go bezużytecznym.
Zwycięzca
Wygrywającym botem w każdej rundzie jest ta, która daje najniższą unikalną ofertę. Biorąc pod uwagę rundę, w której składane są następujące oferty: 1 1 3 5 2 3 6 3 2 8 7
zwycięzcą będzie bot, który licytuje, 5
ponieważ 1
s, 2
s i 3
s nie są unikalne.
Zwycięzcą konkursu będzie program, który wygrywa najwięcej razy po 100 rundach. W przypadku remisu suma zwycięskich ofert zostanie wykorzystana jako remis, aw przypadku remisu, najniższa wygrana oferta zostanie wykorzystana jako remis. Te współczynniki punktacji są generowane przez program punktacji.
Uruchomię program oceniania we wszystkich programach roboczych, które zostały wprowadzone za 2 tygodnie od dzisiaj ( 18 lutego został przedłużony do 23:00 (GMT) 20 lutego ). Głosuję za wszystkimi pracami i zaakceptuję zwycięzcę mojego wyścigu punktacji.
Końcowy przebieg punktacji
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
źródło
Odpowiedzi:
Perl
Tym razem trochę bardziej się starałem. To naprawdę
prosta,złożona strategia, ale stworzyłem ramy dla ekspansji.Edycja: Zakończ ponawianie. Ta rzecz jest w nim do wygrania.
Ten program pobiera dane po jednej linii, po której następują dwie nowe linie:
źródło
Szef kuchni
Ponieważ zawsze obstawianie 1 jest teraz strategią przegraną , oczywiste jest, aby zawsze obstawiać 2 . Więc pozwól mi to zrobić. Aby ten nudny wpis był nieco bardziej interesujący, postanowiłem napisać go w Chef :
Jako bonus, program faktycznie działa mniej więcej tak jak prawdziwa - choć trywialna - recepta, nawet jeśli czyta się tak, jakby pisarz był trochę upieczony. Gramatyka szefa kuchni sprawia, że dość trudno jest napisać coś, co wymaga czegoś bardziej skomplikowanego niż mieszanie rzeczy w misce i pieczenie, i nadal działa jako program i jako przepis, zwłaszcza jeśli którykolwiek z czasowników, którego chce się użyć są nawet nieco nieregularne (np. „smażyć” → „smażone”).
Edytować: Zmieniono przepis z jajka sadzonego na smażone - dzięki Blazer za sugestię! Czas i temperatura gotowania należy traktować wyłącznie jako wskazówkę; Sam jeszcze nie wypróbowałem przepisu, więc nie mogę ręczyć za ich dokładność.
źródło
shirred eggs
, co faktycznie robi się w naczyniu do pieczenia, a to sprawiłoby, że przepis byłby rzeczywistym obowiązującym przepisem kulinarnym i gramatycznie poprawnym.shirr the eggs. shirr the eggs until shirred.
bzdura za to, że mam wykształcenie kulinarne! :)Python (2.6)
Niezwykle proste, ale wciąż jestem ciekawy, jak to się sprawdzi w porównaniu do innych podejść.
Wystarczy wprowadzić oferty za pomocą standardowego wejścia, np
python testbid.py < bids.txt
.EDYCJA : zmieniono dla „pierwszej rundy wszystkie zera”
EDYCJA : trochę zmieniłem „magiczne liczby” (drugi raz)
źródło
m = random.choice(1,2,2,3,3,3)
byćm = random.choice([1,2,2,3,3,3])
?Python (Blazer)
Ten bot analizuje poprzednie rundy i zapisuje liczby, które wygrywają. Dlatego wygrane liczby, które pojawiają się częściej, będą miały większą szansę na wybranie. Następnie losowo wybierze liczby ze zwycięskich liczb (innych niż 1 lub 2). zamiast tego wybierze
23, jeśli jest to pierwsza runda.Wejście odczytywane jest po jednym wierszu na raz. wystarczy wpisać pusty wiersz, aby przestać akceptować dane wejścioweSztuką jest po prostu wkleić (automatycznie akceptuje każdą linię z \ n wewnątrz wklejania) i nacisnąć dwukrotnie klawisz EnterMożesz teraz po prostu uruchomić skrypt z nazwą pliku w wierszu polecenia:
plik powinien wyglądać następująco:
-
edycja: dodanoor sum(rounds) == 0
aby zrekompensować ostatnią zmianę zera w pierwszej rundzieedit: naprawiono problemy w komentarzach, umożliwiało także otrzymywanie danych wejściowych z nazwy pliku i nigdy więcej nie wybiera „2”, ponieważ konkurencja również to wyeliminowała. działa albo z zerami jako początkowym wejściem, albo w ogóle nie ma danych w pliku
edit2: zapomniałem min ()
edit3: zmieniono dane wejściowe, aby dopasować je do potrzeb pytania
źródło
echo "$@" | python bidding.py
powinien wykonać pracę.TypeError: unsupported operand type(s) for +: 'int' and 'list'
pojawia się błąd dla linii 23. Używam Python 2.6.1, czy to jest problem? czy potrzebuję nowszej wersji? Ten sam problem pojawia się bez użycia skryptu bash.Schwarzenbeck (Scala)
Schwarzenbeck nie powinien strzelać goli. Jest sprzątaczem Beckenbauera, który nastąpi wkrótce. :)
Aby go użyć, potrzebujesz kompilatora i skompiluj go
Następnie możesz go uruchomić:
Edycja: Dalsze korekty.
źródło
Strateg (Ruby)
Realizuje setki prostych strategii: dla każdej rundy wybiera tę, która wygrałaby większość poprzednich rund:
Nie jestem pewien, czy poprawnie wprowadziłem format wejściowy - nie jestem pewien, jak wygenerować wieloliniowe argumenty wiersza poleceń do testowania go w systemie Windows. (Ta metoda wydaje się działać na IDEone.)
źródło
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)
. Przestanę rozważać nowe wpisy po 23:00, ale nieco opóźnię przebieg punktacji, aby dać ci czas na sprawdzenie błędu, jeśli chcesz.ARGF
zamiast ARGV. Po dokonaniu tej zmiany program zgaduje1
każdym razem. Jakieś pomysły, co mogę zrobić, aby to naprawić?p ARGV.map{|l|l};exit
(Żadna z SO odpowiedzi na pytanie, do których się odwołujesz, lub podobne nie wydają się dawać oczekiwanych danych wejściowych)["1 2\n3 4\n5 6\n1 2"]
dla danych wejściowych testu w pytaniu.Perl
Uznałem, że równie dobrze mogę wejść w nieuniknione. Więcej poważnych wpisów już wkrótce. Jako bonus, ten wpis nigdy nie przegra w zawodach jeden na jednego.
źródło
JavaScript (node.js)
Liczy najbardziej popularną ostatnią rundę i licytuje o jedną mniej, zwiększając do 20 i licytując 3 w pierwszej rundzie.
Jak wywołać:
źródło
for
pętla? Powinienif(i in numbers)
byćif(matches[i] in numbers)
o tym sądzisz?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)
Python (CopyCat)
Jeszcze raz, tym razem kopiuje dokładną odpowiedź, jaką miał ostatni zwycięzca, jeśli taka była. Jest przeznaczony zarówno do wygrania, jak i blokowania innych licytujących. licytuje w
5
pierwszej rundzie, licytuje losową liczbę z poprzedniej rundy, jeśli jakoś nie było zwycięzcyźródło
Python (Joe)
Nie ma to na celu wygrania, ale i tak go wyrzucam, aby dodać trochę koloru tłumowi :) Licytuje średnią z ostatniej rundy (Przeciętny Joe). Wywołałem to samo co moja pierwotna odpowiedź (którą teraz wymienię, ponieważ wygląda na to, że robią to wszystkie fajne dzieciaki i pomaga to rozróżnić). jeśli zaczyna rundę, licytuje
10
.edit: zmieniono metodę wprowadzania, aby dopasować metodę wprowadzania pytania
źródło
Python (TotalBots)
Myślę, że ten będzie mój ostatni, ale zobaczymy. Zaletą jest to, że wiemy, ile jest botów, po prostu wypisując liczbę konkurujących botów, więc jeśli jest 17 botów (aktualna liczba botów plus ten jeden), wyświetli
17
źródło
Perl (inspektor zdrowia)
Założę się, że możesz zgadnąć, co to robi.
źródło
C ++ (wykształcone zgadywanie)
Już myślałem, że nie dotrzymam terminu, ale dzięki przedłużeniu nadal mogę dodać swój wpis. Ten program kompiluje się z g ++. Program próbuje odgadnąć statystyki pozostałych wpisów i wybrać najmniejszą, która prawdopodobnie nie zostanie wybrana przez żadną inną.
źródło
Perl (Bob)
Zobacz „Bob”, aby dowiedzieć się, jak wywołać.
źródło
Perl (Alice)
Pobiera dane wejściowe podobne do moich innych botów.
źródło
Perl (Ewa)
Całkowicie zmieniłem ten wpis, aby utorować drogę moim innym botom.
Przyjmuje jeden format wejściowy: taki sam jak „Bob” i „Alice”.
źródło
Brainfuck
Cytat z wyzwania:
Cóż, ponieważ PhiNotPi wszedł jeden , pozwól mi wprowadzić inny. Żeby być innym, zrobię to w Brainfuck:
Oczywiście teraz, gdy obstawianie 1 nie jest już wykonalną strategią, oczywistą rzeczą do zrobienia jest obstawienie 2 zamiast tego ...
Edycja: Podziel odpowiedź na dwa dla każdego komentarza, przepisaj oba programy w bardziej interesujących językach.
źródło
Mueller (Scala)
Jeśli znasz Schwarzenbecka i Beckenbauera, na pewno spodziewałeś się Muellera. Tutaj jest. Dużo skorzysta z Beckenbauera i Schwarzenbecka i ma wygrać.
Szczegóły dotyczące uruchamiania i kompilacji: patrz Schwarzenbeck
Teraz bliżej celu.
źródło
Beckenbauer (Scala)
Z pomocą Schwarzenbecka Beckenbauer ma strzelać gole. Bez Schwarzenbecka jest niczym.
Szczegółowe informacje na temat uruchamiania i kompilacji: patrz [Schwarzenbeck] [1]
Edycja: Teraz też grasz głębiej w pokoju.
źródło
Skrypty wsadowe
Moje zgłoszenie daje 5 jako odpowiedź za każdym razem ;-)
źródło
Ósmy nietoperz
Kolejna prosta odpowiedź, daje 8 za każdym razem.
źródło
FivesCancel (PHP)
Anuluje rozwiązanie „always 5” mellamokb.
źródło
EightsCancel (PHP)
Anuluje rozwiązanie „always 8” mellamokb. Przepraszam, mellamokb!
źródło
Python 2.7 - Copycat2
Kopiuje zwycięzcę drugiej ostatniej rundy. O nie! w przeciwnym razie wyjścia 7.
źródło
Skrypt powłoki (głęboka myśl)
OK, aby uzyskać drugą szansę, oto kolejny wpis, tym razem skrypt powłoki (powinien działać z każdą powłoką). To zawsze daje odpowiedź na pytanie o życie, wszechświat i wszystko.
W rzeczywistości ten algorytm nie jest całkowicie poprawny, ponieważ pominąłem opóźnienie 7,5 miliona lat. :-)
źródło
dirichlet.c
Myślę, że przechodzi przez losowe bity zbyt szybko, by je użyć
/dev/random
, jakkolwiek wolałbym. Jeśli ktoś chce przetestować go w systemie Windows, musisz go sam portować, ponieważ nie mam dostępu do okna systemu Windows z kompilatorem C.Racjonalne uzasadnienie
Nie chciałem wyjaśniać logiki stojącej za tym przed zakończeniem turnieju, ale teraz, kiedy zwycięzca został ogłoszony, myślę, że już czas.
Zgodnie z zasadą gołębnika (zwaną także zasadą Dirichleta, stąd nazwa bota), jeśli istnieje N konkurujących botów, wówczas liczba w w [1..1 + N / 2] wygrywa lub wygrałaby, gdyby wybrany. Stwierdzam zatem, że optymalna strategia nie wybierze liczb większych niż 1+ N / 2. Ale jeśli N jest parzyste, wybranie 1+ N / 2 tworzy mniejszy wygrywający slot. Dlatego sloty, które warto wybrać, to [1 .. ( N +1) / 2].
To pozostawia pytanie, jak wybrać miejsce. W przypadku niewielkiej liczby botów sprawdziłem, że istnieje równowaga Nasha, gdy każdy bot wybiera równomiernie spośród kandydatów i mocno podejrzewam, że nadal będzie to prawdą.
Niewielkie odchylenie w strategii tego bota od teoretycznego to po prostu metagaming.
źródło