Sigue los puntos

22

El reto

Dada una cuadrícula rectangular de caracteres

A B C D E
FGHIJ
KLMNO
PQRST

y una cuadrícula con las mismas dimensiones de puntos y espacios

. . .
  . . .
  . .  
  . . .  

Salida de la cadena que se genera siguiendo los puntos a través de la cuadrícula que comienza en la esquina superior izquierda. Este ejemplo produciríaABGLQRSNIJE

Notas

  • Puede tomar las cuadrículas de entrada como matrices 2D o la alternativa más cercana en su idioma en lugar de una cadena multilínea.
  • Puede usar el valor NULL de su idioma en lugar de espacios. Pero tienes que usar puntos para marcar el camino.
  • No necesita separar puntos en la misma línea con espacios. Acabo de agregarlos para facilitar la lectura.
  • La cuadrícula más pequeña posible tiene el tamaño 1x1.
  • El punto inicial y final tendrá un solo vecino. Los puntos entre ellos siempre tendrán dos vecinos verticales u horizontales exactos. Esto garantiza que el camino sea inequívoco.
  • El camino no irá en diagonal.
  • Los caracteres en la cuadrícula serán todos los caracteres en mayúsculas o minúsculas en el rango que [a-z]sea ​​más conveniente para usted.
  • La ruta siempre comenzará en la esquina superior izquierda.

Reglas

Casos de prueba

Rejilla # 1

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

Cuadrícula 2

Tenga en cuenta los espacios triples en las segundas líneas del primer y segundo ejemplo.

AB
discos compactos
.  
   
=> A
. .
   
=> AB
.  
. .
=> ACD

Rejilla # 3

UNA
.
=> A

¡Feliz codificación!

Denker
fuente
¿Está seguro de que el segundo caso de prueba para la cuadrícula n. ° 1 es correcto? Creo que la salida debería ser ABCABCUQXIUOIAIAWAXLUUK.
Vaultah
@vaultah Thaks por la pista, la corrigió. Tenía los puntos en la cuadrícula una columna muy a la izquierda.
Denker
¿Necesitamos aceptar entradas con cualquier otro carácter como un espacio, como aquí, o pueden ser solo letras y líneas nuevas (y no espacios adicionales en la matriz de puntos)?
msh210
@ msh210 Como se dijo en el desafío, puede usar algún tipo de valor NULL en lugar de espacios, dado que, por supuesto, toma la entrada como una matriz 2D.
Denker
Quise decir, sin nada en absoluto, ni siquiera un byte nulo.
msh210

Respuestas:

4

APL, 63 bytes

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

Esta es una función que toma dos matrices de caracteres (deben ser matrices), la cuadrícula de caracteres como argumento izquierdo y la cuadrícula de puntos como argumento derecho. La matriz de puntos puede ser más pequeña que la matriz de caracteres.

Explicación:

  • (,⍵='.')/,⍳⍴⍵: obtener las posiciones de los puntos, en orden fila-columna
  • 1↓: suelte el primero (se sabe que está en 1 1)
  • (⊂1 1){... }: a partir de 1 1, ejecute la siguiente función, que sigue la ruta (su argumento izquierdo es su posición actual, su argumento derecho son posiciones no visitadas). Funciona seleccionando el punto no visitado más cercano cada vez. (Si se cumplen los supuestos de la pregunta, esto es correcto).
    • ×≢⍵:: si todavía hay puestos no visitados:
      • +/¨2*⍨⍺-⍵: encuentre la distancia de Manhattan entre cada posición y la posición actual
      • V←(+=⌊/): para cada posición, vea si su distancia es igual a la distancia más pequeña y guárdela en V.
      • ⍵/⍨~: seleccione todas las posiciones para las que este no es el caso, estos son los campos para visitar a continuación
      • (V/⍵): encuentre la posición para la cual es el caso, este será el siguiente campo
      • : vuelva a ejecutar la función con estos nuevos argumentos
      • ⍺,: el resultado es la posición actual, seguido del resultado de hacer esto para el resto de la lista
    • ⋄⍺: de lo contrario, simplemente devuelva la posición actual y pare (es la última)
  • ⍺[... ]: para cada posición, seleccione el elemento correspondiente en la cuadrícula de caracteres.

Casos de prueba:

      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
marinus
fuente
3

JavaScript (ES6), 122 bytes

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``

Explicación

Toma las cuadrículas como cuerdas multilínea.

Se siente como un intento decente, pero se me acabó el tiempo jugando al golf, por lo que probablemente podría mejorarse.

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>

usuario81655
fuente