Програмуйте AI 2048 року, використовуючи існуючі рамки


17

EDIT: Нещодавно моє питання було запропоновано як дублікат Bot Challenge 2048 . Я хотів би підкреслити, що це питання відрізняється від цього питання і вимагатиме відповіді думати інакше, ніж це питання. 2048 Bot Challenge попросив користувача створити бота, і він буде працювати протягом години, найвищий бал - оцінка користувача. Крім того, вона мала обмеження в 555 байт. Моє завдання запускає код набагато рідше, лише 3 рази. Ваш рахунок обчислюється, використовуючи середній бал цих трьох разів і діливши на довжину символів коду для гольфу. Моє запитання заохочує записи бути "розумнішими", а не намагатися отримати найвищий бал грубою силою.

-

EDIT: Метод get змінено на getTile, щоб уникнути конфлікту з ключовим словом get JS. Крім того, додано розділ з високою оцінкою.

Нещодавно я створив сайт, який дозволяє керувати популярною грою 2048 за допомогою JavaScript. Мій сайт пов’язаний тут:

http://thatcoolidea.com/2048

Як:

Редактор тузів розташований над дошкою. Ви розміщуєте в ньому код, який запускається раз на 250 мс або 4 рази на секунду. Це називається циклом.

Використовуйте такі способи управління дошкою. Ви не можете використовувати клавіші зі стрілками.

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

Карта дошки для методу get.

Наступні змінні визначені для вашої зручності:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

Правила:

  • Ніякої випадковості, ви повинні використовувати логіку. (Так, я знаю, що в прикладі код використовується випадковий.)
  • Ніякого підключення до ігрових функцій чи обману інших способів
  • Як правило, спробуйте викликати лише один метод переміщення за цикл. Гаразд, якщо ви використовуєте більше, але це гвинти з анімацією
  • Дошка повинна починатися у випадковому стані, не змінюючи стан перед грою
  • У своєму дописі ви повинні надати як нестиснуту, так і гольф версію коду.
  • Ви повинні надати посилання на сайт, який уже завантажує нестиснену версію вашого коду, що подається через PasteBin (наприклад, ... thatcoolidea.com/2048?i=pH18GWtu завантажує приклад коду.)

Оцінка:

  • Ваш код буде набраний мною.
  • Частина А вашого рахунку - це в середньому 3 прогони коду, округлені вниз.
  • Частина B вашого рахунку - це символьна довжина коду для гольфу.
  • Ваш остаточний бал - частина A, поділена на частину B

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

Удачі! Сподіваюся, вам сподобається виклик.

Поточний високий бал 225,22 - Морозильник - користувач3217109


10
Той факт, що ви написали рамки на 2048 рік, є надзвичайно приголомшливим і дуже зручним для такого типу викликів, але я не бачу, як це насправді впливає на будь-яку стратегію, яка вже знайдена в нашому існуючому завданні AI 2048 року.
Мартін Ендер

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

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

@samweaver додайте примітку до верхньої частини запитання, щоб пояснити, чому відповіді з іншого питання не будуть дійсними / конкурентними для вашого питання, а потім створіть мета-пост для перевірки.
rdans

Якщо ви не можете цього зробити, вам, ймовірно, доведеться змінити виклик, щоб відкрити його, наприклад, правила / оцінка / обмеження
rdans

Відповіді:


6

Синкер / шейкер, 65 байт

Ось моя . Це так само сліпо і просто, як вони приходять.

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

Нестиснений (іш) ...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

Все, що він робить - це повторення вниз, вправо, вниз, вліво тощо, і натискає один раз, якщо воно застрягає. Це не завжди добре, але іноді вийде 512. Мій високий бал під час тестування склав 7520.


Я починаю процес підрахунку балів зараз! Дякуємо за перший запис!
Сем Вівер

Підсумкова оцінка: 67,6! Виконання 1: 3980 Виконання 2: 4080 Виконання 3: 5128 Мені це дуже сподобалось, я не уявляв, що ти можеш отримати такий високий бал з таким маленьким ботом.
Сем Вівер

Дякуємо, що налаштували його! Я думаю, що це досить круто. Сумно, що люди так реагували досі. Отже, користувачі схильні дуже негативно ставитись до повторних питань, як правило, з поважних причин.
krs013

За що дякую! Я ціную підтримку! Цей проект виникла з того часу, коли ми з другом залишилися пізно на роботу одну ніч і хотіли побачити, хто може зробити кращого бота. Я шукав код, але не зміг знайти спосіб зробити це добре. Я створив це за допомогою допоміжних методів, щоб зробити це набагато простіше!
Сем Вівер

3

Світлофор - 23 21 байт

move(frozen&2|eother)

Це посилання.

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

Моє оригінальне, функціонально еквівалентне подання було 23 байти і набрало 182,72:

move((frozen&2)+eother)

Це майже те саме, що я роблю, коли граю швидко, не дивлячись на дошку.
я та мій кіт

Відмінна робота. Виконання 1: 2208 Виконання 2: 1216 Виконання 3: 2336 23 байти Остаточний рахунок: 182,72
Сем Вівер

2

Вир - 37 21 17 байт - Оцінка: 211,22

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

a=a|0;move(a++%4)

Оптимізатор допоміг скоротити aініціалізацію.

Сем допоміг скоротити aініціалізацію, вилучив var.

Безумовно?

var a=a|0;
a++;
move(a%4);

Моя найкраща оцінка за цей AI - 5120.

Морозильна камера - 12 байт - Оцінка: 225,22

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

move(frozen)

Пояснення Джеймса Бонда

Зашифрований код розшифровує, щоб сказати:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

Оптимізатор повинен був бити його розшифрованим кодом. Це могло бути # Оптимізовано.


Ви також повинні насправді визначитись a. Так що слід додати в довжину коду.
Оптимізатор

На жаль, бекенд зберігає змінні через скидання, тому ви можете визначити / ініціалізувати aодин раз і забути про нього, але якщо закрити вкладку / вікно і повернутися до нього, я не думаю, що це більше не працюватиме. Ось чому мені довелося додати біт if (startup) на моєму.
krs013

1
ви можете використовувати var a=a|0;move(a++%4)- 21 байт
Optimizer

Дякую! Я ніколи раніше не використовував JavaScript, тому я буду робити такі помилки ...
Zylviij

Власне, A не потрібно визначати. A визначено в бекенде, тому ви можете посилатися на нього, використовуючи просто, aне роблячи цеvar a
Сем Вівер

1

Вішалка - 20 байт

Офіційний бал: 224,87 - 2 місце на 0,35 бала

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

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

Шаблон ініціалізації завдяки @Optimizer.

У моїх 3 тестових пробігу він набрав 4284, 6352 та 4232, в середньому 4956. Я оновлю, коли буде запущений офіційний тест.


Альтернативна версія, яка виходить із зависання (27 байт):

b=b|0;move(b++%4||b%997&&2)

Не потрібно залишати зависання, рахунок буде просто вимірюватись так, ніби гра закінчилася.
Сем Вівер

Як останній вилазить з висів?
krs013

@ krs013 Останній рухатиметься вгору раз на 4 * 997 циклів, тож якщо вгору - єдиний спосіб рухатися, він рухатиметься вгору.
isaacg

Готча. Мені було цікаво, чи це щось подібне; Я просто не чекав досить довго, я думаю.
krs013

Підсумкова оцінка: 224,87, чудова робота!
Сем Вівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.