Bir Izgaradaki Belirsiz Konumlar


11

Dört mesafe sensörüne sahip küçük bir robotunuz var. Bir odanın düzenini bilir, ancak ızgara yönüne kilitlenmekten başka bir yönlendirme duygusu yoktur. Robotun okumalara göre nerede bulunduğunu bulmak istersiniz, ancak sınırlı sensörler nedeniyle belirsiz olabilir.

Zorluk Açıklaması

Bir oda düzeni ve duvar ile aranızdaki hücre sayısını gösteren dört saat yönünde mesafe verilecektir. Odanın ortasında duvarlar olabilir ve ızgaranın kenarları da duvarlardır. Robot bir duvarın üzerine yerleştirilemez.

Amacınız, robotun içinde yer alabileceği ve verilen değerleri verecek tüm yerleri listelemektir. Robotun yönlendirme hissi olmadığını unutmayın (ızgarada 90 derecelik açılara kilitlenmekten başka - robot asla çapraz olarak veya başka bir eğim açısına yönlendirilmeyecektir), bu nedenle [1, 2, 3, 4], örneğin, okuma [3, 4, 1, 2] ile aynıdır.

Örnekler

Bu örnekler için, hücre koordinatları sol üst hücreden 0 ile indekslenmiş (x, y) çiftleri olarak verilecektir. Okumalar, köşeli parantez içindeki bir listede saat yönünde verilir. Düzenler, boş hücreleri temsil etmek için duvarlar ve diğer karakterler (genellikle noktalar) için pound işaretleri kullanır.

Dava 1

. . . .
. . . .
. . # .
. . . .
  • [1, 0, 2, 3] ==> (1, 0), (3, 1)
  • [0, 0, 3, 3] ==> (0, 0), (3, 0), (0, 3), (3, 3)
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [1, 1, 2, 2] ==> (1, 1)

Durum 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> ızgaradaki nokta olan her konum
  • [1, 0, 0, 0] ==> a'nın tümü ızgarada

Vaka 3

.
  • [0, 0, 0, 0] ==> (0, 0)

Durum 4

. # #
. . .
  • [1, 2, 0, 0] ==> (0, 1)
  • [0, 1, 2, 0] ==> (0, 1)
  • [0, 0, 1, 0] ==> (0, 0)
  • [1, 0, 1, 0] ==> (1, 1)
  • [0, 1, 0, 1] ==> (1, 1)

Vaka 5

. # . .
. . . .
. . # .
. . . .
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [0, 2, 2, 1] ==> (1, 1)
  • [1, 0, 2, 2] ==> (1, 1)
  • [0, 3, 0, 0] ==> (0, 0)
  • [1, 0, 1, 1] ==> (1, 2)

Diğer Kurallar

  • Giriş herhangi bir uygun biçimde olabilir. Giriş, duvarların ve boşlukların bir ızgarası ve saat yönünde dört mesafenin bir listesidir.
  • Çıktı, okumayı tatmin eden tüm hücrelerin listesi veya kılavuzun okumayı tatmin ettiğini gösteren değiştirilmiş bir versiyonu olabilir. Çıktının kesin biçimi makul ve tutarlı olduğu sürece önemli değildir. Geçerli çıktı biçimleri aşağıdakileri içerir, ancak bunlarla sınırlı değildir :
    • Her hücre koordinatı için sıralı çift olarak bir çizgi yazdırma
    • İle ızgara baskı ., #ve !sırasıyla alan, duvarları ve olası konumları için.
    • Sıralı çiftlerin bir listesini döndürme
    • Bir dizin listesi döndürme
    • Boşluklar, duvarlar ve olası konumlar için farklı değerler kullanarak bir liste listesi döndürme
    • Okumanın gerçekleşeceği hücreleri temsil etmek için 1s kullanarak 0s ve 1s'lik bir matris döndürün / yazdırın. (Duvarları dahil etmek gerekli değildir)
    • Bir kez daha, bu liste kapsamlı değildir, bu nedenle diğer temsiller tutarlı oldukları ve bir ızgara veya listede mümkün olan her geçerli konumu gösterdikleri sürece geçerlidir. Emin değilseniz, bir yorum bırakın ve açıklığa kavuşturmaktan memnuniyet duyarım.
  • Bir değerin ızgaradaki en az bir konuma karşılık geldiğini varsayabilirsiniz.
  • Giriş ızgarasının en az 1x1 boyutunda ve en az bir boş alana sahip olduğunu varsayabilirsiniz.
  • Giriş ızgarasının her boyutta 256 hücreden daha büyük olmadığını varsayabilirsiniz.
  • Giriş ızgarasının her zaman mükemmel bir dikdörtgen olduğunu ve pürüzlü olmadığını varsayabilirsiniz.
  • Programınız geçersiz girdiler için aklı başında çıktılar verirse herhangi bir ceza veya bonus yoktur.
  • Bu kod golf, bu yüzden en kısa kod kazanır.

