누군가가 방어 되었습니까?


26

방어 는 창 밖으로 누군가 또는 무언가를 던지는 행위입니다.
위키 백과

입력

입력은 두 부분으로 구성됩니다.

  • 평면도 및 집 / 건물 내부의 사람.

    • v><^는 화살표로 표시되는 방향을 가리키는 사람을 나타냅니다. 입력은 정확히 한 사람을 포함합니다.

    • -그리고 |벽을 나타내며, #창을 나타냅니다. 빈 공간입니다.

    입력의이 부분은 단일 문자열 또는 배열 / 목록 / 등으로 취할 수 있습니다. 라인. 후행 또는 선행 공백은 없으며 입력은 항상 사각형입니다.

    예:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • 사람이 얼마나 멀리 여행 하는지를 나타내는 정수 ≥ 1

산출

출력은

  • 1사람이 창을 "내부"로 끝내면 (즉, 입력에 지정된 거리만큼 앞으로 이동 한 후 사람이 위에 있음 #)

  • 2그 사람이 방어를받은 경우 (와 접촉 #한 다음 계속 계속).

  • 3사람이 벽에 부딪 힐 경우 (A와 접촉 -하거나 |. 벽을 치는되면, 사람이 중지되고 그것을 통해 계속되지 않습니다).

  • 0 위의 사항 중 어느 것도 해당되지 않는 경우 (그리고 모든 사람이 빈 공간을 통과하는 것입니다)

가정

다음은 모두 사실이라고 가정 할 수 있습니다.

  • 사람은 입력 영역의 "경계를 벗어나"여행하지 않습니다.

  • defenestrated 후, 사람이 서로 접촉하지 않습니다 #또는 -/ |(당신은 걱정에 대한 경우에 필요가 없습니다 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
이 과제의 제목을 방어 테스트
cat

1
후속 질문 : 구덩이를 제외하고는.
Conor O'Brien

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

내 편집이 거부 된 이유) :
cat

@cat 다른 사람의 질문에 대한 편집이므로 입력해야합니다.
Conor O'Brien

답변:


10

자바 스크립트 (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

ಠ_ಠ 정확히 똑같은 내용을 게시하려고했습니다.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Haha, 나는 그 느낌이 너무 잘 알고 있습니다 ...
user81655

좋은 대답, btw! 아주 똑똑.
Conor O'Brien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.