Snow Thổi xe của tôi!


8

Gần đây đã có một trận tuyết lớn và đường lái xe của tôi cần có tuyết. Nếu người thổi tuyết đi qua khu vực nào đó đã có tuyết, thì khu vực đó sẽ có tuyết thổi vào đó và cần phải thổi lại. Và tất nhiên, máy thổi tuyết không thể bắt đầu ở giữa đường lái xe, nó cần bắt đầu từ nhà để xe của tôi, nơi nó được cất giữ.

Chính thức hơn:

Chương trình của bạn có một dạng đầu vào tiêu chuẩn dưới dạng một chuỗi hoặc mảng đa chiều trông giống như sau:

XXXXOOOOXXXX
X          X
X          X
XXXXXXXXXXXX

Xđại diện cho một khu vực không thể có tuyết, Ođại diện cho khu vực có thể triển khai máy thổi tuyết và không gian trống đại diện cho các khu vực có tuyết. Bạn có thể chọn các giá trị khác nhau nếu bạn muốn.

Chương trình của bạn phải xuất ra một cái gì đó như sau:

XXXX*%OOXXXX
Xv<<<^<<<<<X
X>>>>>>>>>^X
XXXXXXXXXXXX

Máy thổi tuyết bắt đầu tại *. Các *luôn chỉ vào khoảng trắng không bị gara gần nhất. Các <, >, v, và ^tất cả các đại diện con trỏ về nơi hướng tiếp theo là. Họ chỉ người thổi tuyết đi đâu. Khi một con trỏ chỉ vào %, quạt gió đã quay trở lại nhà để xe, và toàn bộ đường lái xe phải rõ ràng.

Máy thổi tuyết phải đi trên toàn bộ đường lái xe. Con đường của người tuyết không bao giờ có thể chồng lên nhau. Đầu vào bất khả thi không được đưa ra.

Bởi vì tôi không muốn ở bên ngoài lâu hơn tôi cần và không cần phải dành nhiều thời gian để gõ, chương trình nên càng ngắn càng tốt. Mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm:

Những trường hợp thử nghiệm có thể có nhiều câu trả lời đúng. Tôi đã cung cấp các giải pháp có thể bên dưới mỗi trường hợp thử nghiệm.

Trường hợp kiểm tra 1: Một trong những ví dụ được đưa ra.

Trường hợp thử nghiệm 2:

XOOOOOX
X     X
X     X
X     XXXXXXXX
X            X
X            X
XXXXXXXXXXXXXX

X*OOO%X
Xv>>>^X
Xv^<<<X
Xv>>>^XXXXXXXX
Xv^<<<<<<<<<<X
X>>>>>>>>>>>^X
XXXXXXXXXXXXXX

Trường hợp thử nghiệm 3:

XOOOOX
X    X
X    X
X  XXX
X    X
X    X
XXXXXX

XOO%*X
X>>^vX
X^v<<X
X^vXXX
X^>>vX
X^<<<X
XXXXXX

Trường hợp thử nghiệm 4:

XXXXXXXXXXXXX
O           X
O    X      X
O    X      X
O           X
XXXXXXXXXXXXX

XXXXXXXXXXXXX
*>>>>>>>>>>vX
Ov<v<Xv<<<<<X
Ov^v^X>>>>>vX
%<^<^<<<<<<<X
XXXXXXXXXXXXX


2
Chúng ta có thể giả sử rằng 1) các O'sẽ luôn nằm trong một đường thẳng liên tục không? 2) Os sẽ luôn nằm trên cạnh của mảng? 3) rằng sẽ không có không gian hàng đầu? 4) rằng sẽ không có dấu cách (ví dụ trong trường hợp thử nghiệm 2 một số dòng ngắn hơn các dòng khác)?
PurkkaKoodari

@ Pietu1998 Vâng, với tất cả bọn họ.
Đồng chí SparklePony

Câu trả lời:


4

JavaScript (ES6), 346 310 299 298 297 296 283 byte

f=(a,y=0,x=0)=>(a[y][x]?a[y][x]=='O'&&(a[y][x]='*',(g=w=>(w=a[y])&&w[x]&&(w[x]<'!'?g(w[x]='v',y++)||g(w[x++]='>',y--)||g(w[--x]='^',y--)||g(w[x--]='<',y++)||+(w[++x]=' '):w[x]=='O'&&!/ /.test(a)?w[x]='%':0))(y++)||g(y-=2)||g(y++,x++)||g(x-=2)||+(a[y][++x]='O'))||f(a,y,x+1):f(a,y+1))
<textarea id="tests">XXXXOOOOXXXX&#10;X          X&#10;X          X&#10;XXXXXXXXXXXX&#10;&#10;XOOOOOX&#10;X     X&#10;X     X&#10;X     XXXXXXXX&#10;X            X&#10;X            X&#10;XXXXXXXXXXXXXX&#10;&#10;XOOOOX&#10;X    X&#10;X    X&#10;X  XXX&#10;X    X&#10;X    X&#10;XXXXXX&#10;&#10;XXXXXXXXXXXXX&#10;O           X&#10;O    X      X&#10;O    X      X&#10;O           X&#10;XXXXXXXXXXXXX</textarea><br><button onclick="for(test of document.getElementById('tests').value.split('\n\n')){console.log(test);arr=test.split('\n').map(line=>line.split(''));f(arr);console.log(arr.map(line=>line.join('')).join('\n'))}">Run</button>

Khá nhiều hacky ở một số nơi, nhưng tôi muốn lấy mã ra khỏi đó. Nhập dưới dạng mảng ký tự 2D, đầu ra bằng cách sửa đổi mảng đã nói.

Phiên bản ung dung

Đây là cùng một thuật toán chính xác, tiết kiệm cho một số phép thuật trung thực / giả mạo với +' 'việc NaNbị giả mạo (và một số nữa), một số biến golf và sử dụng ifs thay vì ?:, ||&&.

f = (a, y = 0, x = 0) => {         // main function
  if (!a[y][x])                    // check for end of line
    return f(a, y + 1);            // end of line, recursively check next
  if (a[y][x] == 'O') {            // check for valid start position
    a[y][x] = '*';                 // set the start position
    function g() {                 // pathfinder function
      if (!a[y] || !a[y][x])       // check for out of bounds
        return 0;
      if (a[y][x] == ' ') {        // check for snow
        a[y][x] = 'v';             // set current cell to 'down'
        y++;                       // move position down
        if (g()) return 1;         // see if a valid route is found from there
        y--;                       // if not, reset position and try again
        a[y][x] = '>';             // repeat for other directions
        x++;
        if (g()) return 1;
        x--;
        a[y][x] = '^';
        y--;
        if (g()) return 1;
        y++;
        a[y][x] = '<';
        x++;
        if (g()) return 1;
        x++;
        a[y][x] = ' ';             // no route found, reset cell to snow
        return 0;
      }
      if (a[y][x] == 'O'           // check for valid exit
          && !/ /.test(a)) {       // and that no snow is left
        a[y][x] = '%';             // set the exit
        return 1;
      }
    }
    y++;                           // move a cell down from the start position
    if (g()) return 1;             // see if a valid route starts there
    y -= 2;                        // repeat for other directions
    if (g()) return 1;
    y++; x++;
    if (g()) return 1;
    x -= 2;
    if (g()) return 1;
    x++;
    a[y][x] = 'O';                 // no route found, continue on
  }
  return f(a, y, x + 1);           // check the next cell
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.