마지막 스프린트이고 팀의 절반이 아프다. 당신은 늦게 일하고 있고, 하루 동안 마지막 커밋을 만들고, 기대하고 있습니다 ... 왜 조명이 꺼졌습니까? 보안 요원이 다가오는 것을 기억하지 못합니다. 열쇠를 집에 두었습니다!
상황의 공포가 가라 앉을 때, 당신은 탈출하려고 결정합니다 .
작업 요약
탈출을 위해서는 계획이 필요합니다! 그러나 계획이 실패 할 가능성이 있으며 계획마다 다른 노력이 필요하다는 것을 알고 있습니다.
배고프고 피곤하며 엔지니어이기 때문에 성공 가능성에 대한 우려와 필요한 노력의 균형을 맞추면서 복잡한 프로그램을 피하는 가장 좋은 방법을 결정하는 간단한 프로그램을 작성하기로 결정했습니다.
건물의지도를 만듭니다.
#######################
# = #
! = ! <-- window
# ! = # (freedom!)
#################= #
# # = #
# # = #
# # = #
# o ! # # ! = #
##| ! ## # ! = #
#######################
^ ^ ^
me my door ludicrously high shelves
(locked) (climbable)
사무실을 탈출하려면지도에서 벗어나야합니다. 여기에는 2 개의 창이 있습니다 ( !
). 둘 중 하나는 자유로 이어지지 만 그 중 하나만 액세스 할 수 있습니다. 우리는 '지도 밖으로'를 발이지도의 경계 밖에있는 것으로 정의합니다.
세포 유형
- empty, you can be here (i.e. the escapee can consume this cell)
# - solid (your desk, your in-tray), you can't be here, but you can stand on it
! - destructible, (co-worker's desk, door, window), you can't be here until you smash it first (turning it into an empty cell)
= - climbable, (fire ladder, filing cabinet, etc.), you can be here
이스케이프에 의해 원래 소비 된 세포는 비워졌다.
동작 사양
일회용품에는 여러 가지 가능한 조치가 있습니다. 이것들은 정수 성공 확률을 가진 간단한 상태 전이에 의해 정의됩니다. 예를 들어, 걷기의 경우 이스케이프를 사용하여 이스케이프 한 셀을 이동합니다.
단계
1 stp, 100 %, 거울
o. o
|. --> |
# #
점은 세포가 이동하거나 통과하기 때문에 비어 있어야합니다 (또는 올라갈 수 있지만 단단하거나 파괴 할 수없는). 100 %는 자신이 다 치지 않고 대담한 탈출을 끝내지 않을 확률이 100 %임을 의미합니다. 모든 확률은 1 %에서 100 % 사이의 정수 백분율입니다. 첫 번째 다이어그램은 초기 상태를 보여줍니다 (빈 공간 옆에 서있는 단단한 물체 위에 있음). 두 번째 다이어그램은 터미널 상태 (빈 공간으로 이동)를 보여줍니다. 왼쪽 (초기 상태)의 지정되지 않은 셀 (공백, )에 대한 요구 사항 은 특별히 없습니다. 지정되지 않은 셀 (공간,
) 오른쪽 (터미널 상태)은 이전과 같아야합니다 (예 : 탈출 자 뒤에 있던 것 또는 내가 밟고있는 모든 것 (빈 공간이거나 다른 것)) 모든 오른쪽 (터미널 상태) ) 다이어그램은 파괴 가능한 셀에서 빈 셀로만 변경되며 다른 변경은 발생하지 않습니다. "1 stp"는 1 stp의 비용을 의미합니다. "stp"는 단계를 수행하는 데 필요한 에너지 량으로 정의합니다.
"미러"는이 동작이 두 가지 형태를 가짐을 의미합니다. "오른쪽"동작이 표시되고 "왼쪽"동작은 정확한 미러입니다. 예를 들면 다음과 같습니다.
.o
.|
#
거울 (왼쪽) 형식입니다
o.
|.
#
오른쪽 동작은 "오른쪽"(예 : "오른쪽 단계")입니다. 왼쪽 동작은 "왼쪽"(예 : "왼쪽 단계")입니다.
이 다이어그램에서 이스케이프는
o
|
서있을 때 (키 2 개)
%
몸을 구부릴 때 (1 단위). 단단하거나 파괴 가능한 셀은 해시로 표시됩니다 #
. 단단하거나 파괴 할 수없는 셀은 점으로 표시됩니다 .
. 파괴 가능해야하는 세포는 강타로 표시됩니다 !
. 새로 작성된 빈 공간은 밑줄로 표시됩니다 _
.
x
는 움직이지 않는 참조 점입니다 (존재하지 않으며 해당 셀이 무엇인지에 대한 제약이 없습니다 (space와 같은 )).
참고 : 우리는 바닥에 닿았을 때 빠른 감속 문제를 무시하고 그렇습니다.이 게임에서는 사다리로 완전히 장엄한 점프를 할 수 있습니다)
단계
1 stp, 100 %, 거울
o. o
|. --> |
x# x#
내려오다
1 stp, 100 %, 거울
= =
o. --> o
|. |
x= x=
혼합
3 stp, 100 %, 거울
%. %
x# --> x#
클램 버 업
10 stp, 95 %, 거울
o. %
|# --> #
x# x#
하락
0 stp, 100 %
o
| --> o
x. x|
드롭 (스탠드)
0 stp, 100 %
% o
x. --> x|
올라가
2 stp, 100 %
= o
o --> |
x| x
웅크림
2 stp, 100 %
o
| --> %
x# x#
대
4 stp, 100 %
. o
% --> |
x# x#
짧은 점프
4 stp, 95 %, 거울
o.. o
|.. --> |
x# x#
멀리뛰기
7 stp, 75 %, 거울
o... o
|... --> |
x# x#
높이뛰기
12 stp, 90 %, 거울
.. o
o. --> |
|
x# x#
다시 넣어!
20 stp, 80 %, 거울
o!. _o
|!. --> _|
x# x#
펀치
8 stp, 90 %, 거울
o! o_
| --> |
x# x#
발 차기
8 stp, 85 %, 거울
o o
|! --> |_
x# x#
우표
8 stp, 90 %
o o
| --> |
x! x_
계획
계획은 위에서 정의한 일련의 작업입니다. 예를 들면 다음과 같습니다.
Step Left
High Jump Left
Crouch
Shuffle Left
Shuffle Left
Stand
Long Jump Left
Put your back into it! Left
Step Left
방울의 포함에 유의하십시오. 규칙은 당신이 아무것도하지 않고 떨어 뜨리는 것을 막기 위해 설정되어야하지만, 당신은 여전히 그것을 계획해야합니다!
모든 계획에는 필요한 노력이 있으며, 이는 각 단계에 대한 노력의 합계입니다. 각 행동의 성공 확률의 곱인 성공 확률도 있습니다. 간단한 예 :
Step Right: 1stp, 100%
Long Jump Right: 7stp, 75%
Step Right: 1stp, 100%
Stamp: 8stp, 90%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Step Left: 1stp, 100%
Step Left: 1stp, 100%
High Jump Left: 12stp, 90%
Effort = 1+7+1+8+1+1+12 = 31
Success Probability = 75%*90*90% = 60.75%
페이지 상단의지도에 대한 '실제 예제' 는 요점 으로 찾을 수 있습니다 .
입력
입력은 정수와 배열 또는 문자열로 구성됩니다.
정수는 귀하의 최소 허용 확률 (%)입니다. 백분율로 해석되므로 80은 계획이 80 % 이상의 확률로 성공해야 함을 의미합니다.
유효한 맵은 스탠딩 이스케이프 (최소 크기 1x2)를 포함하고 지정되지 않은 기호가없는 사각형입니다. 모든 행의 길이는 같습니다. 입력을 1 차원 구분 문자열 (구분자는 단일 일관된 문자이거나 CRLF 및 LFCR 쌍 중 하나 여야 함), 유사한 1 차원 배열 또는 2 차원 배열로 사용할 수 있습니다. 선택한 입력 형식이 어떤 식 으로든 맵의 너비 나 높이를 나타내지 않는 경우 추가 인수를 사용할 수 있습니다 (답변에 명확하게 명시해야 함). 명령 행 인수와 표준 입력이 자신에게 적합한 경우 혼합 할 수 있습니다 (예 : stdin의 맵, argv의 최소 성공 확률). 다음은 유효하고 유효하지 않은 맵의 예입니다.
유효한:
o
|
유효한:
# #
! o #
! | #
#########
유효하지 않음 (이스케이프 없음) :
# #
! #
! #
#########
유효하지 않음 (탈출이 항상 시작됩니다) :
# #
! #
! % #
#########
유효하지 않은 (유효하지 않은 기호) :
# #
! ~ #
! #
#########
유효하지 않습니다 (직사각형 / 다른 길이의 행이 아님) :
# #
! o #
! | #
#########
입력 내용이 유효하다고 가정 할 수 있습니다 (잘못된 입력을 받으면 프로그램이 수행하는 작업은 중요하지 않습니다).
산출
출력은 텍스트 (ASCII)입니다. 문자열로 반환되거나 표준 출력으로 인쇄 될 수 있습니다. 계획은 LF, CRLF 또는 LFCR로 구분되어야합니다. 마찬가지로, 필요한 노력 후에 다른 LF, CRLF 또는 LFCR이 있어야합니다. 후행 줄 바꿈은 선택 사항입니다.
노력이나 "희망이 없습니다!"와 함께 최적의 계획을 출력해야합니다. 그러한 계획이 없다면 성공 확률을 출력 할 필요는 없습니다. 이 텍스트에는 줄 바꿈이 있거나 없을 수 있습니다.
최적의 계획은 최소한 주어진 성공 확률로 최소한의 노력을 요구하는 계획 (위 참조)으로 정의됩니다. 확률 계산은 정확해야하며 부동 소수점이 충분하다고 가정하지 않을 수도 있습니다 (그래서 출력을 기대하지 않습니다). 나는 이것을 공정하게 테스트하기 위해 테스트 케이스를 설계하려고 노력할 것입니다.
체재:
Required Effort: <effort>
<plan>
예를 들어, 입력의 경우
50
# #
! o #
! | #
#########
적절한 결과는 다음과 같습니다.
Required Effort: 23
Step Left
Step Left
Step Left
Kick Left
Punch Left
Step Left
Step Left
Step Left
Step Left
성공 확률은 76.5 %입니다.
동일한 맵이지만 최소 성공 확률이 80 % 인 경우 "다시 되돌려 야합니다". 더 많은 노력이 필요하지만 성공 확률 기준을 충족해야합니다. 최소 성공 확률이 80 %를 초과하면 조금 더 힘들게 생각해야합니다 (문의 일부를 뚫거나 걷어차 고 섞음). 최소 성공 확률이 100 %라면 "희망이 없습니다!"를 인쇄해야합니다.
예
입력에 대해 둘 이상의 유효한 계획이있을 수 있으며, 출력이 정확히 그럴 필요는 없지만 올바른 노력이 필요하고 유효한 계획이어야합니다. 검증기를 사용하여 솔루션을 확인할 수 있습니다 (아래 참조).
입력:
100
o
|
산출:
Required Effort: 0
Drop
입력:
5
# = #
# = !
# = ! ! !
# =#######
# = #
# = o #
# = ! | #
##########
산출:
Required Effort: 57
Step Left
Kick Left
Step Left
Step Left
Step Left
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
High Jump Right
Long Jump Right
Step Right
Drop
Kick Right
Crouch
Shuffle Right
Shuffle Right
입력:
60
#########
# ! # #
! ! ! o #
! # ! | #
#########
산출:
Required Effort: 58
Step Left
Kick Left
Crouch
Shuffle Left
Shuffle Left
Stand
Punch Left
Clamber Up Left
Shuffle Left
Drop (Stand)
Kick Left
Crouch
Shuffle Left
Shuffle Left
동일한 맵이지만 80 % 인 경우 출력은 다음과 같아야합니다.
There is no hope!
동일한 맵이지만 50 % 인 경우, 필요한 계획은 다른 계획으로 56이됩니다)
입력:
50
#######################
# # = #
! # = !
# # = #
###### #####!## =### #
#= ## # = #
#=############# = #
#= = #
#= o = #
#!!| = #
#######################
산출:
Required Effort: 121
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
Long Jump Left
Step Left
Step Left
Stamp
Drop
Drop
Crouch
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Stand
Clamber Up Left
Stand
Clamber Up Left
Stand
Step Left
Step Left
Step Left
Step Left
Punch Left
Clamber Up Left
Shuffle Left
입력:
66
######
# ###
#o ! !
#| ! !
### ##
######
산출:
Required Effort: 37
Step Right
Put your back into it! Right
Kick Right
Crouch
Shuffle Right
Shuffle Right
입력:
이것은 희생자가 될 수있는 많은 잘못된 가정을 확인하도록 설계되었으며 결과적으로 약간 이상하게 보일 수 있습니다
30
###################
# ## # # # # = #
! ## # # # = #
# # # = #
## ############= #
# ## # #= #
# = # #= #
! = # #= #
# = # #= #
#o= ! ==#
#|= ! =#
#!= # ==########==#
# # ! !! =#
# # !! ! = #
# # !!!!#########
# # # #
# # # #
###################
성공 기회 제한이있는 결과 30 :
Required Effort: 199
Long Jump Right
Put your back into it! Right
<snip>
성공 가능성 제약이있는 결과 32 :
Required Effort: 200
Long Jump Right
Punch Right
<snip>
성공 확률 제한이 1 % 인 맨 위의 맵을 입력으로 사용하면 116의 필수 노력이 필요합니다 (성공 확률 ~ 32 %, 테스트 프로그램에서 실행하는 데 약 20 초가 걸렸습니다).
승리 기준
이것은 코드 골프이며, 가장 짧은 코드가 이길 수 있습니다.
자격을 갖추려면 기능 또는 프로그램이 작동해야하며 합리적인 머신에서 30 분 이내에 위의 각 테스트 케이스를 해결할 수 있어야합니다. 내 솔버는 30 초 안에 각각을 수행합니다. 테스트 스크립트 (아래)가 30 분 이내에 실행되면 확실하게 진행됩니다.
솔버, 검증 자, 테스트 스크립트 및 테스트 사례 (솔루션 포함)
솔버에 대한 C # 코드 및 솔루션 검증 도구는 여기서 gist로 사용할 수 있습니다 . 요지에는 또한 file.txt
위에서 설명한 동작을 읽을 수있는 (충분한) 형태의 프로그램이 포함되어 있으며 프로그램을 실행하는 데 필요합니다. 해당 파일과 사양이 일치하지 않습니다.
요지는 또한 여러 가지 테스트 사례 (위의 모든 예제 포함)와 이에 대한 제출을 자동으로 실행하는 PowerShell 스크립트를 포함합니다. 스크립트가 특정 테스트에 실패했음을 알려 주면 OfficeEscapeSolver.exe testcase<n>.txt outputFromYourProgram.txt
자세한 내용을 볼 수 있습니다 . 이러한 테스트 사례에 대한 예제 솔루션은 다른 요지에 있습니다.
모든 코드는 완전한 엉망이지만 (골프가 풀리지는 않지만) 출력량 static void Main(...)
을 변경하기 위해 멀리 벗어날 필요는 없습니다 (이 정보를 자유롭게 사용하십시오, 나는 당신의 이익을 위해 그것을 제공했습니다!).
테스트 사례를 통과했다고해서 스크립트와 검증자가 매우 관대하기 때문에 출력이 제대로 구성되어있는 것은 아닙니다. 제출물이 유효하려면 출력물이 위의 사양과 일치해야합니다.
솔버 나 테스트 스크립트에 버그가 있거나,에 오류가 file.txt
있거나, dodgy 테스트 케이스 가 있다고 생각되면 이 게시물에 댓글을 달거나 SE Chat에 나를 핑하십시오. 아마도 다른 의사 소통 시도는 눈치 채지 못할 것입니다.
나는 Bash 또는 Batch로 테스트 스크립트를 제공하지 않을 것입니다. 알 수 없기 때문에 번역을 포함하게되어 기쁘고 사람들이 원하는 경우 C # 버전을 작성하게됩니다.
포스트 앰블
질문이 있습니까? 지체하지 말고 오늘 물어보십시오!
이 작업은 진지한 골퍼들에게 양치질 할 무언가를주기 위해 노력 이 필요합니다 .
입력 / 출력에 대한 피드백에 대해 ais523에게 감사드립니다.
사람들이 더 많은 것을 원하거나 (이 게시물이 더 이상되기를 원하지 않는 경우) 더 많은 테스트 케이스를 제공 할 수 있습니다.