Неоднозначные местоположения на сетке

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] ==> все a в сетке

Дело 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)

Другие правила

  • Ввод может быть в любом удобном формате. Ввод представляет собой сетку стен и пространств и список из четырех расстояний по часовой стрелке.
  • Вывод может быть либо списком всех ячеек, которые удовлетворяют показанию, либо измененной версией сетки, показывающей, какие ячейки удовлетворяют чтению. Точный формат вывода не имеет значения, если он является разумным и последовательным. Допустимые форматы вывода включают, но не ограничиваются :
    • Печать линии для каждой координаты ячейки в виде упорядоченной пары
    • Печать сетки с ., #и !для пространства, стен и возможных мест соответственно.
    • Возврат списка упорядоченных пар
    • Возврат списка индексов
    • Возврат списка списков с использованием разных значений для пространств, стен и возможных мест
    • Вернуть / распечатать матрицу 0 и 1, используя 1 для представления ячеек, в которых будет происходить чтение. (Не обязательно включать стены)
    • Еще раз, этот список не является исчерпывающим, поэтому другие представления действительны, если они согласованы и показывают каждое возможное допустимое местоположение в сетке или списке. Если вы не уверены, оставьте комментарий, и я буду рад уточнить.
  • Вы можете предположить, что показание соответствует по крайней мере одному местоположению в сетке.
  • Вы можете предположить, что входная сетка имеет размер как минимум 1x1 и имеет хотя бы один пустой пробел.
  • Можно предположить, что входная сетка не превышает 256 ячеек в каждом измерении.
  • Вы можете предположить, что входная сетка всегда является идеальным прямоугольником, а не неровным.
  • Нет штрафа или бонуса, если ваша программа выдаст вменяемые результаты для неверных входных данных.
  • Это код гольф, поэтому выигрывает самый короткий код.
Beefster
источник
Тестовые случаи для Case 5не кажутся вполне подходящими. Я получаю (0,2),(2,1), (1,3), (1,3), и nothing.
TFeld
@TFeld Спасибо. Исправлена.
Говядина
1
@ Arnauld кажется разумным для меня. Я добавлю это к уже не исчерпывающему списку.
Говядина

Ответы:

3

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

(м)(L)м01L

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[]
Arnauld
источник
1

Древесный уголь , 42 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. По-видимому, древесный уголь, по какой-то причине, добавляет некоторый запас к выходу; Я предполагаю, что это ошибка в древесном угле. Объяснение:

Pθ

Распечатать карту без перемещения курсора.

Fθ

Зацикливайтесь на каждом персонаже на карте.

¿⁼¶ι⸿

Если это новая строка, переместите курсор в начало следующей строки.

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

Найдите расстояние до стены в направлении k+m.

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

Выполните цикл по всем четырем начальным направлениям k, просмотрите все четыре направления по часовой стрелке m, и, если результат включает в себя второй вход, !распечатайте текущий символ в противном случае.

Нил
источник