Неоднозначні місця на Сітці


11

У вас маленький робот з чотирма датчиками відстані. Він знає планування кімнати, але не має іншого орієнтації, крім того, щоб мати можливість замикатися на орієнтації на сітку. Ви хочете бути в змозі дізнатися, де робот базується на показаннях, але це може бути неоднозначним через обмежені датчики.

Пояснення виклику

Вам буде надано макет кімнати та чотири показання відстані за годинниковою стрілкою, вказуючи кількість комірок між вами та стіною. Посередині кімнати можуть бути стіни, а краї сітки - це також стіни. Робота не можна розміщувати на стіні.

Ваша мета полягає в тому, щоб перелічити всі місця в приміщенні, де робот міг би знаходитися, що дало б дані показання. Майте на увазі, що робот не має почуття орієнтації (крім того, щоб він був зафіксований під кутом 90 градусів на сітці, тобто робот ніколи не буде орієнтований по діагоналі чи іншому куті нахилу), тому читання [1, 2, 3, 4], наприклад, те саме, що читання [3, 4, 1, 2].

Приклади

У цих прикладах координати комірок будуть задані у вигляді 0-індексованих (x, y) пар з верхньої лівої комірки. Показання подаватимуться за годинниковою стрілкою у квадратному списку. Макети використовуватимуть знаки фунтів для стін та інших символів (як правило, крапок) для зображення порожніх комірок.

Випадок 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)

Випадок 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> кожне положення в сітці, яке є крапкою
  • [1, 0, 0, 0] ==> всі а в мережі

Випадок 3

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

Випадок 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)

Випадок 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)

Інші правила

  • Введення може бути в будь-якому зручному форматі. Вхід - це сітка стін і просторів і список чотирьох відстаней за годинниковою стрілкою.
  • Вихідним може бути або список усіх комірок, які задовольняють прочитане, або модифікована версія сітки, що показує, які комірки задовольняють прочитаному. Точний формат виводу не має значення, доки він розумний і послідовний. Допустимі вихідні формати включають, але не обмежуються ними :
    • Друк рядка для кожної координати комірок як упорядкована пара
    • Друк сітки з ., #і !для простору, стін, а також можливі місця, відповідно.
    • Повернення списку упорядкованих пар
    • Повернення списку індексів
    • Повернення списку списків, використовуючи різні значення для пробілів, стін та можливих місць
    • Повернення / друк матриці 0s і 1s, використовуючи 1s для представлення комірок, де відбулося б зчитування. (Не обов’язково включати стіни)
    • Знову ж таки, цей список не є вичерпним, тому інші представлення дійсні до тих пір, поки вони є послідовними та показують усі можливі дійсні місця в сітці чи списку. Якщо ви не впевнені, залиште коментар, і я буду радий уточнити.
  • Ви можете припустити, що читання відповідає щонайменше одному розташуванню в сітці.
  • Можна припустити, що вхідна сітка має розмір принаймні 1х1 і має принаймні одне порожнє місце.
  • Можна припустити, що вхідна сітка не має більше 256 комірок у кожному вимірі.
  • Ви можете припустити, що вхідна сітка - це завжди ідеальний прямокутник і не зазубрована.
  • Немає штрафу чи бонусу, якщо ваша програма дасть здорові результати для недійсних входів.
  • Це код гольфу, тому найкоротший код виграє.

Тест-вітрини Case 5не здаються цілком правильними. Я отримую (0,2),(2,1), (1,3), (1,3), і nothing.
TFeld

@TFeld Дякую Виправлено.
Beefster

1
@Arnauld мені здається розумним. Я додам це до вже не вичерпного списку.
Beefster

Відповіді:


3

JavaScript (ES6),  130 128 126  125 байт

Приймає вхід як де - двійкова матриця, що описує макет кімнати ( = стіна, = порожня), а - список відстаней.(м)(л)м01л

Повертає іншу двійкову матрицю, де кожна дійсна позиція позначена .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)))

Спробуйте в Інтернеті! (з післяобробленим результатом для читабельності)

Прокоментував

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

Вугілля деревне , 42 байти

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Здається, деревне вугілля чомусь додає накладки на вихід; Я припускаю, що це помилка у вугіллі. Пояснення:

Pθ

Роздрукуйте карту, не переміщуючи курсор.

Fθ

Переведіть петлю на кожен символ на карті.

¿⁼¶ι⸿

Якщо це новий рядок, то перемістіть курсор до початку наступного рядка.

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

Знайдіть відстань до стіни за напрямом k+m.

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

Проведіть петлю над усіма чотирма початковими напрямками k, загляньте у всі чотири напрямки за годинниковою стрілкою m, і якщо результат включає другий вхід, тоді надрукуйте !друкований символ в іншому випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.