Qualcuno è stato defenestrato?


26

La defenestrazione è l'atto di lanciare qualcuno o qualcosa da una finestra.
- Wikipedia

Ingresso

L'input sarà composto da due parti:

  • Una planimetria e una persona all'interno della casa / edificio.

    • v><^rappresenta una persona, indicando nella direzione indicata dalla freccia. L'input conterrà esattamente una persona.

    • -e |rappresentano i muri e #rappresenta una finestra. è spazio vuoto.

    Questa parte dell'input può essere considerata come una singola stringa o una matrice / elenco / ecc. di linee. Non ci saranno mai spazi finali o iniziali e l'input sarà sempre un rettangolo.

    Esempio:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Un numero intero ≥ 1 che indica la distanza (in caratteri) percorsa dalla persona.

Produzione

L'output dovrebbe essere

  • 1se la persona finisce "dentro" una finestra (cioè dopo aver spostato in avanti la distanza specificata nell'input, la persona si trova in cima a a #).

  • 2se la persona è stata defenestrata (entrare in contatto con un #e quindi continuare più avanti).

  • 3se la persona ha colpito un muro (entra in contatto con un -o |. Una volta colpito il muro, la persona si ferma e non continua attraverso di essa).

  • 0 se nessuna delle precedenti è vera (e tutto ciò che la persona ha fatto è viaggiare nello spazio vuoto).

ipotesi

Si può presumere che tutte le seguenti condizioni siano vere:

  • La persona non viaggerà mai "fuori dai limiti" dell'area di input.

  • Dopo essere stata defenestrata, la persona non entrerà mai in contatto con un altro #o un -/ |(quindi non devi preoccuparti se 2 e 1 o 3sono entrambi veri).

Casi test

Per la seguente "planimetria":

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

Per questa pianta:

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

Per questa pianta:

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

Caso di prova finale:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  

7
Propongo che il titolo di questa sfida sia cambiato in Test di defenestrazione.
cat

1
Domanda di follow-up: questo, tranne che per i pit.
Conor O'Brien,

2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
cat

Perché la mia modifica è stata respinta):
cat

@cat Perché è una modifica alla domanda di qualcun altro, su cui devono avere input.
Conor O'Brien,

Risposte:


10

JavaScript (ES6), 147 146 byte

(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')

Salvato 1 byte grazie a @NinjaBearMonkey !

Spiegazione

Prende una planimetria come una stringa e il numero di mosse. Restituisce un numero.

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

Test


3
Mi piace il tuo frammento di prova!
GamrCorps,

ಠ_ಠ Stavo per pubblicare praticamente la stessa identica cosa.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, conosco quella sensazione fin troppo bene ...
user81655

Bella risposta, a proposito! Molto intelligente.
Conor O'Brien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.