Vẽ một đường dẫn được thực hiện bởi các thay đổi hướng


25

Thử thách này diễn ra trên lưới.

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

Đây là 10 x 10, nhưng nó có thể là bất kỳ hình chữ nhật nào.

Có bốn hướng trên lưới này. Lên, xuống, trái và phải.

Nhiệm vụ là vẽ một đường dẫn bắt đầu bằng hướng viết hoa Trong ví dụ này, sẽ đi thẳng lên từ U.

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|   U      |
+----------+

Đường dẫn sẽ đi lên và bao gồm các ký tự dừng hoàn toàn (.), Cho đến khi nó chạm vào tường, khi đó nó sẽ chấm dứt bằng dấu hoa thị (*).

+----------+
|   *      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

Ngoài việc bắt đầu đường dẫn, còn có các bộ thay đổi hướng, được biểu thị bằng một chữ thường viết tắt.

+----------+
|          |
|          |
|          |
|   r.....*|
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

Ngoài ra, một chữ hoa X cho chúng ta một chướng ngại vật sẽ chấm dứt con đường.

+----------+
|          |
|          |
|          |
|          |
|   r...*X |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

Quy tắc

  • Đầu vào là một chuỗi bao gồm một khung, (bao gồm các ký tự |, - và +) chứa các ký tự biểu thị bắt đầu đường dẫn, thay đổi hướng và chướng ngại vật.
  • Mã của bạn nên thêm các ký tự dừng đầy đủ để đi theo đường dẫn được mô tả bởi khởi động và thay đổi hướng và dấu hoa thị khi / nếu đường dẫn gặp tường hoặc chướng ngại vật.
  • Có thể có nhiều đường dẫn bắt đầu.
  • Mã vẫn sẽ chấm dứt mà không có lỗi nếu đường dẫn mô tả một vòng lặp.
  • Nếu một đường dẫn bắt đầu một đường dẫn, nó sẽ hoạt động như một bộ thay đổi hướng.
  • Đó là mã golf, mã byte thấp và không có sơ hở tiêu chuẩn, xin vui lòng.
  • Tôi luôn thích các liên kết đến một thông dịch viên trực tuyến.

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

1: Đơn giản

+----------+
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|   *      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

2: Rẽ phải

+----------+
|          |
|          |
|          |
|   r      |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|   r.....*|
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

3: Ngã tư

+----------+
|          |
|          |
|          |
|   r  d   |
|          |
| u    l   |
|          |
|          |
|   U      |
+----------+


+----------+
| *        |
| .        |
| .        |
| . r..d   |
| . .  .   |
| u....l   |
|   .      |
|   .      |
|   U      |
+----------+

4: 4 Đường giao nhau

+----------+
|      D   |
|          |
|          |
|R         |
|          |
|         L|
|          |
|          |
|   U      |
+----------+


+----------+
|   *  D   |
|   .  .   |
|   .  .   |
|R........*|
|   .  .   |
|*........L|
|   .  .   |
|   .  .   |
|   U  *   |
+----------+

5: Vòng lặp đầu tiên

+----------+
|          |
|          |
|          |
|   r  d   |
|          |
|   u  l   |
|          |
|          |
|   U      |
+----------+

+----------+
|          |
|          |
|          |
|   r..d   |
|   .  .   |
|   u..l   |
|   .      |
|   .      |
|   U      |
+----------+

6: Người khởi xướng là người thay đổi

+----------+
|          |
|          |
|          |
|   L      |
|          |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|*..L      |
|   .      |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

7: Vòng thẳng

+----------+
|          |
|          |
|          |
|          |
|   r  l   |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|          |
|   r..l   |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+

8: Thắt nút

+----------+
|          |
|          |
|          |
|  d  l    |
|   r u    |
|  r u     |
|          |
|          |
|   U      |
+----------+


+----------+
|    *     |
|    .     |
|    .     |
|  d..l    |
|  .r.u    |
|  r.u     |
|   .      |
|   .      |
|   U      |
+----------+

9: Một trở ngại

+----------+
|          |
|          |
|          |
|          |
|   r    X |
|          |
|          |
|          |
|   U      |
+----------+


+----------+
|          |
|          |
|          |
|          |
|   r...*X |
|   .      |
|   .      |
|   .      |
|   U      |
+----------+ 

10: Hình dạng S

+----------+
|r     d   |
|          |
|  XXXXXXXX|
| d      l |
|ul        |
|XXXXXXX   |
|          |
|R       u |
|          |
+----------+


+----------+
|r.....d   |
|.     *   |
|. XXXXXXXX|
|.d......l |
|ul      . |
|XXXXXXX . |
|        . |
|R.......u |
|          |
+----------+

11: Nút 4 chiều

