Shubble và Smoles - Phần I


10

Cài đặt

Hãy xem xét một hộp có hình dạng kỳ lạ chứa 29 ô được đánh số như trong Hình 1 bên dưới.

shubble và smoles

Bên trong chiếc hộp 2D này là hai loài động vật hình vuông: shubble và smoles. Hình. 1 (a) cho thấy một số shubble màu xanh lam và một số smoles màu đỏ. Mỗi sinh vật chiếm chính xác một ô lưới. Hộp có thể chứa bất kỳ vị trí nào trong khoảng từ 0 đến 26 shubble, nhưng sẽ luôn chứa chính xác hai smoles.

Chịu trọng lực, những con cá mập và những con cá đuối ngồi dưới đáy hộp, xếp chồng lên nhau bất cứ thứ gì bên dưới chúng. Cả hai loài đều đặc biệt lười biếng và vẫn bất động.

Chiếc hộp cũng chứa một cái cọc, được mô tả như một hình vuông màu đen, chiếm chính xác một ô lưới. Các stot không chịu trọng lực.

Hộp có một lỗ mở ở dưới cùng của ô 28, như được mô tả trong hình.

Để biểu thị cấu hình của shubble, smoles và stot trong hộp theo cách văn bản, chúng tôi sử dụng chuỗi 29 ký tự, một ký tự cho mỗi ô lưới, theo thứ tự liệt kê, .đại diện cho một ô trống, ođại diện cho một shubble, xđại diện cho một smole, và @đại diện cho stot. Ví dụ, cấu hình của Hình 1 (a) được biểu thị bằng chuỗi .........@...o....ooo..xox....

Thao tác

Hộp có thể được xoay bởi bất kỳ bội số 90 °. Trong khi hộp đang được xoay, các shubble và smoles vẫn đứng yên trong các ô lưới của chúng. Ngay khi một vòng quay hoàn thành, chúng rơi thẳng xuống cho đến khi i ) chúng bị chặn bởi một bức tường bên dưới, ii ) chúng bị chặn bởi một shubble, smole hoặc stot bên dưới, hoặc iii ) chúng rơi qua lỗ hổng trong ô 28 và thoát khỏi hộp. Các thỏi không rơi; nó vẫn cố định trong tế bào hiện tại của nó, ngay cả khi các sinh vật nằm trên nó.

Chiếc hộp không thể quay lại cho đến khi các sinh vật rơi xuống và đạt được cấu hình ổn định mới.

Về mặt văn bản, xoay hộp được biểu thị bằng cách +xoay 90 ° theo chiều kim đồng hồ,| cho xoay 180 ° và xoay -90 ° ngược chiều kim đồng hồ.

Ngoài ra, stot có thể được di chuyển theo bốn hướng la bàn theo gia số của một ô lưới. Việc di chuyển có thể không: i ) gây ra va chạm giữa chuồng và sinh vật (tức là ô lưới đích phải trống), ii ) gây ra va chạm giữa chuồng và tường, cũng không phải là iii ) khiến cho chuồng thoát ra khỏi hộp. lỗ trong ô 28.

Ngoài ra, stot có thể không di chuyển nếu nó có bất kỳ sinh vật nào nằm trên nó (đối với trọng lực hiện tại).

Về mặt văn bản, các bước di chuyển được biểu thị bằng <bên trái, >bên phải, ^lên và vxuống. Di chuyển stot luôn được chỉ định liên quan đến khung "tiêu chuẩn" (không xoay) được mô tả trong các hình. Đó là, nếu stot nằm trong ô 10, di chuyển ^sẽ luôn di chuyển nó đến ô 5 và di chuyển> sẽ luôn di chuyển nó đến ô 11. Hướng của hộp không ảnh hưởng đến hướng di chuyển.

Chuỗi các thao tác được mã hóa bằng các chuỗi ký tự từ trái sang phải. Ví dụ: chuỗi+<<^- biểu thị hộp được xoay theo chiều kim đồng hồ 90 °, sau đó, cột được di chuyển sang trái hai lần và lên một lần (đối với khung tiêu chuẩn), sau đó hộp được xoay 90 ° ngược chiều kim đồng hồ về hướng ban đầu.

Các thách thức

Vì những lý do hoàn toàn chính đáng (mà tôi không thể tiết lộ), chúng tôi muốn giải thoát tất cả các shubble khỏi hộp mà không thoát ra một smole. Để thực hiện điều này, chúng ta có thể sử dụng các thao tác được mô tả cụ thể ở trên.

Trước khi giải quyết vấn đề này, nó sẽ cho chúng ta mô phỏng cách các thao tác khác nhau của chúng ta sẽ ảnh hưởng đến nội dung của hộp, đó là trọng tâm của thử thách này.

Bạn phải viết một chương trình chấp nhận hai đối số từ stdin(hoặc tương đương):

  • một chuỗi mô tả trạng thái ban đầu của hộp
  • một chuỗi các thao tác

Bạn có thể giả sử rằng cả hai đối số đều hợp lệ về mặt cú pháp, rằng hộp bắt đầu theo hướng chuẩn và trạng thái ban đầu của hộp là ổn định và hợp pháp.

Chương trình phải xuất ra stdout(hoặc tương đương):

  • ( trường hợp 1 ) trạng thái cuối cùng của hộp, được biểu thị dưới dạng chuỗi, nếu chuỗi di chuyển là hợp pháp (nó không vi phạm quy tắc di chuyển của stot) và không gây ra bất kỳ vết bẩn nào thoát khỏi hộp. Định hướng cuối cùng của hộp là không quan trọng.

  • ( trường hợp 2 ) một dấu chấm than duy nhất !, nếu chuỗi di chuyển là bất hợp pháp hoặc khiến bất kỳ vết bẩn nào thoát ra khỏi hộp

