Хтось був знешкоджений?


26

Дефенестрація - це викидання когось або чогось із вікна.
- Вікіпедія

Вхідні дані

Вхід складається з двох частин:

  • План поверху та людина всередині будинку / будівлі.

    • v><^зображує людину, вказуючи в напрямку, позначеному стрілкою. Вхід буде містити рівно одну людину.

    • -і |представляють стіни, і #являє собою вікно. порожній простір.

    Ця частина вводу може сприйматися як окрема рядок, або масив / список / тощо. рядків. Ніколи не буде пробілів чи провідників, а вхід завжди буде прямокутником.

    Приклад:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • Ціле число ≥ 1 означає, наскільки далеко (у символах) людина подорожує.

Вихідні дані

Вихід повинен бути

  • 1якщо людина закінчується "всередині" вікна (тобто після просування вперед відстань, зазначений у вводі, особа знаходиться над a #).

  • 2якщо особа зазнала поразки (увійдіть у контакт з a, #а потім продовжуйте далі).

  • 3якщо людина вдарила об стіну (зіткніться з -або |. Одного разу вдарившись об стіну, людина зупиняється і не продовжує через неї).

  • 0 якщо нічого з перерахованого вище не відповідає дійсності (і все, що людина робила, - це подорож порожнім простором).

Припущення

Все наступне можна вважати правдивим:

  • Людина ніколи не буде подорожувати "поза межами" області введення.

  • Після того, як його піддають зловживанню, людина ніколи не вступатиме в контакт з іншим #або а -/ |(тому вам не доведеться турбуватися про те, чи справді це 2 і 1 чи 3інше).

Тестові справи

Для наступного "плану поверху":

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

Для цього плану поверху:

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

Для цього плану поверху:

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

Остаточний тестовий випадок:

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

7
Я пропоную змінити назву цього виклику на тестування
кіт

1
Подальше запитання: Це, за винятком ям.
Conor O'Brien

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

Чому мою редакцію відхилено):
кіт

@cat Оскільки це питання правки на чуже питання, вони повинні мати вхід.
Conor O'Brien

Відповіді:


10

JavaScript (ES6), 147 146 байт

(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 байт завдяки @NinjaBearMonkey !

Пояснення

Приймає план поверху як струну і кількість ходів. Повертає число.

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

Тест


3
Мені подобається твій фрагмент тестування!
GamrCorps

ಠ_ಠ Я збирався опублікувати майже таку саму річ.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ха-ха, я знаю, що почуваюсь все надто добре ...
user81655

Гарна відповідь, btw! Дуже розумний.
Conor O'Brien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.