+----------+
|      D   |
|          |
|   r      |
|R    d    |
|          |
|    u    L|
|      l   |
|          |
|   U      |
+----------+


+----------+
|    * D   |
|    . .   |
|   r.....*|
|R....d.   |
|   ....   |
|   .u....L|
|*.....l   |
|   . .    |
|   U *    |
+----------+

12: Giao lộ bận rộn

+----------+
|rrrrr rrrd|
| rlrl     |
|ul rrd    |
|ruX X     |
|udl ll    |
|ull       |
|rlr       |
|rdr  d    |
|Uruull    |
+----------+


+----------+
|rrrrr.rrrd|
|.rlrl    .|
|ul rrd   .|
|ruX.X.   .|
|udl.ll   .|
|ull.     .|
|rlr.     .|
|rdr..d   .|
|Uruull   *|
+----------+

13: Bắt đầu vào cạnh

+----------+
|   U      |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

+----------+
|   U      |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
+----------+

14: Băng qua những con đường chết

+----------+
|          |
|          |
|          |
|      R   |
|          |
|          |
|          |
|          |
|         U|
+----------+


+----------+
|         *|
|         .|
|         .|
|      R..*|
|         .|
|         .|
|         .|
|         .|
|         U|
+----------+

@TFeld Đã thêm, cảm ơn!
AJFaraday

1
Có vẻ như tất cả các thay đổi hướng luôn đạt được trong các trường hợp thử nghiệm của bạn, điều này có thể cho phép đơn giản hóa thuật toán. Tôi đề nghị thêm một trường hợp thử nghiệm trong trường hợp không đúng.
Arnauld

@Arnauld Tôi khá chắc chắn có một số thay đổi hướng không được sử dụng trong trường hợp 12.
AJFaraday


3
Nó được tuyên bố rằng lưới có thể là bất kỳ hình chữ nhật, nhưng tất cả các trường hợp thử nghiệm dường như giống hệt nhau về kích thước và hình dạng.
dạ dày

Câu trả lời:


9

JavaScript (ES6),  191 183  181 byte

Cảm ơn @tsh đã giúp sửa lỗi

Đưa đầu vào như một ma trận các ký tự. Đầu ra bằng cách sửa đổi đầu vào.

f=(a,X,Y,d,n=0)=>a.map((r,y)=>r.map((v,x)=>(a+0)[i=' .*dlurDLUR'.indexOf(v),n]?X?X-x+~-d%2|Y-y+(d-2)%2?0:~i?f(a,x,y,i>2?i&3:d,n+1,r[x]=i?v:'.'):n?a[Y][X]='*':0:i>6&&f(a,x,y,i&3):0))

Hãy thử trực tuyến!

Đã bình luận

f = ( a,                           // a[]  = input matrix
      X, Y,                        // X, Y = coordinates of the previous cell
      d,                           // d    = current direction (0 .. 3)
      n = 0                        // n    = number of iterations for the current path
    ) =>                           //
  a.map((r, y) =>                  // for each row r[] a position y in a[]:
    r.map((v, x) =>                //   for each character v at position x in r[]:
      (a + 0)[                     //
        i = ' .*dlurDLUR'          //     i = index of the character
            .indexOf(v),           //     blocking characters '-', '|' and 'X' gives -1
        n                          //     by testing (a + 0)[n], we allow each cell to be
      ]                            //     visited twice (once horizontally, once vertically)
      ?                            //     if it is set:
        X ?                        //       if this is not the 1st iteration:
          X - x + ~-d % 2 |        //         if x - X is not equal to dx[d]
          Y - y + (d - 2) % 2 ?    //         or y - Y is not equal to dy[d]:
            0                      //           ignore this cell
          :                        //         else:
            ~i ?                   //           if this is not a blocking character:
              f(                   //             do a recursive call:
                a,                 //               pass a[] unchanged
                x, y,              //               pass the coordinates of this cell
                i > 2 ? i & 3 : d, //               update d if v is a direction char.
                n + 1,             //               increment n
                r[x] = i ? v : '.' //               if v is a space, set r[x] to '.'
              )                    //             end of recursive call
            :                      //           else (this is a blocking character):
              n ?                  //             if this is not the 1st iteration:
                a[Y][X] = '*'      //               set the previous cell to '*'
              :                    //             else:
                0                  //               do nothing
        :                          //       else (1st iteration):
          i > 6 &&                 //         if v is a capital letter:
            f(a, x, y, i & 3)      //           do a recursive call with this direction
      :                            //     else ((a + 0)[n] is not set):
        0                          //       we must be in an infinite loop: abort
    )                              //   end of inner map()
  )                                // end of outer map()

btw, [...""+a].mapcó thể tạo một mảng có độ dài ít nhất gấp 2 lần a. Tôi không chắc nếu nó giúp.
tsh

