| Bytes | Lang | Time | Link |
|---|---|---|---|
| 854 | Javascript | 190414T092307Z | jdt |
Javascript, 854 bytes
function f(w){h=[];z=[];for(y=0;y<9;y++){l=w.split('\n')[y];r={s:parseInt(l[0]),d:1,e:[]};for(x=0;x<9;x++){c=l[1+x];if(c=='v'||c=='l')r.d=-1;r.e.push(c);}z.push(r);}h.push(z);h.push(z);for(g=2;g<40;g++){z=JSON.parse(JSON.stringify(z));for(y=0;y<9;y++){r=z[y];if(r.s>0&&(g%2==0||r.s==2)){i=0;t=0;if(r.d==-1){t=r.e[0];for(i=0;i<8;i++)r.e[i]=r.e[i+1];r.e[i]=t;}else{t=r.e[8];for(i=8;i>0;i--)r.e[i]=r.e[i-1];r.e[i]=t;}}}h.push(z);}j=15;k="";m(0,4,8,"","");return k==""?"N":k;function m(s,a,b,u,v){if(s<j){q={'U':[0,-1],'D':[0,1],'L':[-1,0],'R':[1,0]}[u];if(q)a+=q[0],b+=q[1];v+=u;if(!b){j=s;k=v;return;}if(s>0){for(i=0;i<3;i++){z=h[s*2+i-2];r=z[b];if(i&&(i==1||r.s==2)&&r.e[a].toUpperCase()=='L')a+=r.d;if(a<0||a>8||b>8)return;z=h[s*2+i-1];e=z[b].e;if(e[a].toUpperCase()=='V'||(b<4&&e[a].toUpperCase()!='L'))return;}}t="UWRLD";for(x in t)m(s+1,a,b,t[x],v);}}}
Ungolfed
function solve(input) {
var grids = [];
var maxgrid = 40;
// load input
var grid = [];
var lines = input.split('\n');
for (var y = 0; y < 9; y++) {
var line = lines[y];
var row = {
speed: parseInt(line[0]),
direction: 1,
cells: []
}
for (var x = 0; x < 9; x++) {
var c = line[1 + x];
if (c == 'v' || c == 'l')
row.direction = -1;
row.cells.push(c);
}
grid.push(row);
}
grids.push(grid);
grids.push(grid);
// animate grids
for (var g = 2; g < maxgrid; g++) {
grid = JSON.parse(JSON.stringify(grid));
for (var y = 0; y < 9; y++) {
var row = grid[y];
if (row.speed > 0 && (g % 2 == 0 || row.speed == 2)) {
if (row.direction == -1) {
var i, temp = row.cells[0];
for (i = 0; i < 8; i++)
row.cells[i] = row.cells[i + 1];
row.cells[i] = temp;
}
else {
var i, temp = row.cells[8];
for (i = 8; i > 0; i--)
row.cells[i] = row.cells[i - 1];
row.cells[i] = temp;
}
}
}
grids.push(grid);
}
var best = 15;
var best_moves = "";
var forceExit = false;
move(0, 4, 8, "", "");
return best_moves == "" ? "N" : best_moves;
function move(step, fx, fy, dir, moves) {
if (step >= best)
return "die";
switch (dir) {
case 'U':
fy--;
break;
case 'D':
fy++;
break;
case 'L':
fx--;
break;
case 'R':
fx++;
break;
}
if (dir != '')
moves += dir;
if (fy == 0) {
best = step;
best_moves = moves;
return "win";
}
if (step > 0) {
for (var i = 0; i < 3; i++) {
var grid = grids[step * 2 + i - 2];
if (i > 0 && (i == 1 || row.speed == 2)) {
var row = grid[fy];
if (row.cells[fx].toUpperCase() == 'L')
fx += row.direction;
}
if (fx < 0 || fx > 8 || fy > 8)
return "die";
var grid = grids[step * 2 + i - 1];
var cells = grid[fy].cells;
if (cells[fx].toUpperCase() == 'V')
return "die";
if (fy < 4 && cells[fx].toUpperCase() != 'L')
return "die";
}
}
move(step+1, fx, fy, 'U', moves);
move(step+1, fx, fy, 'W', moves);
move(step+1, fx, fy, 'R', moves)
move(step+1, fx, fy, 'L', moves);
move(step+1, fx, fy, 'D', moves)
}
}
I'm only testing for Up, Wait and Right in the example to speed things up: