Zaprogramuj AI 2048 przy użyciu istniejącego środowiska


17

EDYCJA: Ostatnio moje pytanie zostało zaproponowane jako duplikat 2048 Bot Challenge . Chciałbym podkreślić, że to pytanie różni się od tego pytania i wymaga przemyślenia odpowiedzi inaczej niż to pytanie. 2048 Bot Challenge poprosił użytkownika o utworzenie bota, który będzie uruchamiany przez godzinę, przy czym najwyższy wynik to wynik użytkownika. Dodatkowo miał limit 555 bajtów. Moje wyzwanie uruchamia kod znacznie rzadziej, tylko 3 razy. Twój wynik jest obliczany na podstawie średniego wyniku z tych trzech razy i podzielenia przez długość znaków kodu golfowego. Moje pytanie zachęca wpisy do bycia „mądrzejszymi” i nie próbowania uzyskiwania najwyższego wyniku brutalną siłą.

-

EDYCJA: Metoda get została zmieniona na getTile, aby uniknąć konfliktu ze słowem kluczowym JS get. Dodatkowo dodano sekcję z wysokim wynikiem.

Niedawno stworzyłem witrynę, która pozwala kontrolować popularną grę 2048 za pomocą JavaScript. Moja witryna jest połączona tutaj:

http://thatcoolidea.com/2048

W jaki sposób:

Edytor asów znajduje się nad planszą. Umieszczasz w nim kod, który jest uruchamiany raz na 250 ms lub 4 razy na sekundę. To się nazywa cykl.

Użyj następujących metod do sterowania tablicą. Nie możesz używać klawiszy strzałek.

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

Mapa tablicy dla metody get.

Dla Twojej wygody zdefiniowano następujące zmienne:

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

Zasady:

  • Bez przypadkowości, musisz użyć logiki. (Tak, wiem, że przykładowy kod używa losowo).
  • Żadnego zaczepiania się w funkcje gry ani oszukiwania w inny sposób
  • Ogólnie rzecz biorąc, spróbuj wywołać tylko jedną metodę ruchu na cykl. Jeśli używasz więcej, jest w porządku, ale wkręca się w animację
  • Plansza musi rozpocząć się w losowym stanie, bez modyfikacji stanu sprzed gry
  • W swoim poście musisz podać zarówno nieskompresowaną, jak i golfową wersję kodu.
  • Musisz podać link do strony, która już ładuje nieskompresowaną wersję twojego kodu, udostępnianą przez PasteBin (na przykład ... thatcoolidea.com/2048?i=pH18GWtu ładuje przykładowy kod).

Punktacja:

  • Twój kod zostanie oceniony przeze mnie.
  • Część A twojego wyniku to średnio 3 serie kodu, zaokrąglone w dół.
  • Część B twojego wyniku to długość znaków twojego golfowego kodu.
  • Twój końcowy wynik to Część A podzielona przez Część B

Zwycięzca zostanie unieśmiertelniony jako przykładowy kod na stronie, jeśli sobie tego życzy, i potwierdzony w komentarzu do kodu.

Powodzenia! Mam nadzieję, że podoba Ci się wyzwanie.

Aktualny najlepszy wynik 225,22 - Zamrażarka - użytkownik3217109


10
Fakt, że napisałeś platformę dla 2048, jest całkiem niesamowity i bardzo wygodny dla tego rodzaju wyzwań, ale nie rozumiem, jak faktycznie wpływa na którąkolwiek ze strategii już istniejących w naszym obecnym wyzwaniu AI 2048.
— Martin Ender

3
Powiedziałbym, że mój jest inny, po prostu dlatego, że musisz użyć jednej bazy kodu, która będzie taka sama przy każdym wykonaniu. Jest to o wiele bardziej przyjazne dla użytkownika i nie sądzę, aby stanowiło duplikat.
— Sam Weaver,

2
Drugie pytanie wygląda na martwe. Były tylko cztery odpowiedzi i limit godziny, więc odpowiem, bo to wygląda naprawdę fajnie.
— krs013,

@samweaver dodaj notatkę na górze pytania, aby wyjaśnić, dlaczego odpowiedzi z drugiego pytania nie będą ważne / konkurencyjne dla twojego pytania, a następnie utwórz meta post do kontroli.
— rdans

Jeśli nie możesz tego zrobić, prawdopodobnie będziesz musiał zmienić swoje wyzwanie, aby je ponownie otworzyć, np. Zasady / punktacja / ograniczenia
— rdans

Odpowiedzi:


6

Sinker / Shaker, 65 bajtów

Oto moje . Jest tak ślepy i prosty, jak to tylko możliwe.

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

Bez kompresji (ish) ...

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

Wszystko, co robi, to powtarza w dół, w prawo, w dół, w lewo itp. I uderza w górę, jeśli utknie. Nie zawsze radzi sobie bardzo dobrze, ale czasami dostaje 512 sekund. Mój najlepszy wynik podczas testów wynosił 7520.


Teraz zaczynam proces oceniania! Dzięki za pierwszy wpis!
— Sam Weaver,