(a+0)[n]không lưu một byte, mặc dù nbây giờ cần phải được khởi tạo.
Arnauld

8

Python 2 , 283 279 293 288 279 byte

e=enumerate
def f(M):
 s=[(x,y,c)for y,l in e(M)for x,c in e(l)if'A'<c<'X'];v=set(s)
 for x,y,C in s:
	d=ord(C)%87%5;q=d>1;X,Y=x-d+q*3,y+~-d-q;c=M[Y][X];N=(X,Y,[C,c]['a'<c<'x'])
	if'!'>c:M[Y][X]='.'
	if(c in'-|X')*('/'>M[y][x]):M[y][x]='*'
	if(c in'udlr. *')>({N}<v):v|={N};s+=N,

Hãy thử trực tuyến!

Đưa ra một danh sách các danh sách.

Đầu ra bằng cách sửa đổi mảng đầu vào.


6

Perl 5, 203 188 166 byte

$l='\K[ a-z](?=';$t='([-|X])?';$s=$_;/
/;$n='.'x"@-";{$_|=s/(?|R[.*]*$l$t)|$t${l}[.*]*L)|D$n(?:[.*]$n)*$l$n$t)|$t$n$l$n([.*]$n)*U))/$&eq$"?$1?'*':'.':uc$&/es?redo:$s}

TIO

Làm thế nào nó hoạt động

  • $s=$_để lưu đầu vào vào $sđể khôi phục các thay đổi chữ thường. $_|=$sbởi vì bitwise hoặc với không gian sẽ không thay đổi .*, các chữ cái viết thường urldsẽ được khôi phục với bitwise hoặc hoạt động.
  • /\n/;$n='.'x"@-"để có được "chiều rộng" và $nđể khớp với bất kỳ lần "chiều rộng" ký tự nào
  • $l='\K[ a-z](?=';$t='([-|X])?'để giảm độ dài regex; $lđể khớp với một chữ cái viết thường urldhoặc một khoảng trắng trên một đường dẫn, $tđể khớp với một dấu kết thúc.

Sau khi thay thế: (?| R[.*]*\K[ a-z](?=([-|X])?) | ([-|X])?\K[ a-z](?=[.*]*L) | D$n(?:[.*]$n)*\K[ a-z](?=$n([-|X])?) | ([-|X])?$n\K[ a-z](?=$n([.*]$n)*U) )

  • chuyển /esang eval, /ssao cho .(bên trong $n) khớp với một ký tự dòng mới
  • $&eq$"?$1?'*':'.':uc$&nếu phù hợp là một không gian, nếu termiator phù hợp *khác .khác chữ hoa.

1
@Arnauld, nó hoạt động nếu bạn nhập một trường hợp thử nghiệm tại một thời điểm.
Xù xì

vâng tôi đã đăng một cách nhanh chóng và không thể kiểm tra nó đã được thiết lập lại $sở chân trang. $sđược sử dụng để lưu đầu vào và để giữ lại các chữ cái viết thường vì được chuyển sang chữ hoa khi vẽ đường dẫn
Nahuel Fouilleul

4

Sạch , 409 byte

import StdEnv,Data.List
q=flatlines
$m=foldl(zipWith\a b|a=='*'||b=='*'='*'=max a b)(q m)[q(foldl(\m(_,y,x)=[[if(b<>x||a<>y)if(k=='*')'.'k'*'\\k<-r&b<-[0..]]\\r<-m&a<-[0..]])m(last(takeWhile(not o hasDup)(inits(f 0y 0x)))))\\l<-m&y<-[0..],c<-l&x<-[0..]|isUpper c]
where f a y b x=let(u,v)=(a+y,b+x)in(case toLower((m!!u)!!v)of' '=[((a,b),u,v):f a u b v];'r'=f 0u 1v;'l'=f 0u -1v;'u'=f -1u 0v;'d'=f 1u 0v;_=[])

Hãy thử trực tuyến!


3

Python 2 , 250 byte

def f(G,e=enumerate):
 for i,k in e(G):
	for j,l in e(k):
	 v=X=x=y=m,=l,
	 while(m in'-X|')<(l in'DLRU')>(X in v):v+=X,;y,x=zip((1,0,0,-1,y),(0,-1,1,0,x))['DLRU dlru'.find(m)%5];G[i][j]=(m,'.*'[G[i+y][j+x]in'-X|'])[m<'!'];i+=y;j+=x;X=x,i,j;m=G[i][j]

Hãy thử trực tuyến!

Đưa ra một danh sách các danh sách các chuỗi 1 char, được OP cho phép rõ ràng.

Thay đổi danh sách tại chỗ.

Để I / O dễ dàng hơn, hãy sử dụng cái này .

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.