Alguém foi defenestrated?

26

Defenestration é o ato de jogar alguém ou algo pela janela.
- Wikipedia

Entrada

A entrada será composta de duas partes:

  • Uma planta baixa e uma pessoa dentro da casa / prédio.

    • v><^representa uma pessoa, apontando na direção indicada pela seta. A entrada conterá exatamente uma pessoa.

    • -e |representam paredes e #representa uma janela. é um espaço vazio.

    Esta parte da entrada pode ser tomada como uma única string ou como uma matriz / lista / etc. de linhas. Nunca haverá espaços à direita ou à esquerda e a entrada sempre será um retângulo.

    Exemplo:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Um número inteiro ≥ 1 significa o quão longe (em caracteres) a pessoa viaja.

Saída

A saída deve ser

  • 1se a pessoa acabar "dentro" de uma janela (ou seja, depois de avançar a distância especificada na entrada, ela estará em cima de a #).

  • 2se a pessoa foi defenestrada (entre em contato com um #e depois continue mais adiante).

  • 3se a pessoa bater em uma parede (entre em contato com um -ou |. Depois de bater na parede, a pessoa para e não continua por ela).

  • 0 se nenhuma das opções acima for verdadeira (e tudo o que a pessoa fez foi viajar pelo espaço vazio).

Suposições

Pode-se presumir que todos os itens a seguir são verdadeiros:

  • A pessoa nunca viajará "fora dos limites" da área de entrada.

  • Depois de defenestrated, a pessoa nunca entrará em contato com outro #ou a -/ |(para que você não precise se preocupar se 2 e 1 ou 3são verdadeiras).

Casos de teste

Para a seguinte "planta":

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

Para esta planta:

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

Para esta planta:

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

Caso de teste final:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  
Maçaneta
fonte
7
Proponho que o título desse desafio seja alterado para Teste de defenestração.
gato
1
Pergunta de acompanhamento: Isso, exceto nos boxes.
Conor O'Brien
2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
cat
Por que minha edição foi rejeitada):
cat
@cat Por se tratar de uma edição da pergunta de outra pessoa, ela deve ter sua contribuição.
Conor O'Brien

Respostas:

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 graças a @NinjaBearMonkey !

Explicação

Toma uma planta baixa como uma sequência e o número de movimentos. Retorna um 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
  `)

Teste

user81655
fonte
3
Eu gosto do seu snippet de teste!
GamrCorps
Eu estava prestes a postar exatamente a mesma coisa.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, eu sei que está me sentindo muito bem ... #
8855 dec8
Boa resposta, btw! Muito esperto.
Conor O'Brien