EDIT: Vor kurzem wurde meine Frage als Duplikat von 2048 Bot Challenge vorgeschlagen . Ich möchte betonen, dass sich diese Frage von dieser Frage unterscheidet und dass die Antworten anders gedacht werden müssen als diese Frage. 2048 Bot Challenge hat den Benutzer gebeten, einen Bot zu erstellen. Dieser wird eine Stunde lang ausgeführt, wobei die höchste Punktzahl die Punktzahl des Benutzers ist. Darüber hinaus hatte es ein Limit von 555 Bytes. Meine Challenge führt den Code viel seltener aus, nur dreimal. Ihre Punktzahl wird berechnet, indem Sie die durchschnittliche Punktzahl dieser drei Male verwenden und durch die Zeichenlänge Ihres Golf-Codes dividieren. Meine Frage ermutigt die Teilnehmer, "schlauer" zu sein und nicht zu versuchen, die höchste Punktzahl mit roher Gewalt zu erzielen.
-
BEARBEITEN: Die get-Methode wurde in getTile geändert, um Konflikte mit dem JS-Schlüsselwort get zu vermeiden. Zusätzlich wurde ein Highscore-Bereich hinzugefügt.
Kürzlich habe ich eine Site erstellt, mit der das beliebte Spiel 2048 mit JavaScript gesteuert werden kann. Meine Seite ist hier verlinkt:
Wie:
Ein Ass-Editor befindet sich über der Tafel. Sie platzieren Code darin, der einmal alle 250 ms oder viermal pro Sekunde ausgeführt wird. Dies nennt man einen Zyklus.
Verwenden Sie die folgenden Methoden, um die Karte zu steuern. Sie können die Pfeiltasten nicht verwenden.
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
Die folgenden Variablen werden zur Vereinfachung definiert:
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
Regeln:
- Keine Zufälligkeit, Sie müssen Logik verwenden. (Ja, ich weiß, dass der Beispielcode zufällig verwendet wird.)
- Kein Hängenbleiben an den Spielfunktionen oder Betrügen auf andere Weise
- Versuchen Sie im Allgemeinen, nur eine Verschiebungsmethode pro Zyklus aufzurufen. Es ist in Ordnung, wenn Sie mehr verwenden, aber es passt zur Animation
- Das Brett muss in einem zufälligen Zustand beginnen, keine Änderung des Zustands vor dem Spiel
- Sie müssen sowohl die unkomprimierte als auch die Golf-Version des Codes in Ihrem Beitrag angeben.
- Sie müssen einen Link zu der Site bereitstellen, die bereits die unkomprimierte Version Ihres Codes lädt, die über PasteBin bereitgestellt wird. (Beispiel: ... thatcoolidea.com/2048?i=pH18GWtu lädt den Beispielcode.)
Wertung:
- Ihr Code wird von mir bewertet.
- Teil A Ihrer Punktzahl ist ein Durchschnitt von 3 Läufen des Codes, abgerundet.
- Teil B Ihrer Punktzahl ist die Zeichenlänge Ihres Golf-Codes.
- Ihre endgültige Punktzahl ist Teil A geteilt durch Teil B
Der Code des Gewinners wird auf Wunsch als Beispielcode auf der Site verewigt und in einem Kommentar im Code bestätigt.
Viel Glück! Ich hoffe, Sie genießen die Herausforderung.
Aktueller Höchststand 225.22 - Gefrierschrank - user3217109
quelle
Antworten:
Sinker / Shaker, 65 Bytes
Hier ist meins . Es ist so blind und einfach wie sie kommen.
Unkomprimiert (ish) ...
Alles, was es tut, ist, nach unten, rechts, unten, links usw. zu wiederholen und einmal zu schlagen, wenn es stecken bleibt. Es funktioniert nicht immer sehr gut, aber es wird gelegentlich 512s bekommen. Mein Highscore beim Testen war 7520.
quelle
Ampel -
2321 BytesDas ist die Verbindung.
Dieser bewegt sich abwechselnd nach oben und rechts, es sei denn, das Brett ist in den letzten beiden Zügen stationär geblieben. In diesem Fall bewegt es sich nach unten bzw. links.
Meine ursprüngliche, funktional äquivalente Übermittlung war 23 Bytes lang und erzielte 182,72:
quelle
Whirlpool -
372117 Bytes - Ergebnis: 211,22Ich entschied mich für einen Ansatz mit dem Motto "Weniger ist mehr". Mein Code ist ein einfaches Design, das versucht, nach oben, rechts, unten, links zu gehen. Ich werde an einer lernenden KI arbeiten, um einen optimaleren Weg zu finden, sich dem Puzzle zu nähern.
Das Optimierungsprogramm hat dazu beigetragen, die
a
Initialisierung zu verkürzen .Sam half bei der Verkürzung
a
der Initialisierung, entferntvar
.Ungolfed?
Meine Höchstpunktzahl mit dieser KI ist 5120.
Gefrierschrank - 12 Bytes - Score: 225,22
Dieser Bot hat Bewegungspriorität. Es versucht zu steigen. Wenn es hoch gehen kann, geht es richtig. Wenn es nicht richtig geht, geht es runter. Wenn es nicht runter geht, geht es nach links.
James Bond Erklärung
Der verschlüsselte Code entschlüsselt zu sagen:
Der Optimierer hätte seinen entschlüsselten Code spielen sollen. Dies könnte #Optimiert worden sein.
quelle
a
. Das sollte also in der Codelänge hinzugefügt werden.a
und vergessen können, aber wenn Sie die Registerkarte / das Fenster schließen und darauf zurückkommen, wird es meiner Meinung nach nicht mehr funktionieren. Aus diesem Grund musste ich mein if-Bit (Startup-Bit) hinzufügen.var a=a|0;move(a++%4)
- 21 Bytesa
ohne weiteres referenzieren könnenvar a
Aufhänger - 20 Bytes
Offizielle Wertung: 224,87 - 2. Platz mit 0,35 Punkten
Dieser Bot benutzt den Abwärts-, Links-, Abwärts-, Rechts-Ansatz, aber mit der ungewöhnlichen Eigenschaft, dass er sich niemals nach oben bewegt. Ich bin nicht sicher, wie ich Fälle bewerten soll, in denen es hängt und nicht abgeschlossen ist, oder ob die Tatsache, dass dies auftritt, es illegal macht. Hier ist es jedoch:
Initialisierungsmuster dank @Optimizer.
In meinen drei Testläufen wurden im Durchschnitt 4284, 6352 und 4232 Punkte erzielt, was 4956 Punkten entspricht.
Alternative Version, die nicht mehr reagiert (27 Byte):
quelle