有人被贬低了吗?


26

开脱是将某人或某物扔出窗户的行为。
维基百科

输入项

输入将包括两部分:

  • 平面图和房屋/建筑物内的人。

    • v><^代表一个人,指向箭头所指的方向。输入将仅包含一个人。

    • -|表示墙壁,并#表示一个窗口。 是空的空间。

    输入的这一部分可以视为单个字符串,也可以作为数组/列表/等。行。永远不会有任何尾随或前导空格,并且输入将始终是一个矩形。

    例:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • ≥1的整数表示该人行进的距离(以字符为单位)。

输出量

输出应为

  • 1如果该人最终进入窗口“内部”(即,向前移动输入中指定的距离后,该人位于顶部#)。

  • 2如果此人被剥夺了资格(与a联系,#然后继续进行下去)。

  • 3如果此人撞到了墙壁(碰到-|。一旦撞到墙壁,该人将停止并且不会继续穿过墙壁)。

  • 0 如果上述条件都不成立(并且该人所做的全部是在空白处旅行)。

假设条件

可以假定以下所有条件都是正确的:

  • 此人将永远不会“超出范围”输入区域。

  • 被贬低后,该人将永远不会与另一个人#-/ 接触|(因此您不必担心2 and和 1 or 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
我建议将此挑战的标题更改为Defenestration测试。
2015年

1
后续问题:这个,除了坑坑洼洼的。
科纳·奥布莱恩

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

为什么我的编辑被拒绝了):

@cat因为它是对其他人的问题的编辑,所以他们必须输入信息。
Conor O'Brien 2015年

Answers:


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

@NinjaBearMonkey节省了1个字节!

说明

将平面图作为字符串和移动次数。返回一个数字。

(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 2015年

ಠ_ಠ我正要发布几乎完全相同的东西。
Conor O'Brien 2015年

@CᴏɴᴏʀO'Bʀɪᴇɴ哈哈,我知道那感觉太好了……
user81655

好答案,顺便说一句!很聪明。
Conor O'Brien 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.