和臭气-第一部分


10

设置

考虑一个包含29个编号单元格的奇怪形状的盒子,如下图1所示。

shu和臭气

在此2D盒子内有两种正方形动物:粗毛和臭鼬。图1(a)用蓝色显示了一些粗枝,用红色显示了一些臭味。每个生物恰好占据一个网格单元。该盒子可能包含0到26个粗线之间的任何位置,但始终只包含两个臭鼬。

在重力作用下,碎片和臭气坐在盒子的底部,堆积在它们下面的任何物体的顶部。这两个物种都非常懒惰,并且永远静止不动。

该框还包含一个圆点,用黑色正方形表示,恰好占据一个网格单元。该STOT是不受到重力。

如图所示,该盒子具有位于单元28底部的一个开口。

为了以文字形式表示框中的粗线,阴茎和茎的配置,我们使用29个字符的字符串(每个网格单元一个字符),按枚举顺序.表示,表示一个空单元格,o表示一条粗线,x表示一个污点,并@代表矮胖。例如,图1(a)的配置由字符串表示.........@...o....ooo..xox...。

操作方式

盒子可以旋转 90°的任意倍数。当盒子旋转时,叶屑和臭虫在它们的网格内保持静止。旋转完成后,它们会直接向下掉落,直到i)它们被下面的墙壁堵住;ii)它们被下面的小树枝,sm茎或草梗堵住;或者iii)它们掉落到单元格28的孔中并退出框。矮脚不会掉下来;即使生物停留在其当前细胞上,它也保持固定在其当前细胞中。

在生物掉落并达到新的稳定状态之前,不能再次旋转盒子。

从字面上看,框旋转表示+为顺时针旋转90°,旋转|180°和-逆时针旋转90°。

此外,可以在四个罗盘方向上以一个网格单元为增量移动笔杆。举动可能不会:i)引起桩与生物之间的碰撞(即,目标网格单元必须为空),ii)导致桩与壁之间的碰撞,或者iii)导致桩通过以下方式离开箱子单元格28中的孔。

另外,如果小脚上有任何生物(相对于当前重力),小脚也可能不会移动。

以文字,STOT移动被记<左,>右,^对了,v对了。总是相对于图中所示的“标准”(非旋转)框架指定点移动。也就是说,如果该笔杆位于单元格10中,则移动^将始终将其移动到单元格5中,并且该移动>将始终将其移动到单元格11中。框的方向不会影响移动的方向。

使用从左到右的字符串对操作序列进行编码。例如,字符串+<<^-表示盒子顺时针旋转90°,然后针杆左移两次并向上移动一次(相对于标准框架),然后盒子逆时针旋转90°回到其原始方向。

挑战

出于非常好的原因(我无法透露),我们希望从包装盒中拔出所有胡扯,而又不拔出一个sm子。为此,我们可以使用上面具体描述的操作。

在解决此问题之前,我们应该模拟一下各种操作将如何影响包装盒的内容,这是此挑战的重点。

您必须编写一个程序,该程序接受来自stdin(或等效)的两个参数:

  • 描述盒子初始状态的字符串
  • 一系列的操作

您可以假设这两个参数在语法上都是有效的,该框以标准方向开始,并且该框的初始状态是稳定且合法的。

程序必须输出到stdout(或等效的)以下之一:

  • (情况1)如果移动顺序合法(不违反短杆移动规则)并且不导致任何臭味离开盒子,盒子的最终状态,用字符串表示。盒子的最终方向并不重要。

  • (案例2)单个感叹号!,如果移动顺序不合法或导致任何臭味离开盒子

计分

获胜的程序是按字节数计算的最短程序,它受制于一些非常有利可图的奖金乘数:

  • 如果不是为情况1打印编码的输出,则声明为0.65的乘数,程序将使用包装字符,臭味,臭脚和空单元格的规范字符,以最终状态和方向输出盒子的ASCII图片,而不是输出情况1的编码输出,并放置一个*单元格中位于孔28外部的单元格中。前导和尾随空格将被忽略。

    例如,如果将图1(a)旋转90°,则输出为

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • 如果不是为情况1打印编码的输出,则程序要求输出0.22的乘数,该程序将输出图像文件或显示GUI窗口,并以最终状态和方向显示框的图片。图片应采用图1(a)的样式,并使用彩色框显示网格单元,墙壁和生物/脚架。

  • 如果不是为情况1打印编码输出,则程序声明0.15的乘数,该程序将输出动画的.gif或动画的GUI窗口,以1秒的间隔显示模拟中的所有中间状态。适用与0.22乘数相同的图像规则。动画的第一帧应描绘模拟的初始状态。此外,动画应显示“隐藏”的中间状态,即

    • 旋转后,每动画帧中的小球/ mols进入稳定配置的状态

    • 盒子在180°旋转的中间90°旋转状态

  • 如果程序产生上述样式的动画.gif或动画GUI窗口,但以20 fps的速度运行并显示,则声明乘数为0.12

    • 盒子旋转的平滑连续动画

    • 平滑,连续地动画显示小脚移动,以及滑倒的小草/臭虫处于稳定状态

    穿过盒子28孔掉落的碎片应显示为从盒子中出来,并且应该完全消失在外面。您可以为动画选择自己的时间,只要执行不超过1次/秒即可。

总分是floor( base score * multiplier )。只能要求一个乘数。

毕竟这是一个愚蠢的世界。;)


2
规格为+1,但我可能不会参加。
— 约翰·德沃夏克

这听起来很有趣。只是要确保:盒子的形状是完全固定的,是吗?因此,我们不必考虑任何其他形状吗?
— IngoBürk2014年

@IngoBürk:正确。盒子形状是固定的。
— COTO

对于图像输出,我们可以将您的图像用作资源(或任何种类的资源),还是必须完全在代码中绘制它?如果我们可以使用它,它如何计数?我会尝试的,但是我现在正在休假。
— IngoBürk,2014年

1
您可以使用外部图形资源(例如图像,SVG标记),只要将它们的字节数包括在程序总数中即可。基本图像不必太复杂。12条线组成网格;墙 和盒子里面的彩色盒子。如果您愿意,可以使用彩色框填充整个网格单元,并且墙可以精确地沿着最外部单元的边界描边。因此,可以通过在6x6正方形坐标网格上绘制矩形,直线和折线来定义整个图片。
— COTO 2014年

Answers:


2

MATLAB,尚未发布* 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 2014年

凉!我将在今天晚上检查一下(并发布一些测试用例)。
— COTO 2014年

该程序不需要输出动画的.gif,但是如果您要生成一个动画,则本文将介绍如何轻松实现。
— COTO 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.