¿Alguien ha sido defenestrado?

26

La defenestración es el acto de arrojar a alguien o algo por la ventana.
- Wikipedia

Entrada

La entrada constará de dos partes:

  • Un plano de planta y una persona dentro de la casa / edificio.

    • v><^representa a una persona, apuntando en la dirección indicada por la flecha. La entrada contendrá exactamente una persona.

    • -y |representan paredes, y #representa una ventana. Es un espacio vacío.

    Esta parte de la entrada puede tomarse como una sola cadena o como una matriz / lista / etc. de lineas. Nunca habrá espacios finales o iniciales, y la entrada siempre será un rectángulo.

    Ejemplo:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Un entero ≥ 1 que indica qué tan lejos (en caracteres) viaja la persona.

Salida

La salida debe ser

  • 1si la persona termina "dentro" de una ventana (es decir, después de avanzar la distancia especificada en la entrada, la persona está encima de a #).

  • 2si la persona ha sido defenestrada (entre en contacto con ay #luego continúe más adelante).

  • 3si la persona ha golpeado una pared (entra en contacto con una -o |. Una vez que golpea la pared, la persona se detiene y no continúa a través de ella).

  • 0 si nada de lo anterior es cierto (y todo lo que la persona ha hecho es viajar a través del espacio vacío).

Supuestos

Se puede suponer que todo lo siguiente es cierto:

  • La persona nunca viajará "fuera de los límites" del área de entrada.

  • Después de ser defenestrado, la persona nunca va a entrar en contacto con otra #o una -/ |(por lo que no tiene que preocuparse de si 2 y 1 o 3son verdaderas).

Casos de prueba

Para el siguiente "plano de planta":

-----
|   |
|###|
|   |
| ^ |
In   Out
1    0
2    1
3    2

Para este plano de planta:

> | # |
In   Out
1    0
2-99 3    * that is, any input 2-99 outputs 3

Para este plano de planta:

||####|#|#|##|<
In   Out
any  3

Caso de prueba final:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  
Pomo de la puerta
fuente
77
Propongo que el título de este desafío se cambie a prueba de defenestración.
gato
1
Pregunta de seguimiento: Esto, excepto con el pozo.
Conor O'Brien
2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
gato
¿Por qué se rechazó mi edición?):
cat
@cat Debido a que es una edición de la pregunta de otra persona, en la que deben participar.
Conor O'Brien

Respuestas:

10

JavaScript (ES6), 147 146 bytes

(p,n)=>eval('l=p.search`\n`+1;m=p.match`[<>v^]`;for(r=d=i=0;i++<n&r<3;r-1?0:d=2)r=(c=p[m.index+i*({v:l,"<":-1,">":1}[m]||-l)])>"#"?3:c>" ";+r||d')

¡Guardado 1 byte gracias a @NinjaBearMonkey !

Explicación

Toma un plano como una cadena y el número de movimientos. Devuelve un número

(p,n)=>                               // p = floor plan as string, n = number of moves
  eval(`                              // use eval to enable for loop without {} or return
    l=p.search\`\n\`+1;               // l = line length
    m=p.match\`[<>v^]\`;              // m = the position and orientation of the person
    for(
      r=                              // r = result at the current step
        d=                            // d = 2 if the person has been defenestrated
          i=0;                        // i = current step
      i++<n&r<3;                      // for each step while the person has not hit a wall
      r-1?0:d=2                       // set d to 2 once the person enters the window
    )
      r=(                             // r = 0 if on " ", 1 if on "#" or 3 if on "|" or "-"
        c=p[m.index+i*                // c = character after current step
          ({v:l,"<":-1,">":1}[m]||-l) // get the index offset of each step
        ]
      )>"#"?3:c>" ";
    +r||d                             // return the result of the current step or d
  `)

Prueba

usuario81655
fuente
3
¡Me gusta tu fragmento de prueba!
GamrCorps
ಠ_ಠ Estaba a punto de publicar casi exactamente lo mismo.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Jaja, sé que se siente muy bien ...
user81655
Buena respuesta, por cierto! Muy inteligente.
Conor O'Brien