Chấm điểm

Chương trình chiến thắng là chương trình ngắn nhất theo số byte , tùy thuộc vào một số bội số tiền thưởng cực kỳ hấp dẫn:

  • yêu cầu hệ số nhân 0,65 nếu thay vì in đầu ra được mã hóa cho trường hợp 1, chương trình xuất ra hình ảnh ASCII của hộp ở trạng thái và hướng cuối cùng của nó, sử dụng các ký tự đặc tả cho các shubble, smots, stots và các ô trống và đặt một *trong ô ngay bên ngoài lỗ trong ô 28. Khoảng trắng đầu và cuối được bỏ qua.

    Ví dụ, nếu Hình 1 (a) được xoay 90 °, đầu ra sẽ là

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • yêu cầu hệ số nhân là 0,22 nếu thay vì in đầu ra được mã hóa cho trường hợp 1, chương trình xuất ra tệp hình ảnh hoặc hiển thị cửa sổ GUI có hình ảnh của hộp ở trạng thái và hướng cuối cùng. Hình ảnh phải theo phong cách của Hình 1 (a), hiển thị các ô lưới, tường và sinh vật / gốc bằng các hộp màu.

  • yêu cầu hệ số 0,15 nếu thay vì in đầu ra được mã hóa cho trường hợp 1, chương trình xuất ra cửa sổ GUI .gif hoặc hoạt hình hiển thị tất cả các trạng thái trung gian trong mô phỏng trong khoảng thời gian 1 giây. Các quy tắc hình ảnh tương tự như cho số nhân 0,22 được áp dụng. Khung đầu tiên của hình ảnh động sẽ mô tả trạng thái ban đầu của mô phỏng. Ngoài ra, hình ảnh động sẽ hiển thị trạng thái trung gian "ẩn", đó là

    • các shubble / smoles rơi vào cấu hình ổn định bởi một ô trên mỗi khung hình động sau khi xoay

    • trạng thái trung gian 90 ° của hộp trong một vòng quay 180 °

  • yêu cầu hệ số nhân là 0,12 nếu chương trình tạo ra một cửa sổ GUI hoạt hình .gif hoặc hoạt hình theo kiểu trên, nhưng chạy ở tốc độ 20 khung hình / giây và hiển thị

    • hình ảnh động mượt mà, liên tục của hộp xoay

    • hình ảnh động mượt mà, liên tục của stot di chuyển, và của các shubbled / smoles rơi vào một cấu hình ổn định

    Các mảnh vỡ rơi qua lỗ hổng trong ô 28 phải được hiển thị khi thoát khỏi hộp và sẽ biến mất một khi hoàn toàn ở bên ngoài. Bạn có thể chọn thời gian của riêng mình cho hoạt hình miễn là không quá 1 thao tác / giây được thực hiện.

Tổng số điểm là floor( base score * multiplier ). Chỉ có một số nhân có thể được yêu cầu.

Rốt cuộc đó là một thế giới smole. ;)


2
+1 cho thông số kỹ thuật, nhưng tôi sẽ không tham gia.
John Dvorak

Điều này nghe có vẻ vui. Chỉ cần chắc chắn: hình dạng của hộp hoàn toàn cố định, đúng không? Vì vậy, chúng ta không phải tính đến bất kỳ hình dạng khác?
Ingo Bürk

@ IngoBürk: Đúng. Hình dạng hộp được cố định.
COTO

Đối với đầu ra hình ảnh, chúng ta có thể sử dụng hình ảnh của bạn làm tài nguyên (hoặc bất kỳ loại tài nguyên nào) hay chúng ta phải vẽ nó hoàn toàn trong mã? Nếu chúng ta có thể sử dụng nó, làm thế nào để tính? Tôi sẽ cố gắng thực hiện điều này, nhưng tôi đang đi nghỉ ngay bây giờ.
Ingo Bürk

1
Bạn có thể sử dụng tài nguyên đồ họa bên ngoài (ví dụ: hình ảnh, đánh dấu SVG) miễn là bạn bao gồm tổng số byte của chúng trong tổng số cho chương trình. Hình ảnh cơ bản không phải quá phức tạp. 12 dòng tạo thành lưới; bức tường; và các hộp màu bên trong hộp. Nếu bạn thích, một hộp màu có thể lấp đầy toàn bộ một ô lưới và bức tường có thể theo dõi chính xác dọc theo đường viền của các ô ngoài cùng. Do đó, toàn bộ hình ảnh có thể được xác định bằng cách vẽ hình chữ nhật, đường thẳng và đa giác trên lưới tọa độ vuông 6x6.
COTO

Câu trả lời:


2

MATLAB, chưa được xử lý * 0.15

Sẽ thật tuyệt nếu ai đó có thể mạo hiểm đoán xem liệu điều này có đúng không.

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

Kết quả cuối cùng mẫu cho một số di chuyển ngẫu nhiên:

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

nhập mô tả hình ảnh ở đây


1
Bạn thực sự có thể hiển thị một GIF của hình ảnh động?
Martin Ender

Mát mẻ! Tôi sẽ kiểm tra nó vào tối nay (và đăng một vài trường hợp thử nghiệm).
COTO

Chương trình không yêu cầu xuất ra một .gif hoạt hình, nhưng nếu bạn muốn tạo một, frageum, bài viết này giải thích cách thực hiện dễ dàng.
COTO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.