🐸🐸
Musisz stworzyć najkrótszy program, aby zawsze znaleźć optymalne rozwiązanie dla uproszczonej gry Frogger na siatce 9x9.
Elementy kursu:
L
- Dziennik (długość: 3-4). Gdy wskoczysz na kłodę, niesie cię ona ze sobą.V
- Pojazd (długość: 1-2)- Szybkość (1-2): po lewej stronie rzędu będzie prędkość, z jaką poruszają się elementy w rzędzie.
- Spacje: Zawsze będą przynajmniej dwie spacje między elementami.
- Kierunek: zarówno w sekcjach Pojazd, jak i Dziennik, kierunek ruchu na każdym torze zmienia się między lewą i prawą.
Struktura kursu:
- Jeśli to stolica, idzie dobrze; jeśli jest małe, idzie w lewo. Wszystkie elementy z rzędu idą w tym samym kierunku. Jak tylko część elementu zejdzie z ekranu, pojawi się po przeciwnej stronie ekranu.
- Pierwszy rząd to bezpieczna strefa. Żaba zaczyna się od
F
, czyli zawsze w tym samym miejscu. - Następne 3 rzędy to drogi z pojazdami.
- Następny rząd to bezpieczna strefa.
- Następne 3 rzędy to woda (dotykanie wody == śmierć) z logami.
- Po osiągnięciu linii
W
wygrywasz. - Jeśli żaba umiera, wraca do
F
Kontrola gracza:
L
- LewoR
- DobrzeU
- W góręD
- Na dółW
- Zaczekaj
Po przeprowadzce kolejna klatka przechodzi. (Zauważ, że ramka przechodzi po twoim ruchu, a nie w tym samym czasie, co twój ruch.) Twój program musi dać optymalne rozwiązanie jako ciąg znaków takich jak URWUUL
. Jeśli kurs nie ma rozwiązania, twój program powinien wypisać dane N
.
Przykłady: (Ponieważ zrobiłem to ręcznie, nie wiem, czy są to optymalne rozwiązania).
0WWWWWWWWW 1 lll 2 LLLL 2 llll 0 1 vv vv 1 V V 1 vv 0 F.
Rozwiązanie: WUWUUURWUULWUU
0WWWWWWWWW 2 lll 1 LLLL 1 lll 0 2 vv 1 VV 2 vv 0 F.
Rozwiązanie: WUWUWUUWUUWWUU
0WWWWWWWWW 2 llll 2 LLL 1 llll 0 2 v vv 1 VV VV 1 v v 0 F.
Rozwiązanie: WWUUUURURRWWUUU
0WWWWWWWWW 2 llll 2 LLL 1 lll 0 1 vv v 2 VVV 2 vvv 0 F.
Rozwiązanie: N
(Nie ma możliwości, aby przejść obok pierwszego rzędu).
Przetestuj je we fragmencie, wklejając kurs do pola tekstowego i naciskając „Wczytaj kurs”. Następnie wklej rozwiązanie do „Input” i naciśnij „Prześlij”.
Snippet: Trudno jest tworzyć przypadki testowe, dlatego stworzyłem ten fragment, który pozwala sprawdzić, czy Twój program może rozwiązać losowo generowane kursy. Do celów testowych wszystko, co musisz zrobić, to wprowadzić rozwiązanie swojego programu (np. LRUWL...
) Do sekcji „Dane wejściowe” i nacisnąć „Prześlij”. Aby zresetować kurs do jego pierwotnego stanu, wciśnij „Resetuj”. Daj mi znać, jeśli znajdziesz jakieś błędy.
var timer;
var f_x, f_y;
var replaced;
var copy;
document.body.onkeyup = function(e) {
var a = document.activeElement;
if (a !== controls && a !== data) hop(e.keyCode);
};
function setup() {
stop();
var rows = game.children;
rows[0].innerHTML = "0WWWWWWWWW";
load(logs, "L");
rows[2].innerHTML = "0 ";
load(cars, "V");
rows[4].innerHTML = "0 F ";
copy = game.innerHTML;
save();
f_x = 5;
f_y = 9;
replaced = " ";
}
function save() {
data.value = "";
for (var i = 1; i <= 9; i++) {
data.value += getRow(i).textContent;
if (i < 9) data.value += "\n";
}
}
function extLoad() {
stop();
var rows = data.value.split("\n");
replaced = " ";
for (var i = 0; i < rows.length; i++) {
var r = getRow(i + 1);
r.innerHTML = rows[i].replace(/ /g, " ");
if (rows[i].indexOf("V") !== -1 || rows[i].indexOf("L") !== -1) r.className = "right";
else if (rows[i].indexOf("v") !== -1 || rows[i].indexOf("l") !== -1) r.className = "left";
var f = rows[i].indexOf("F");
if (f !== -1) {
f_y = i + 1;
f_x = f;
}
}
copy = game.innerHTML;
}
function reset() {
stop();
game.innerHTML = copy;
f_x = 5;
f_y = 9;
replaced = " ";
}
function play() {
if (!timer) {
timer = setInterval(next, 1500);
}
}
function stop() {
if (timer) {
clearInterval(timer);
timer = null;
}
}
function input(i) {
var s = controls.value;
if (i === 0) {
stop();
sub.disabled = true;
}
if (s[i] === "L") hop(65);
else if (s[i] === "U") hop(87);
else if (s[i] === "R") hop(68);
else if (s[i] === "D") hop(83);
next();
if (i < s.length - 1) setTimeout(function() {
input(i + 1);
}, 750);
else sub.disabled = false;
}
function load(part, code) {
for (var r = 0; r < 3; r++) {
var row = part.children[r];
var s = "";
var dir = r % 2;
row.className = dir === 1 ? "right" : "left";
s += Math.floor(Math.random() * 2) + 1;
var end = 0;
for (var c = 0; c < 9-end;) {
var spaces = Math.min(9 - end - c , Math.floor(Math.random() * 2) + 2);
if(c === 0 && end===0) {
spaces = Math.floor(Math.random()*4);
end = Math.max(0,2-spaces);
}
s += " ".repeat(spaces);
c += spaces;
var type = "";
var len = 0;
var rand = Math.floor(Math.random() * 2);
if (code === "L") {
type = dir === 1 ? "L" : "l";
len = rand + 3;
} else {
type = dir === 1 ? "V" : "v";
len = rand + 1;
}
if (c + len > 9-end) continue;
s += type.repeat(len);
c += len;
}
row.innerHTML = s + " ".repeat(end);
}
}
function next() {
move(logs);
move(cars);
}
function move(part) {
var rows = part.children;
for (var i = 0; i < rows.length; i++) {
var s = rows[i].textContent;
var f = s.indexOf("F") !== -1;
if (f) {
replace(f_y, f_x, false);
s = rows[i].textContent;
}
var speed = s[0];
var stuff = s.substring(1);
var v = vel(speed, rows[i].className);
rows[i].textContent = s[0] + shift(stuff, speed, rows[i].className);
if (f) {
if (part === logs) {
f_x += v;
if (f_x < 1 || f_x > 9) {
go(5 - f_x, f_y - 9);
return;
}
}
replace(f_y, f_x, true);
s = rows[i].textContent.substring(1);
var c = f_x + v;
var t = "";
if (c > 9) t = s.substring(f_x) + s.substring(0, c - 9);
else if (c < 0) t = s.substring(0, f_x) + s.substring(9 + c);
else t = v > 0 ? s.substring(f_x, c) : s.substring(c, f_x);
if (t.indexOf("V") !== -1 || t.indexOf("v") !== -1) {
go(5 - f_x, f_y - 9);
}
}
}
}
function vel(mag, dir) {
var d = dir === "right" ? 1 : -1;
var m = parseInt(mag);
return d * m;
}
function shift(s, n, d) {
n = parseInt(n);
for (var i = 0; i < n; i++) {
if (d === "left") {
s = s.substring(1) + s.substring(0, 1);
} else {
s = s.substring(s.length - 1) + s.substring(0, s.length - 1);
}
}
return s;
}
function hop(k) {
if (k === 65) go(-1, 0);
else if (k === 87) go(0, 1);
else if (k === 68) go(1, 0);
else if (k === 83) go(0, -1);
}
function go(x, y) {
replace(f_y, f_x, false);
f_y -= y;
f_x += x;
replace(f_y, f_x, true);
if (f_x < 1 || f_x > 9 || f_y > 9) {
go(5 - f_x, f_y - 9);
return;
}
if (f_y == 1) {
alert("win!");
go(5 - f_x, f_y - 9);
}
}
function replace(y, x, f) {
var row = getRow(y);
if (!row) return false;
var s = row.textContent;
if (x < 1 || x >= s.length) return false;
if (f) {
replaced = s[x];
if (replaced === "V" || replaced === "v" || (replaced.charCodeAt(0) === 160 && y < 5)) {
go(5 - f_x, f_y - 9);
} else {
row.textContent = s.substring(0, x) + "F" + s.substring(x + 1);
}
} else {
row.textContent = s.substring(0, x) + replaced + s.substring(x + 1);
}
}
function getRow(y) {
if (y < 1 || y > 9) return false;
if (y === 1) return game.firstChild;
if (y === 9) return game.lastChild;
if (y > 5) return cars.children[y - 6];
if (y < 5) return logs.children[y - 2];
return game.children[2];
}
<body onload="setup()"><code id="game"><div></div><div id="logs"><div></div><div></div><div></div></div><div></div><div id="cars"><div></div><div></div><div></div></div><div></div></code>
<input type="button" value="Step" onclick="next()" />
<input type="button" value="Pause" onclick="stop()" />
<input type="button" value="Play" onclick="play()" />
<input type="button" value="Reset" onclick="reset()" />
<input type="button" value="New Course" onclick="setup()" />
<div>Controls: WASD</div>
<div>Input:
<input type="text" id="controls" />
<input type="submit" onclick="input(0)" id="sub" />
</div>
<div>
<textarea id="data" rows=9 cols=12></textarea>
<input type="button" onclick="extLoad()" value="Load Course" />
<input type="button" onclick="save()" value="Save Course" />
</div>
</body>
Gdzie zacząć:
Związane z:
Zobacz też:
źródło
WWUUUURURRWWUUU
-> Chewie w frogger.Odpowiedzi:
JavaScript, 854 bajty
Nie golfił
Testuję tylko dla przykładu Up, Wait i Right w tym przykładzie, aby przyspieszyć:
JSFiddle
źródło