Yön değiştiriciler tarafından yapılan bir yol çizin


25

Bu zorluk bir ızgara üzerinde gerçekleşiyor.

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

Bu, 10 x 10'dur, ancak herhangi bir dikdörtgen şeklinde olabilir.

Bu ızgara üzerinde dört yön var. Yukarı, aşağı, sola ve sağa.

Görev, ilk başta büyük harf yönünde başlayan bir yol çizmektir. Bu örnekte, doğrudan U.

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

Yol yukarı doğru hareket edecek ve bir yıldız (*) ile sonlanacağı zaman, bir duvara çarpıncaya kadar tam durağan karakterlerden (.) Oluşacaktır.

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

Yol başlangıcına ek olarak, başlangıçta küçük harf yönü ile temsil edilen yön değiştiriciler de vardır.

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

Ayrıca, büyük harf X bize yolu sonlandıracak bir engeldir.

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

kurallar

  • Giriş, yol başlangıcını gösteren karakterleri, yön değiştiricileri ve engelleri içeren (|, - ve + karakterlerinden oluşan) bir kareden oluşan bir dizedir.
  • Kodunuz, başlangıç ​​ve yön değiştiriciler tarafından açıklanan yolu izlemek için tam durma karakterleri ve / yolun bir duvarla veya engelle karşılaştığında / yıldızıyla bir yıldız işareti eklemesini sağlar.
  • Birden çok yol başlangıcı olabilir.
  • Yolda bir döngü tanımlanıyorsa, kod yine de sonlandırılır.
  • Bir yol bir yol başlangıcını karşılarsa, yön değiştirici olarak işlev görür.
  • Bu kod golf, düşük bayt kodu ve standart boşluklar yok, lütfen.
  • Ben her zaman bir çevrimiçi tercümana link vermeyi tercih ederim.

Test Kılıfları

1: Basit

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


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

2: Sağa dönüş

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


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

3: Kavşak

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


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

4: 4 Geçiş yolları

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


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

5: İlk Döngü

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

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

6: değiştirici olarak Marş

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


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

7: Düz Döngü

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


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

8: Sıkı Düğüm

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


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

9: Bir Engel

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


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

10: S Şekli

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


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

11: 4 Yollu Düğüm

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


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

12: Meşgul Kavşaklar

+----------+
|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: Kenardan Başlıyor

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

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

14: Ölü Yolları Geçmek

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


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

@TFeld Eklendi, teşekkürler!
AJFaraday

1
Algoritmayı basitleştirmeye izin verebilecek test durumlarınızda tüm yön değiştiricilere her zaman ulaşılmış gibi görünüyor. Doğru olmadığı bir test vakası eklemenizi öneririm.
Arnauld

@Arsan, 12. davada kullanılmayan bazı yön değiştiriciler olduğundan eminim.
AJFaraday


3
Şebekenin herhangi bir dikdörtgen şeklinde olabileceği belirtiliyor, ancak tüm test durumları boyut ve şekil bakımından aynı görünüyor.
gastropner

Yanıtlar:


9

JavaScript (ES6),  191 183  181 bayt

Bir hatayı düzeltmek için @ tsh teşekkürler

Girdiyi karakter matrisi olarak alır. Girişi değiştirerek çıktılar.

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

Çevrimiçi deneyin!

Yorumlananlar

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].mapen az 2x uzunluğunda bir dizi oluşturabilir. Yardımcı olup olmadığından emin değilim.
tsh

(a+0)[n]nşimdi başlatılması gerekmesine rağmen, bir bayt tasarrufu yapar .
Arnauld

8

Python 2 , 283 279 293 288 279 bayt

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,

Çevrimiçi deneyin!

Listelerin bir listesini alır.

Giriş dizisini değiştirerek çıktı verir.


6

Perl 5, 203 188 166 bayt

$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

Nasıl çalışır

  • $s=$_$sKüçük harf değiştiricileri geri yüklemek için girişi kaydetmek için $_|=$sbitsel veya boşluk nedeniyle değişmeyecek .ve *küçük harfler urldbitwise veya operasyonla restore edilecek.
  • /\n/;$n='.'x"@-""width" almak ve $nherhangi bir karakter "width" kez eşleştirmek için
  • $l='\K[ a-z](?=';$t='([-|X])?'regex uzunluğunu azaltmak; $lbir küçük harfle urldveya bir yoldaki boşlukla $teşleştirmek için , bir sonlandırıcıyla eşleştirmek için.

Değiştirme sonrası: (?| 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) )

  • /eeval'a geçer , /sböylece .(inside $n) yeni satır karakteri ile eşleşir
  • $&eq$"?$1?'*':'.':uc$&eşleşen bir boşluk ise, sonlandırıcı *başka bir .şekilde büyükse değilse eşleşirse .

1
@Arauld, bir seferde bir test durumu girerseniz işe yarar.
Shaggy,

evet hızlı bir şekilde gönderildim ve $saltbilgide sıfırlamanın sabit olup olmadığını kontrol edemedim . $sgirişi kaydetmek ve küçük harfleri yeniden ayarlamak için kullanılır, çünkü yolu çizerken büyük harfe geçiş yapar
Nahuel Fouilleul

4

Temiz , 409 bayt

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

Çevrimiçi deneyin!


3

Python 2 , 250 bayt

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]

Çevrimiçi deneyin!

OP tarafından açıkça izin verilen 1 karakterli dizelerin bir listesini çıkarır.

Listeyi yerinde değiştirir.

Daha kolay G / Ç için bunu kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.