Фон
Гра Морра - це проста гра. У "оригінальній" версії декілька гравців одночасно викидають число 0-5 руками, при цьому вгадуючи загальну суму рук усіх. Версія, яку я використовую тут, була змінена для збільшення потенціалу нетривіальної стратегії, і вона описана нижче:
- Є два гравці.
- Як і в ножицях-гойдалках, гравці рухаються одночасно.
- Кожен виток, кожен гравець вибирає число 0-5, а також здогадується, що противники вибирають 0-5. Це означає, що на кожен виток виводяться два числа. Для уточнення виведення обох чисел повинно бути в діапазоні 0-5 включно.
- Якщо ви здогадалися про вибір вашого опонента, але ваш опонент не здогадався правильно, ви наберете певну кількість очок, рівну сумі двох зіграних чисел. Наприклад, якби відіграні числа були 3 та 5, правильна здогадка була б вартістю 8 балів.
- Якщо обидва або обидва гравці правильно не здогадуються, бали не присвоюються.
- Людина з найбільшою кількістю очок після 1000 раундів виграє цю гру.
Турнір
Турнір буде проходити в стилі круглобільний і проводитимуться шляхом створення кожного можливого пари учасника. За кожну перемогу учасник отримує 2 очки перемоги. Кожен нічия призводить до 1 очки перемоги. Не втрачаються очки перемоги за програш.
Інтуїтивно переможцем турніру стає той учасник, який отримав найбільшу кількість очок перемог проти інших.
Як ввести
Існуватиме два методи подання ботів на змагання. Перший і набагато кращий метод - це реалізувати інтерфейс Java, що постачається контролером. Другий метод - написання незалежної програми.
Давайте спочатку розглянемо метод Java. Інтерфейс вам необхідно буде здійснити це Player
і визначає два методи: public String getName()
ідентифікує бот, і public int[] getMove(String[] args)
приймає args
як масив з шести рядків, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Приклад:
042 045 0 324 432 6
Це означає, що я вибрав 0 у першому раунді і здогадався, що мій опонент збирається кинути 0. Мій опонент кинув 3 і здогадався, що я кину 4. У третьому раунді мій опонент зробив правильну здогадку, що я кину a 2, тобто він набирає 2 + 4 = 6 балів.
Ваш метод поверне масив з двох цілих чисел, які є вашим вибором та здогадкою відповідно. Приклад - {4,2}
вибір 4 та здогадка 2.
Ось приклад повного Java-бота, написаного як метод. Якщо ви хочете, у вашій заяві має бути вказано лише те, що відбувається в getMove
методі.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Як незалежна програма
Наразі я обмежений у підтримці додаткових мов. Крім Java, я можу приймати програми, написані на Python 3.4, Perl 5 або Ruby 2.1.5. Якщо є мова, якої, здається, хоче кілька людей, я докладу всіх зусиль, щоб додати її.
Вхід до вашої програми буде аргументами в командному рядку. Це могло виглядати так:
perl awesomebot.plx 042 045 0 324 432 6
Вихід вашої програми повинен бути вашим вибором, а потім - ваші здогадки, за якими слід пробіл.
Будь ласка, включіть у свою відповідь точну команду, необхідну для її виконання. Майте на увазі, що у мене працює Windows 8.1.
Додаткові правила
Збереження стану та очікування
Вашій програмі буде дозволено створити один текстовий файл у локальному каталозі, де ви можете зберігати інформацію. Ця інформація зберігатиметься протягом усього турніру, але потім буде видалена. Дайте файлу ім’я, яке я можу визначити.
Існує обмеження часу в 500 мілісекунд, щоб ваш код відповів. Невідповідь у встановлений термін (або надання недійсного кроку) призведе до конфіскації саме цього поєдинку. Наразі Java-повідомлення мають пасивний час очікування (який я можу оновити до активного), тоді як подання, яке не є Java, має активний час очікування, коли процес закінчується через 500 мілісекунд.
Більше правил подання
- Вам дозволено кілька заявок, якщо вони дотримуються правил і не позначають команду.
- Кожен запис повинен бути унікальним. Ви не можете зробити точну копію логіки іншого бота іншою мовою.
- Боти не можуть взаємодіяти один з одним (формувати будь-яку команду).
- Ви не можете використовувати логіку інших ботів всередині вашого бота, щоб, скажімо, визначити свого конкурента і передбачити його дії. Можна, звичайно, спробувати визначити стратегію свого опонента.
- Не намагайтеся возитися з контролером, іншими учасниками чи моїм комп’ютером. Не підключайтеся до зовнішніх джерел інформації.
Контролер
Поточну версію контролера можна знайти тут . Він написаний на Java 8. Файл "Турнір" є основним контролером, який також містить список учасників (якщо ви хочете влаштувати власні змагання).
Таблиця лідерів
Мені не вдалося дуже часто оновлювати таблицю лідерів. Я досить зайнятий цими вихідними. Під "досить зайнятим" я маю на увазі відсутність доступу до комп'ютера з 6:30 ранку до 21:30. Ось результати після 5 пробіжок. Бот "Ехо" чомусь продовжував утримувати форфетінг (можливо, я винен, я ще не розслідував).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Кредит
Велике спасибі Рейнболту та Пітеру Тейлору за допомогу з контролером.