Wurde jemand defenestriert?

26

Defenestration ist der Akt, jemanden oder etwas aus einem Fenster zu werfen.
- Wikipedia

Eingang

Die Eingabe besteht aus zwei Teilen:

  • Ein Grundriss und eine Person im Haus / Gebäude.

    • v><^Stellt eine Person dar, die in die durch den Pfeil angegebene Richtung zeigt. Die Eingabe enthält genau eine Person.

    • -und |repräsentieren Wände und #repräsentiert ein Fenster. ist leerer Raum.

    Dieser Teil der Eingabe kann entweder als einzelne Zeichenfolge oder als Array / Liste / etc. von Linien. Es wird niemals nachgestellte oder führende Leerzeichen geben, und die Eingabe wird immer ein Rechteck sein.

    Beispiel:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Eine Ganzzahl ≥ 1, die angibt, wie weit (in Zeichen) sich die Person bewegt.

Ausgabe

Die Ausgabe sollte sein

  • 1Wenn die Person "innerhalb" eines Fensters landet (dh nachdem sie sich um die in der Eingabe angegebene Distanz vorwärts bewegt hat, befindet sich die Person über a #).

  • 2wenn die Person defenestriert wurde (mit a in Kontakt kommen #und dann weiter machen).

  • 3Wenn die Person eine Wand berührt hat (mit einem -oder in Kontakt kommen |. Sobald sie die Wand berührt, stoppt die Person und fährt nicht weiter durch sie hindurch).

  • 0 wenn keine der oben genannten Aussagen zutrifft (und alles, was die Person getan hat, ist, durch den leeren Raum zu reisen).

Annahmen

Es kann davon ausgegangen werden, dass Folgendes zutrifft:

  • Die Person wird niemals "außerhalb der Grenzen" des Eingabebereichs reisen.

  • Nach der Defenestrierung kommt die Person nie mehr mit einer anderen Person #oder einem -/ in Kontakt |(Sie müssen sich also keine Gedanken darüber machen, ob 2 und / 1 oder ob 3beide wahr sind).

Testfälle

Für folgenden "Grundriss":

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

Für diesen Grundriss:

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

Für diesen Grundriss:

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

Letzter Testfall:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  
Türknauf
quelle
7
Ich schlage vor, den Titel dieser Herausforderung in Defenestrationstests
Katze
1
Folgefrage: Dies, außer bei Pit.
Conor O'Brien
2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
Katze
Warum wurde meine Änderung abgelehnt?):
cat
@cat Da es sich um eine Bearbeitung der Frage einer anderen Person handelt, für die eine Eingabe erforderlich ist.
Conor O'Brien

Antworten:

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

1 Byte gespart dank @NinjaBearMonkey !

Erläuterung

Nimmt einen Grundriss als Zeichenfolge und die Anzahl der Züge. Gibt eine Zahl zurück.

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

Prüfung

user81655
quelle
3
Ich mag dein Test-Snippet!
GamrCorps
ಠ_ಠ Ich wollte gerade so ziemlich das Gleiche posten.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, ich kenne das Gefühl nur zu gut ...
user81655
Schöne Antwort, übrigens! Sehr schlau.
Conor O'Brien