Quelqu'un a-t-il été défenestré?

26

La défenestration est l'acte de jeter quelqu'un ou quelque chose par la fenêtre.
- Wikipédia

Contribution

L'entrée comprendra deux parties:

  • Un plan d'étage et une personne à l'intérieur de la maison / du bâtiment.

    • v><^représente une personne, pointant dans la direction indiquée par la flèche. L'entrée contiendra exactement une personne.

    • -et |représentent des murs, et #représente une fenêtre. est un espace vide.

    Cette partie de l'entrée peut être considérée comme une chaîne unique ou comme un tableau / liste / etc. de lignes. Il n'y aura jamais d'espaces de fin ou de début, et l'entrée sera toujours un rectangle.

    Exemple:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Un entier ≥ 1 indiquant la distance (en caractères) parcourue par la personne.

Sortie

La sortie doit être

  • 1si la personne se retrouve "à l'intérieur" d'une fenêtre (c'est-à-dire après avoir avancé de la distance spécifiée dans l'entrée, la personne est au-dessus de a #).

  • 2si la personne a été défenestrée (entrer en contact avec a #puis continuer plus loin).

  • 3si la personne a heurté un mur (entrer en contact avec un -ou |. Une fois qu'elle a heurté le mur, la personne s'arrête et ne continue pas à travers).

  • 0 si rien de ce qui précède n'est vrai (et tout ce que la personne a fait est de voyager dans un espace vide).

Hypothèses

Tous les éléments suivants peuvent être supposés vrais:

  • La personne ne voyagera jamais "hors des limites" de la zone de saisie.

  • Après avoir été défenestrée, la personne n'entrera jamais en contact avec un autre #ou un -/ |(vous n'avez donc pas à vous soucier de savoir si 2 et 1 ou si 3les deux sont vrais).

Cas de test

Pour le "plan d'étage" suivant:

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

Pour ce plan d'étage:

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

Pour ce plan d'étage:

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

Cas de test final:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  
Poignée de porte
la source
7
Je propose que le titre de ce défi soit changé en test de défenestration.
cat
1
Question de suivi: ceci, sauf pour les puits.
Conor O'Brien
2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
cat
Pourquoi ma modification a-t-elle été rejetée):
cat
@cat Parce que c'est une modification de la question de quelqu'un d'autre, sur laquelle ils doivent avoir une entrée.
Conor O'Brien

Réponses:

10

JavaScript (ES6), 147 146 octets

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

1 octet enregistré grâce à @NinjaBearMonkey !

Explication

Prend un plan d'étage sous forme de chaîne et le nombre de mouvements. Renvoie un nombre.

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

Tester

user81655
la source
3
J'aime votre extrait de test!
GamrCorps
ಠ_ಠ J'étais sur le point de publier à peu près la même chose.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, je sais que ça va trop bien ...
user81655
Belle réponse, btw! Très intelligent.
Conor O'Brien