Gambarlah jalan yang dibuat oleh pengubah arah

25

Tantangan ini terjadi di grid.

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

Yang ini 10 x 10, tetapi bisa berupa bentuk persegi panjang.

Ada empat arah di kisi ini. Atas, bawah, kiri dan kanan.

Tugasnya adalah menggambar jalur yang dimulai dengan huruf besar arah awal. Dalam contoh ini, akan naik langsung dari U.

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

Path akan naik ke atas dan terdiri dari karakter full-stop (.), Hingga menyentuh dinding, ketika akan diakhiri dengan tanda bintang (*).

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

Selain path dimulai, ada juga pengubah arah, diwakili oleh awal arah huruf kecil.

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

Juga, huruf besar X kita hambatan yang akan mengakhiri jalan.

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

Aturan

  • Input adalah string yang terdiri dari bingkai, (terdiri dari |, - dan + karakter) yang berisi karakter yang menunjukkan lintasan mulai, pengubah arah, dan rintangan.
  • Kode Anda harus menambahkan karakter berhenti penuh untuk mengikuti jalur yang dijelaskan oleh permulaan dan pengubah arah, dan tanda bintang ketika / jika jalan tersebut bertemu dengan tembok atau rintangan.
  • Mungkin ada beberapa jalur yang dimulai.
  • Kode masih akan berhenti tanpa kesalahan jika path menggambarkan loop.
  • Jika jalur memenuhi jalur awal, itu akan bertindak sebagai pengubah arah.
  • Tolong kode golf, kode byte rendah dan tidak ada celah standar.
  • Saya selalu lebih suka tautan ke juru bahasa online.

Uji Kasus

1: Sederhana

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


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

2: Belok kanan

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


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

3: Persimpangan

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


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

4: 4 Persimpangan jalan

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


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

5: Loop Pertama

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

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

6: Pemula sebagai pengubah

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


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

7: Loop Lurus

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


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

8: Knot Ketat

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


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

9: Sebuah Hambatan

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


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

10: S Shape

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


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

11: Simpul 4-Arah

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


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

12: Persimpangan Sibuk

+----------+
|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: Mulai Ke Tepi

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

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

14: Melintasi Jalan Mati

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


+----------+
|         *|
|         .|
|         .|
|      R..*|
|         .|
|         .|
|         .|
|         .|
|         U|
+----------+
AJFaraday
sumber
@Tfeld Ditambahkan, terima kasih!
AJFaraday
1
Sepertinya semua pengubah arah selalu tercapai dalam kasus pengujian Anda, yang dapat memungkinkan untuk menyederhanakan algoritma. Saya sarankan untuk menambahkan test case yang tidak benar.
Arnauld
@Arnauld Saya cukup yakin ada beberapa pengubah arah yang tidak digunakan dalam kasus 12.
AJFaraday
3
Dinyatakan bahwa kisi-kisi dapat berupa bentuk persegi panjang, tetapi semua kasus uji tampaknya identik dalam ukuran dan bentuk.
gastropner

Jawaban:

9

JavaScript (ES6),  191 183  181 byte

Terima kasih kepada @tsh karena telah membantu memperbaiki bug

Mengambil input sebagai matriks karakter. Keluaran dengan memodifikasi input.

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))

Cobalah online!

Berkomentar

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()
Arnauld
sumber
btw, [...""+a].mapbisa membuat array dengan setidaknya panjang 2x. Saya tidak yakin apakah itu membantu.
tsh
(a+0)[n]tidak menyimpan byte, meskipun nsekarang perlu diinisialisasi.
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,

Cobalah online!

Mengambil daftar daftar.

Output dengan memodifikasi array input.

TFeld
sumber
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

Bagaimana itu bekerja

  • $s=$_untuk menyimpan input ke dalam $smengembalikan pengubah huruf kecil. $_|=$skarena bitwise atau dengan spasi tidak akan berubah .dan *, huruf kecilurld akan dikembalikan dengan bitwise atau operasi.
  • /\n/;$n='.'x"@-" untuk mendapatkan "lebar" dan $n untuk mencocokkan karakter "lebar" kali
  • $l='\K[ a-z](?=';$t='([-|X])?'untuk mengurangi panjang regex; $luntuk mencocokkan huruf kecil urldatau spasi di jalan, $tuntuk mencocokkan terminator.

Setelah penggantian: (?| 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) )

  • beralih /eke eval, /ssehingga .(di dalam $n) cocok dengan karakter baris baru
  • $&eq$"?$1?'*':'.':uc$&jika cocok ruang, jika termiator cocok *jika .sebaliknya huruf besar.
Nahuel Fouilleul
sumber
1
@Arnauld, ini berfungsi jika Anda memasukkan satu test case sekaligus.
Shaggy
ya saya memposting dengan cepat dan tidak bisa mengeceknya tetap reset $sdi footer. $sdigunakan untuk menyimpan input dan untuk mengembalikan huruf kecil karena dialihkan ke huruf besar saat menggambar jalan
Nahuel Fouilleul
4

Bersih , 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;_=[])

Cobalah online!

Suram
sumber
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]

Cobalah online!

Mengambil daftar daftar string 1-char, sebagaimana diizinkan secara eksplisit oleh OP.

Mengubah daftar di tempat.

Untuk I / O yang lebih mudah, gunakan ini .

Erik the Outgolfer
sumber