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

Sam Weaver
źródło
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.

krs013
źródło
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)
ja i mój kot
źródło
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.

Zylviij
źródło
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)
isaacg
źródło
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