삽과 스몰-1 부


10

설정

아래 그림 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 )입니다. 하나의 승수 만 청구 할 수 있습니다.

결국 스몰 세계입니다. ;)


2
사양은 +1이지만 참여하지는 않을 것입니다.
John Dvorak

재미있을 것 같습니다. 그냥 확인하십시오 : 상자의 모양이 완전히 고정되어 있습니다. 다른 모양을 설명 할 필요가 없습니까?
Ingo Bürk

@ IngoBürk : 맞습니다. 상자 모양이 고정되어 있습니다.
COTO

이미지 출력을 위해 이미지를 리소스 (또는 모든 종류의 리소스)로 사용할 수 있습니까? 아니면 코드에서 이미지를 완전히 그려야합니까? 우리가 그것을 사용할 수 있다면 어떻게 계산합니까? 나는 이것을 시도하려고하지만 지금 휴가 중입니다.
Ingo Bürk

1
프로그램의 총 바이트 수를 포함하는 한 외부 그래픽 리소스 (예 : 이미지, SVG 마크 업)를 사용할 수 있습니다. 기본 이미지는 굉장히 복잡 할 필요는 없습니다. 그리드를 구성하는 12 줄; 벽; 상자 안에 색깔 상자가 있습니다. 원하는 경우 색상 상자가 전체 그리드 셀을 채울 수 있으며 벽은 가장 바깥 쪽 셀의 경계를 따라 정확하게 추적 될 수 있습니다. 따라서 6x6 정사각형 좌표 격자에 직사각형, 선 및 폴리 라인을 그려서 전체 그림을 정의 할 수 있습니다.
COTO

답변:


2

MATLAB, 아직 ungolfed * 0.15

이것이 제대로 작동하는지에 대해 누군가가 추측 할 수 있다면 좋을 것입니다.

n = @()input('', 's');
E = @()fprintf('!');
M = zeros(7,9);
G = M;
I = [9:7:44 17:7:52 18:7:46 12:7:47 20:7:55];
M0 = M;
M0(I) = 1;
M([I 49]) = 1;
G(I) = n()-46;
trot = 0;
Xtr = [0 1-10i 11-7i 8+i];
X0 ='c66++66++oozzoozzn'-i*'YYNNAA--  ++88LLYY'-22+22i;
for a = [97 n()]
    a = find('-|+a^<v>'==a);
    if a<5
        R = @(m) rot90(m, a);
        G = R(G);
        [nr,nc] = size(G);
        M = R(M);
        M0 = R(M0);
        trot = mod(trot+a,4);
        X = exp(i*pi*trot/2)*X0 + 11*Xtr(trot+1);
    else
        z = find(G==18);
        J = z + [-nr,1]*[0,-1;1,0]^(trot+a)*[1;0];
        if ~M0(J) | G(J) | G(z+1)
            E();return
        end
        G(z) = 0;
        G(J) = 18;
    end
    fall = 1; 
    while fall
        clf
        plot(X/11,'k','LineW',3);
        for x = 2:nc; for y = 2:nr
             ch = G(y,x);
             if M0(y,x) 
                 rectangle('Po',[x,-y,1,1],'F',~ch|ch==[74 1 65]);
             end
        end;end
        pause(1);
        G2 = G;
        for r = nr-1:-1:2
            s = G2 > 30;
            f = G2(r,:) .* (s(r,:) & ~s(r+1,:) & M(r+1,:) & G(r+1,:)~=18);
            if r==size(G,1)-1 & any(f==74)
                E();return
            end
            G2(r:r+1,:) = G2(r:r+1,:) + [-f;f];
        end
        G2 = G2 .* M0;
        fall = any(any(G2 ~= G));
        G = G2;
    end 
end

임의의 움직임에 대한 샘플 최종 결과 :

.........@...o....ooo..xox...
+>|<-v+^+

여기에 이미지 설명을 입력하십시오


1
실제로 애니메이션의 GIF를 보여줄 수 있습니까?
Martin Ender

멋있는! 오늘 저녁에 확인해 보겠습니다 (몇 가지 테스트 사례 게시).
COTO

이 프로그램은 애니메이션 .gif 파일을 출력 할 필요는 없지만 feersum 파일을 생성하려면 이 기사에서 쉽게 수행하는 방법을 설명합니다.
COTO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.