설정
아래 그림 1과 같이 29 개의 숫자로 된 셀을 포함하는 이상한 모양의 상자를 고려하십시오.
이 2D 상자 안에는 두 종류의 정사각형 동물이 있습니다. 그림 1 (a)는 약간의 족제비는 파란색으로, 일부는 짙은 초록색으로 표시되어 있습니다. 각 생물은 정확히 하나의 그리드 셀을 차지합니다. 상자에는 0에서 26 사이의 허블이 포함될 수 있지만 항상 정확히 두 개의 스몰이 포함됩니다.
중력의 영향을 받으므로, 쇠창살과 스몰은 상자의 바닥에 앉고 그 아래의 물건 위에 쌓입니다. 두 종 모두 예외적으로 게으 르며 끊임없이 움직이지 않습니다.
상자에는 또한 정확히 하나의 격자 셀을 차지하는 검은 사각형으로 묘사 된 스토우 트가 들어 있습니다. 스톨은 중력의 영향을 받지 않습니다 .
박스는 도면에 도시 된 바와 같이 셀 (28)의 바닥에 위치 된 하나의 개구를 갖는다.
상자에 스 매블, 스몰 및 스토우의 구성을 텍스트로 .
표현 하기 위해 빈 셀을 o
나타내며 스풀을 x
나타내는 스몰을 나타내는 그리고 @
stot를 나타냅니다. 예를 들어,도 1 (a)의 구성은 스트링으로 표시된다 .........@...o....ooo..xox...
.
조작
상자는 90 °의 배수로 회전 할 수 있습니다 . 상자가 회전하는 동안 스텁 및 스몰은 그리드 셀 내에서 정지 상태를 유지합니다. 회전이 완료 되 자마자 i ) 아래 벽으로 막히 거나 , ii ) 흔들림, 스몰, 아래로 멈춤, 또는 iii ) 셀 28의 구멍을 통해 떨어질 때까지 직접 아래로 떨어집니다. 상자를 종료하십시오. 스톨은 떨어지지 않습니다. 생물이 그 위에 놓여 있어도 현재 세포에 고정되어 있습니다.
생물이 떨어지고 새로운 안정된 구성에 도달 할 때까지 상자를 다시 회전 할 수 없습니다.
문자 적으로 상자 회전은 +
시계 방향으로 90 ° 회전, |
180 ° 회전 및 -
시계 반대 방향으로 90 ° 회전으로 표시됩니다.
또한 스토우 트 를 하나의 그리드 셀 단위로 네 개의 나침반 방향으로 이동할 수 있습니다 . 이동은 : i ) 스톨과 생물 사이에 충돌을 일으킨다 (즉, 대상 그리드 셀이 비어 있어야 함) ii ) 스톨과 벽 사이에 충돌을 일으킴, 또는 iii ) 스톨이 상자를 빠져 나가게 함 셀 28의 구멍.
또한 (중력과 관련하여) 생물이 그 위에 놓여 있으면 스토우 트는 움직일 수 없습니다 .
문자 적으로, 멈춤 동작은 <
왼쪽, >
오른쪽, ^
위, v
아래로 표시됩니다. 멈춤 이동은 항상 그림 에 표시된 "표준"(회전하지 않은) 프레임과 관련하여 지정 됩니다 . 즉, stot가 셀 10에 있으면 이동 ^
은 항상 셀 5로 이동하고 이동 >
은 항상 셀 11로 이동합니다. 상자의 방향은 이동 방향에 영향을 미치지 않습니다.
조작 순서는 왼쪽에서 오른쪽으로 문자열을 사용하여 인코딩됩니다. 예를 들어, 문자열 +<<^-
은 상자가 시계 방향으로 90 ° 회전 한 다음 스톨이 왼쪽과 왼쪽으로 한 번 (표준 프레임 기준) 한 번 이동 한 다음 상자가 시계 반대 방향으로 90 ° 회전하여 원래 방향으로 회전 함을 나타냅니다.
도전
완벽하게 좋은 이유 (공개 할 수 없음)를 위해 단일 스몰을 추출 하지 않고 상자에서 모든 허블을 추출하려고합니다. 이를 위해 위에서 구체적으로 설명한 조작을 사용할 수 있습니다.
이 문제를 해결하기 전에 다양한 조작이 상자의 내용에 어떤 영향을 미치는지 시뮬레이션해야합니다. 이것이이 도전의 초점입니다.
다음 stdin
과 같은 두 가지 인수를 허용하는 프로그램을 작성해야합니다 .
- 박스의 초기 상태를 설명하는 문자열
- 일련의 조작
두 인수가 구문 상 유효하고 상자가 표준 방향으로 시작하고 상자의 초기 상태가 안정적이고 합법적이라고 가정 할 수 있습니다.
프로그램은 stdout
다음 중 하나로 출력해야 합니다.
( case 1 ) 이동 순서가 합법적이며 (가동 한 이동 규칙을 위반하지 않음) 상자에서 나가는 스몰이 발생하지 않는 경우 상자의 최종 상태 (문자열). 상자의 최종 방향은 중요하지 않습니다.
( 케이스 2 ) 단일 느낌표 (
!
이동 순서가 불법이거나 스몰이 상자를 빠져 나오게하는 경우)
채점
우승 프로그램은 바이트 수 기준으로 가장 짧은 프로그램이며 , 매우 유익한 보너스 승수가 적용됩니다.
청구항 0.65 배율 경우 대신에 케이스 (1)에 대한 인코딩 된 출력을 인쇄 프로그램은 shubbles, smoles, stots, 빈 셀의 스펙 문자를 사용하고, 배치, 최종 상태와 방향으로 상자의 ASCII 포토 출력
*
셀 28의 구멍 바로 바깥에있는 셀에서. 선행 및 후행 공백은 무시됩니다.예를 들어, 그림 1 (a)를 90 ° 회전하면 출력은
. . ..... .o... xo.@. *ooo.. x .
청구항 0.22 배율 경우 대신에 케이스 (1)에 대해 부호화 출력을 인쇄 프로그램은 이미지 파일 또는 디스플레이의 최종 상태 및 방향 상자 픽처와 GUI 화면을 출력한다. 그림은 그림 1 (a)의 스타일이어야하며, 색 상자를 사용하여 격자 셀, 벽 및 생물을 보여줍니다.
경우 1에 대해 인코딩 된 출력을 인쇄하는 대신 , 0.1 초 간격으로 시뮬레이션의 모든 중간 상태를 보여주는 애니메이션 된 .gif 또는 애니메이션 GUI 창을 출력하는 경우 승수는 0.15를 청구 합니다. 0.22 배율과 동일한 그림 규칙이 적용됩니다. 애니메이션의 첫 번째 프레임은 시뮬레이션의 초기 상태를 나타내야합니다. 또한 애니메이션에 "숨겨진"중간 상태가 표시되어야합니다.
회전 후 애니메이션 프레임 당 하나의 셀에 의해 안정된 구성으로 떨어지는 스 버블 / 스몰
180 ° 회전에서 상자의 중간 90 ° 회전 상태
청구항 0.12 배율 프로그램 상기 스타일의 .gif 참고 애니메이션 또는 애니메이션 GUI 화면을 생성하지만, 만약 20 FPS와 쇼로 실행
박스 회전의 부드럽고 연속적인 애니메이션
안정된 구성으로 떨어지는 스톨 이동 및 스 버블 / 스몰의 부드럽고 연속적인 애니메이션
셀 28의 구멍을 통해 떨어지는 삽은 상자에서 빠져 나오는 것으로 표시되어야하며 완전히 바깥쪽으로 한 번 사라져야합니다. 조작 / 초를 1 회 이상 수행하지 않는 한 애니메이션에 대한 고유 한 타이밍을 선택할 수 있습니다.
총점은 floor( base score * multiplier )
입니다. 하나의 승수 만 청구 할 수 있습니다.
결국 스몰 세계입니다. ;)