İçin testcases Case 5pek doğru görünmüyor. Ben olsun (0,2),(2,1), (1,3), (1,3), ve nothing.
TFeld

@TFeld Teşekkürler. Sabit.
Beefster

1
@Arnauld Bana mantıklı geliyor. Bunu zaten kapsamlı olmayan listeye ekleyeceğim.
Beefster

Yanıtlar:


3

JavaScript (ES6),  130 128 126  125 bayt

(m)(l)m01l

1

m=>l=>m.map((r,y)=>r.map((v,x)=>v&!!([...'3210321'].map(d=>(g=X=>(m[Y+=~-d%2]||0)[X+=(d-2)%2]?1+g(X):0)(x,Y=y))+g).match(l)))

Çevrimiçi deneyin! (okunabilirlik için sonradan işlenmiş çıktı ile)

Yorumlananlar

m => l =>                         // m[] = layout matrix; l[] = list of distances
  m.map((r, y) =>                 // for each row r[] at position y in m[]:
    r.map((v, x) =>               //   for each cell v at position x in r[];
      v &&                        //     yield 0 if v = 0
      !!(                         //     otherwise, test whether we can find l[] within a
        [...'3210321']            //     list containing twice the results of the sensors
        .map(d =>                 //       for each direction d:
          (g = X => (             //         g = recursive function taking X
              m[Y += ~-d % 2]     //         add dy[d] to Y
              || 0                //         use a dummy object if we're out of the board
            )[X += (d - 2) % 2] ? //         add dx[d] to X; if (m[Y] || 0)[X] is equal to 1:
              1 +                 //           add 1 to the final result
              g(X)                //           and do a recursive call
            :                     //         else:
              0                   //           yield 0 and stop recursion
          )(x, Y = y)             //         initial call to g with X = x and Y = y
        )                         //       end of map() over directions
        + g                       //       coerce the result to a comma-separated string,
                                  //       followed by harmless garbage
      ).match(l)                  //     test whether l[] can be found in this string
                                  //     (l[] is implicitly coerced to a string as well)
    )                             //   end of map() over r[]
  )                               // end of map() over m[]

1

Python 2 , 234 202 200 191 bayt

lambda m,a:[(i,j)for j,l in e(m)for i,c in e(l)if('#'<c)*[(''.join(L)[::-1]+'#').find('#')for L in l[:i],zip(*m)[i][:j],l[:i:-1],zip(*m)[i][:j:-1]]in[a[q:]+a[:q]for q in 0,1,2,3]]
e=enumerate

Çevrimiçi deneyin!


1

Kömür , 42 bayt

PθFθ¿⁼¶ι⸿¿№E⁴E⁴⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#η!ι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Kömür, herhangi bir nedenle çıktıya biraz dolgu ekliyor gibi görünüyor; Kömürde bir hata olduğunu varsayıyorum. Açıklama:

Pθ

İmleci hareket ettirmeden haritayı yazdırın.

Fθ

Haritadaki her karakterin üzerine gelin.

¿⁼¶ι⸿

Yeni satırsa, imleci bir sonraki satırın başına götür.

⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#

Duvara olan mesafeyi yönünde bulun k+m.

¿№E⁴E⁴...η!ι

Dört başlangıç ​​yönünün ktamamını döndürün m, saat yönünün dört yönüne de bakın ve sonuç ikinci girişi içeriyorsa !, geçerli karakteri yazdırı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.