Czy ktoś został defenestrowany?

26

Defenestracja polega na wyrzuceniu kogoś lub czegoś przez okno.
- Wikipedia

Wkład

Dane wejściowe będą się składały z dwóch części:

  • Plan piętra i osoba w domu / budynku.

    • v><^przedstawia osobę wskazującą kierunek wskazany przez strzałkę. Dane wejściowe będą zawierać dokładnie jedną osobę.

    • -i |reprezentują ściany i #reprezentują okno. jest pusta przestrzeń.

    Ta część danych wejściowych może być traktowana jako pojedynczy ciąg znaków lub tablica / lista / itd. linii. Nigdy nie będzie żadnych spacji końcowych ani wiodących, a wejście zawsze będzie prostokątem.

    Przykład:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Liczba całkowita ≥ 1 oznaczająca, jak daleko (w znakach) osoba podróżuje.

Wydajność

Wyjście powinno być

  • 1jeśli dana osoba znajdzie się „wewnątrz” okna (tj. po przesunięciu się do przodu o określoną w danych wejściowych odległość, osoba znajduje się nad a #).

  • 2jeśli dana osoba została zdefestytowana (wejdź w kontakt z #a następnie kontynuuj dalej).

  • 3jeśli osoba ma trafić do ściany (stykać się z -lub |. Po uderzeniu w ścianę, osoba zatrzyma się i nie kontynuuje się przez niego).

  • 0 jeśli żadne z powyższych nie jest prawdą (a wszystko, co zrobiła osoba, to podróż przez pustą przestrzeń).

Założenia

Można spełnić wszystkie poniższe warunki:

  • Osoba nigdy nie będzie podróżować „poza granicami” obszaru wejściowego.

  • Po defenestrated osoba nigdy nie wejdzie w kontakt z innym #lub -/ |(więc nie trzeba się martwić o tym, czy 2 i 1 czy 3są zarówno prawdziwe).

Przypadki testowe

Dla następującego „planu piętra”:

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

Dla tego planu piętra:

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

Dla tego planu piętra:

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

Ostateczny przypadek testowy:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  
Klamka
źródło
7
Proponuję zmienić tytuł tego wyzwania na test Defenestration.
kot
1
Dalsze pytanie: To, z wyjątkiem pit.
Conor O'Brien,
2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
kot
Dlaczego moja edycja została odrzucona):
cat
@cat Ponieważ jest to edycja pytania kogoś innego, na które musi mieć wkład.
Conor O'Brien

Odpowiedzi:

10

JavaScript (ES6), 147 146 bajtów

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

Zapisano 1 bajt dzięki @NinjaBearMonkey !

Wyjaśnienie

Pobiera plan piętra jako ciąg znaków i liczbę ruchów. Zwraca liczbę.

(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

użytkownik 81655
źródło
3
Podoba mi się twój fragment testowy!
GamrCorps,
ಠ_ಠ Właśnie miałem opublikować dokładnie to samo.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, znam to uczucie zbyt dobrze ...
user81655,
Dobra odpowiedź, btw! Bardzo mądry.
Conor O'Brien,