Taxis en San Francisco

14

Usted es un taxista en San Francisco. Como es típico de los conductores de taxis, está navegando por una cuadrícula donde las únicas direcciones válidas que puede mover son la izquierda, derecha, arriba y abajo. Sin embargo, San Francisco es muy montañoso, por lo que la distancia entre dos intersecciones adyacentes no es necesariamente la misma. Más específicamente, la distancia entre una intersección en altitud ay una intersección adyacente en altitud bsería 1 + |a - b|. Su objetivo es encontrar todos los caminos más cortos desde su origen en la parte superior izquierda del mapa hasta su destino en la parte inferior derecha.

Entrada

Una cuadrícula bidimensional de altitudes enteras en el formato más conveniente (matriz bidimensional, matriz unidimensional con ancho y / o alto, etc.).

Salida

Una secuencia de direcciones para viajar para llegar a la esquina inferior derecha de la entrada desde la parte superior izquierda en la distancia más corta posible dada la distancia entre dos intersecciones adyacentes de altitudes ay bestá dada por la fórmula 1 + |a - b|. Si hay varias soluciones, envíe todas las soluciones.

Aunque yo uso U, D, L, y Rpara arriba, abajo, izquierda y derecha en los ejemplos que siguen su programa puede utilizar cualquiera de los cuatro series diferentes para representar las direcciones, siempre que sea compatible con ellos en ya través de todas las entradas.

Ejemplos

Input:
0 3 0 0 0
0 2 0 2 0
0 0 0 3 0
Output:
D D R R U U R R D D

Input:
3
Output:
<empty>

Input:
11 11 11
11 11 11
11 11 11
Output:
R R D D
R D R D
R D D R
D R R D
D R D R
D D R R

Input:
7 8 1 -1 0
4 4 6 -1 7
3 4 4  2 8
2 5 2 -1 2
Output:
D R D R R D R
D R D R D R R

Este es el por lo que la respuesta con el conteo de bytes más corto gana.

0 '
fuente
1
¿Las altitudes son siempre inferiores a 10? (están en los ejemplos, pero ¿siempre lo estarán?)
Dada
@Dada, las altitudes no son necesariamente inferiores a 10 (también pueden ser negativas), he actualizado los ejemplos en consecuencia.
0 '
cuando vi que esta publicación estaba activa estaba muy emocionada, ¡pensé que alguien había publicado una respuesta en taxi! tal vez un día
basura espacial

Respuestas:

2

JavaScript (ES6), 228 212 200 194 bytes

a=>w=>(B=1/0,(F=(r,p,s,b=a[p])=>p-a.length+1?1/b&&([...a[p]='RDUL'].map((c,d)=>d|p%w<w-1&&d-3|p%w&&F(r+c,P=p+[1,w,-w,-1][d],s+1+Math.abs(b-a[P]))),a[p]=b):R=s>B?R:s<B?(B=s,r):R+' '+r)('',0,0),R)

Entrada

Matriz unidimensional ay ancho wen sintaxis de curry(a)(w)

Salida

Una lista de soluciones separadas por espacios, como "DRDRRDR DRDRDRR"

Formateado y comentado

a => w => (                            // given an array 'a' and a width 'w'
  B = 1 / 0,                           // B = best score so far, initialized as +Infinity
  (                                    //
    F = (                              // F = recursive function with:
      r,                               //   - r = current path (string)
      p,                               //   - p = current position in grid
      s,                               //   - s = current score
      b = a[p]                         //   - b = backup of current cell
    ) =>                               //
    p - a.length + 1 ?                 // if we haven't reached our destination:
      1 / b && (                       //   if the current cell is valid:
        [...a[p] = 'RDUL']             //     invalidate the current cell
        .map((c, d) =>                 //     for each possible direction:
          d | p % w < w - 1 &&         //       check right boundary
          d - 3 | p % w &&             //       check left boundary
          F(                           //       do a recursive call with:
            r + c,                     //         - new direction appended to the path
            P = p + [1, w, -w, -1][d], //         - updated position
            s + 1 + Math.abs(b - a[P]) //         - updated score
          )                            //
        ),                             //
        a[p] = b                       //     restore current cell value
      )                                //
    :                                  // else:
      R = s > B ?                      //   if the current score is worse than B:
        R                              //     keep the previous solution
      : s < B ?                        //   if the current score is better than B:
        (B = s, r)                     //     update best score / store path as new solution
      : R + ' ' + r                    //   if it's just as good: append path to solution
  )('', 0, 0),                         // initial call to F with r = '', p = 0, s = 0
  R                                    // return solution
)                                      //

Casos de prueba

Arnauld
fuente