和臭气-第一部分


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.