Следуйте точкам

22

Соревнование

Дана прямоугольная сетка символов

ABCDE
FGHIJ
KLMNO
PQRST

и сетка с одинаковыми размерами точек и пробелов

, , ,
  , , ,
  , ,  
  , , ,  

Выведите строку, которая генерируется, следуя точкам через сетку, начиная с верхнего левого угла. Этот пример дастABGLQRSNIJE

Заметки

  • Вы можете использовать входные сетки как 2D-массивы или как ближайшую альтернативу на вашем языке вместо многострочной строки.
  • Вы можете использовать значение NULL вашего языка вместо пробелов. Но вы должны использовать точки, чтобы отметить путь.
  • Вам не нужно разделять точки на одной строке пробелами. Я просто добавил их для удобства чтения.
  • Наименьшая возможная сетка имеет размер 1х1.
  • Начальная и конечная точка будут иметь только одного соседа. Точки между ними всегда будут иметь ровно двух вертикальных или горизонтальных соседей. Это гарантирует, что путь однозначен.
  • Путь не будет идти по диагонали.
  • Символы в сетке будут состоять из прописных или строчных букв в диапазоне, [a-z]как вам удобнее.
  • Путь всегда начинается в верхнем левом углу.

правила

Контрольные примеры

Сетка № 1

ABCABCW
DEFGHUQ
XLUSDQZ
ASUKWXI
WUKOAIM
AIAIOUP
, ,          
  , , ,      
      ,      
, , , ,      
,            
,            
=> ABEFGSKUSAWA
, , , , , , ,
            ,
, , , ,
, , , ,
, ,
, , , , , , ,
=> ABCABCWQZIMPUOIAIAWAXLUUK

Сетка № 2

Обратите внимание на тройные пробелы во вторых строках первого и второго примеров.

AB
CD
,  
   
=> А
, ,
   
=> AB
,  
, ,
=> ACD

Сетка № 3



,
=> А

Удачного кодирования!

Denker
источник
Вы уверены, что второй контрольный пример для сетки № 1 правильный? Я думаю, что выход должен быть ABCABCUQXIUOIAIAWAXLUUK.
vaultah
@vaultah Такс за подсказку, исправил ее. Были точки в сетке один столбец далеко слева.
Денкер
Нужно ли принимать ввод с каждым другим символом пробел, как здесь, или это могут быть только буквы и символы новой строки (и без лишних пробелов в точечной матрице)?
msh210
@ msh210 Как было сказано в задании, вы можете использовать какое-то значение NULL вместо пробелов, учитывая, что вы принимаете входные данные как двумерный массив.
Денкер
Я имел в виду, ни с чем, даже с нулевым байтом.
msh210

Ответы:

4

APL, 63 байта

{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}

Это функция, которая принимает две символьные матрицы (они должны быть матрицами), символьную сетку в качестве левого аргумента и точечную сетку в качестве правого аргумента. Матрица точек может быть меньше матрицы символов.

Объяснение:

  • (,⍵='.')/,⍳⍴⍵: получить позиции точек в порядке строк-столбцов
  • 1↓: отбросить первый (как известно, в 1 1)
  • (⊂1 1){... }: начиная с 1 1, запустите следующую функцию, которая следует по пути (ее левый аргумент - это текущая позиция, а правый аргумент - не посещенные позиции). Это работает, выбирая ближайшую непосещенную точку каждый раз. (Если предположения из вопроса верны, это правильно.)
    • ×≢⍵:: если есть еще не посещенные позиции:
      • +/¨2*⍨⍺-⍵: найти манхэттенское расстояние между каждой позицией и текущей позицией
      • V←(+=⌊/): для каждой позиции посмотрите, равно ли ее расстояние наименьшему расстоянию, и сохраните его в V.
      • ⍵/⍨~: выберите все позиции, для которых это не так, это поля для посещения далее
      • (V/⍵): найти позицию, для которой это имеет место, это будет следующее поле
      • : снова запустите функцию с этими новыми аргументами
      • ⍺,: результатом является текущая позиция, за которой следует результат выполнения остальной части списка
    • ⋄⍺: в противном случае просто верните текущую позицию и остановитесь (это последняя)
  • ⍺[... ]: для каждой позиции выберите соответствующий элемент в сетке символов.

Тестовые случаи:

      f←{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}
      ⍝ example
      g0  ← 4 5⍴'ABCDEFGHIJKLMNOPQRST'
      d0  ← 4 5⍴'..  . . .. . .  ... '
      ⍝ test case 1
      g1  ← 6 7⍴'ABCACBWDEFGHUQXLUSDQZASUKWXIWUKOAIMAIAIOUP'
      d1a ← 6 7⍴'..      ...      .   ....   .      .      '
      d1b ← 6 7⍴'.......      ....   .. ..  ..     ........'
      ⍝ test case 2
      g2  ← 2 2⍴'ABCD'
      d2a ← 1 1⍴'.'
      d2b ← 1 2⍴'..'
      d2c ← 2 2⍴'. ..'
      ⍝ test case 3
      g3  ← 1 1⍴'A'
      d3  ← 1 1⍴'.'

      g0 f d0
ABGLQRSNIJE
      (⊂g1) f¨ d1a d1b
┌────────────┬─────────────────────────┐
│ABEFGSKUSAWA│ABCACBWQZIMPUOIAIAWAXLUUK│
└────────────┴─────────────────────────┘
      (⊂g2) f¨ d2a d2b d2c
┌─┬──┬───┐
│A│AB│ACD│
└─┴──┴───┘
      g3 f d3
A
Мэринус
источник
3

JavaScript (ES6), 122 байта

c=>g=>c[l=~c.search`
`,i=p=0]+[...g].map(_=>i|!p?c[i=(d=n=>g[i-n-p?i-n:c]>" "&&(p=i)-n)(1)||d(-1)||d(l)||d(-l)]:"").join``

объяснение

Принимает сетки как многострочные строки.

Чувствуется как приличная попытка, но у меня не хватило времени, когда я играл в гольф, так что, возможно, это можно улучшить.

var solution =

c=>g=>
  c[                            // add the starting letter to the output
    l=~c.search`
`,                              // l = line length
    i=p=0                       // i = current index, p = previous index
  ]+
  [...g].map(_=>                // loop
    i|!p?                       // if we have not finished yet
      c[i=                      // find the next index and return it's letter
        (d=n=>                  // d = function to check for a dot at offset n
          g[
            i-n-p?i-n           // if i - n != p, get the character at index i - n
            :c                  // else get index "c" (will return undefined, not a dot)
          ]>" "                 // if the character is a dot
          &&(p=i)-n             // set p to i and return i - n
        )
        (1)||d(-1)||d(l)||d(-l) // search for the next adjacent dot
      ]
    :""                         // if we have finished, return no letter
  )
  .join``                       // output all the returned letters
<textarea id="Characters" rows="6" cols="30">ABCABCW
DEFGHUQ
XLUSDQZ
ASUKWXI
WUKOAIM
AIAIOUP</textarea>
<textarea id="Grid" rows="6" cols="30">.......
      .
...   .
. ..  .
.     .
.......</textarea><br />
<button onclick="result.textContent=solution(Characters.value)(Grid.value)">Go</button>
<pre id="result"></pre>

user81655
источник