Niejednoznaczne lokalizacje w siatce

11

Masz małego robota z czterema czujnikami odległości. Zna układ pokoju, ale nie ma orientacji innej niż możliwość zablokowania orientacji siatki. Chcesz być w stanie dowiedzieć się, gdzie robot opiera się na odczytach, ale może być niejednoznaczny z powodu ograniczonych czujników.

Wyjaśnienie Wyzwania

Otrzymasz układ pokoju i cztery odczyty odległości zgodnie z ruchem wskazówek zegara, podające liczbę komórek między tobą a ścianą. Pośrodku pomieszczenia mogą znajdować się ściany, a krawędzie siatki są również ścianami. Robota nie można postawić na ścianie.

Twoim celem jest wyszczególnienie wszystkich lokalizacji w pomieszczeniu, w których może znajdować się robot, które dałyby podane odczyty. Należy pamiętać, że robot nie ma orientacji (innej niż zablokowanie na siatce pod kątem 90 stopni - tj. Robot nigdy nie będzie zorientowany ukośnie lub pod innym kątem pochylenia), więc odczyt [1, 2, 3, 4], na przykład, jest taki sam jak czytanie [3, 4, 1, 2].

Przykłady

W tych przykładach współrzędne komórki zostaną podane jako pary o indeksie 0 (x, y) od lewej górnej komórki. Odczyty będą podawane w kolejności zgodnej z ruchem wskazówek zegara na liście w nawiasach kwadratowych. Układy będą używać znaków funta dla ścian i innych znaków (zwykle kropek) do reprezentowania pustych komórek.

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

Przypadek 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> każda pozycja na siatce, która jest kropką
  • [1, 0, 0, 0] ==> wszystkie a na siatce

Przypadek 3

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

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

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

Inne zasady

  • Dane wejściowe mogą być w dowolnym dogodnym formacie. Dane wejściowe to siatka ścian i przestrzeni oraz lista czterech odległości w kolejności zgodnej z ruchem wskazówek zegara.
  • Dane wyjściowe może być albo listą wszystkich komórek, które spełniają odczyt, albo zmodyfikowaną wersją siatki pokazującą, które komórki spełniają odczyt. Dokładny format danych wyjściowych nie ma znaczenia, o ile jest rozsądny i spójny. Prawidłowe formaty wyjściowe obejmują między innymi :
    • Drukowanie linii dla każdej współrzędnej komórki jako uporządkowanej pary
    • Drukowanie siatki za pomocą ., #i odpowiednio !dla przestrzeni, ścian i możliwych lokalizacji.
    • Zwracanie listy zamówionych par
    • Zwracanie listy indeksów
    • Zwracanie listy list z różnymi wartościami dla przestrzeni, ścian i możliwych lokalizacji
    • Zwróć / wydrukuj macierz 0 i 1, używając 1 do reprezentowania komórek, w których wystąpiłby odczyt. (Nie trzeba uwzględniać ścian)
    • Ponownie lista ta nie jest wyczerpująca, więc inne reprezentacje są ważne, o ile są spójne i pokazują każdą możliwą prawidłową lokalizację w siatce lub liście. Jeśli nie jesteś pewien, zostaw komentarz, a ja chętnie wyjaśnię.
  • Możesz założyć, że odczyt odpowiada co najmniej jednemu miejscu na siatce.
  • Możesz założyć, że siatka wejściowa ma rozmiar co najmniej 1x1 i ma co najmniej jedno puste miejsce.
  • Możesz założyć, że siatka wejściowa nie jest większa niż 256 komórek w każdym wymiarze.
  • Możesz założyć, że siatka wejściowa jest zawsze idealnym prostokątem i nie jest poszarpana.
  • Nie ma kary ani premii, jeśli twój program zda rozsądne wyjście za nieprawidłowe dane wejściowe.
  • To jest kod golfowy, więc wygrywa najkrótszy kod.
Wołowina
źródło
Przypadki testowe Case 5nie wydają się całkiem właściwe. I dostać (0,2),(2,1), (1,3), (1,3), i nothing.
TFeld
@TFeld Dzięki. Naprawiony.
Beefster
1
@Arnauld Wydaje mi się rozsądny. Dodam to do już niewyczerpującej listy.
Beefster 30.01.2019

Odpowiedzi:

3

JavaScript (ES6),  130 128 126  125 bajtów

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

Wypróbuj online! (z przetworzonym wyjściem dla czytelności)

Skomentował

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[]
Arnauld
źródło
1

Python 2 , 234 202 200 191 bajtów

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

Wypróbuj online!

TFeld
źródło
1

Węgiel drzewny , 42 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Z jakiegoś powodu wydaje się, że węgiel drzewny dodaje trochę wypełnienia do wydruku; Zakładam, że to błąd w Charcoal. Wyjaśnienie:

Pθ

Wydrukuj mapę bez poruszania kursorem.

Fθ

Pętlę nad każdą postacią na mapie.

¿⁼¶ι⸿

Jeśli jest to nowa linia, przesuń kursor na początek następnego wiersza.

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

Znajdź odległość do ściany w kierunku k+m.

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

Pętla we wszystkich czterech początkowych kierunkach k, zerkanie we wszystkich czterech kierunkach zgodnie z ruchem wskazówek zegara m, a jeśli wynik zawiera drugie wejście, wydrukuj w !przeciwnym razie bieżący znak.

Neil
źródło