Wynik końcowy: 67,6! Run 1: 3980 Run 2: 4080 Run 3: 5128 Naprawdę mi się podobało, nie wyobrażałem sobie, że można uzyskać tak wysoki wynik z tak małym botem.
— Sam Weaver,

Dziękujemy za konfigurację! Myślę, że to całkiem fajne. To smutne, że ludzie do tej pory tak zareagowali. Użytkownicy SO zwykle bardzo negatywnie podchodzą do duplikatów pytań, zwykle z dobrych powodów.
— krs013,

Dlaczego dziękuję! Doceniam wsparcie! Ten projekt powstał, gdy pewnej nocy spaliśmy z przyjacielem w pracy i chcieliśmy zobaczyć, kto mógłby zrobić lepszego bota. Przeszukałem kod, ale nie mogłem znaleźć sposobu, aby zrobić to dobrze. Zbudowałem to za pomocą metod pomocniczych, aby było to o wiele łatwiejsze!
— Sam Weaver,

3

Sygnalizacja świetlna - 23 21 bajtów

move(frozen&2|eother)

To jest link.

Będzie się poruszać naprzemiennie w górę i w prawo, z wyjątkiem sytuacji, gdy tablica pozostanie nieruchoma przez ostatnie dwa ruchy, w którym to przypadku przesunie się odpowiednio w dół i w lewo.

Moje oryginalne, funkcjonalnie równoważne zgłoszenie miało 23 bajty i otrzymało 182,72:

move((frozen&2)+eother)

To jest prawie to samo, co robię, gdy gram szybko, bez patrzenia na planszę.
— ja i mój kot

Wspaniała robota. Przebieg 1: 2208 Przebieg 2: 1216 Przebieg 3: 2336 23 bajty Wynik końcowy: 182,72
— Sam Weaver

2

Whirlpool - 37 21 17 bajtów - Wynik: 211,22

Zdecydowałem się na podejście „mniej znaczy więcej”. Mój kod jest prostym projektem, który próbuje iść w górę, w prawo, w dół, w lewo ... Będę pracował nad uczącą się sztuczną inteligencją, aby znaleźć bardziej optymalny sposób podejścia do układanki.

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

Optymalizator pomógł skrócić ainicjalizację.

Sam pomógł skrócić ainicjalizację, usunięty var.

Nie golfowany?

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

Mój najlepszy wynik w tym AI to 5120.

Zamrażarka - 12 bajtów - Wynik: 225,22

Ten bot ma priorytet ruchu. Próbuje wejść w górę. Jeśli może pójść w górę, idzie w prawo. Jeśli nie może pójść dobrze, spada. Jeśli nie może spaść, idzie w lewo.

move(frozen)

James Bond Wyjaśnienie

Zaszyfrowany kod deszyfruje, mówiąc:

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);
  }
}

Optymalizator powinien był odegrać w golfa swój odszyfrowany kod. To mogło być #Optimized.


Musisz też zdefiniować a. Należy to dodać do długości kodu.
— Optymalizator

Niestety backend zachowuje zmienne poprzez resetowanie, więc możesz araz zdefiniować / zainicjować i zapomnieć o tym, ale jeśli zamkniesz kartę / okno i wrócisz do niego, nie sądzę, aby to działało. Dlatego musiałem dodać bit if (startup) do mojego.
— krs013,

1
możesz użyć var a=a|0;move(a++%4)- 21 bajtów
— Optymalizator

Dziękuję Ci! Nigdy wcześniej nie korzystałem z javascript, więc popełniam takie błędy ...
— Zylviij

W rzeczywistości A nie musi być definiowane. A jest zdefiniowane w backend, więc możesz się do niego odwoływać, używając tylko abez robieniavar a
— Sam Weaver

1

Wieszak - 20 bajtów

Oficjalny wynik: 224,87 - 2 miejsce o 0,35 punktu

Ten bot używa podejścia w dół, w lewo, w dół, w prawo, ale z niezwykłą funkcją, że nigdy się nie podniesie. Nie jestem pewien, jak oceniać przypadki, w których się zawiesza i nie kończy, ani czy fakt, że to się dzieje, czyni to nielegalnym. Oto jednak:

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

Wzór inicjalizacji dzięki @Optimizer.

W moich 3 przebiegach testowych uzyskał 4284, 6352 i 4232, średnio 4956. Będę aktualizować po uruchomieniu oficjalnego testu.


Alternatywna wersja, która się zawiesza (27 bajtów):

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

Nie musisz zawieszać się, wynik będzie po prostu mierzony tak, jakby gra się skończyła.
— Sam Weaver

Jak ten ostatni wychodzi z zawieszeń?
— krs013

@ krs013 Ostatni z nich przesunie się raz na 4 * 997 cykli, więc jeśli w górę jest jedynym sposobem poruszania się, przesunie się w górę.
— isaacg

Gotcha Zastanawiałem się, czy to coś takiego; Chyba po prostu nie czekałem wystarczająco długo.
— krs013

Wynik końcowy: 224,87, świetna robota!
— Sam Weaver
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.