蒸汽朋克:Clacker动画


11

在被低估的蒸汽朋克小说《差异引擎》中,相当于电影院的房屋提供了由砖块显示的像素化运动图像,可以通过机械方式翻转。协调这些磁贴的运动的控制引擎是一台大型噪音机,由一副打孔卡控制。

您的任务是模拟这样的引擎并显示输入文件指定的像素化动画。输入由固定宽度格式的行组成,但是您可以假定任何方便的行尾指示。格式为:

SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
    YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
      xx: the starting x coordinate
        XX: the ending x coordinate
          O: hexadecimal opcode
           A: argument (0 or 1)

输入是明确排序的(如果您将一副纸牌放在地板上,这部分我将非常感谢)。这意味着程序必须使用序列字段作为排序键对输入行执行稳定的排序。具有相同序号的行必须保持其原始相对顺序。(如果您将实际的行号附加到键上,则它应该与不稳定的排序一起使用。)空白序列字段应解释为小于任何数字(ascii排序序列)。

一条语句行只能影响一个y坐标,但可以指定x值的连续范围。结束的x值可以留为空白,或者可以与初始值相同,以便影响单个像素。

操作码是一个十六进制数字,它指定用作光栅的通用二进制功能代码。参数是0或1。执行的栅格操作是

pixel = pixel OP argument          infix expression
         --or-- 
        OP(pixel, argument)        function call expression

因此,像素的原始值在UBF表中输入为X,语句中的参数值输入为Y。此函数的结果是像素的新值。并且对语句中指定的从xx,YY到XX,YY的每个x,y对执行此操作。xx和XX指定的范围包括两个端点。所以

0000 0 010F1

应该在第0行上设置像素0、1、2、3、4、5、6、7、8、9、10。

输出尺寸(m x n)至少应为20 x 20,但如果需要,可以更大。但是谷物应该显示出来,您知道吗?应该被像素化了。图形和ASCII美术输出都是可以接受的。

例如,如果我们要制作像素化图形的图像:

  #   #
   ###
   ##
   ####
    #
#### ####
   # #

   ###
   # #
   # #

如果我们使用像XOR这样的位翻转操作来绘制他,则无论屏幕是黑色还是白色,都可以绘制和擦除它。

    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561

复制此序列将使图形出现和消失。

NMM不是米老鼠

通过在序列字段中指定不同的“镜头”,可以无序组成较大的动画。

   100 016F0
   101 016F0
   102 016F0
   103 016F0
   104 016F0
   105 016F0
   106 016F0
   107 016F0
   108 016F0
   109 016F0
   110 016F0
   111 016F0
   112 016F0
   113 016F0
   114 016F0
   115 016F0
   200020261
   2 0 6 661
   2 1 3 561
   2 2 3 461
   2 3 3 661
   2 4 4 461
   2 5 0 361
   2 5 5 861
   2 6 3 361
   2 6 5 561
   2 8 3 561
   2 9 3 361
   2 9 5 561
   210 3 361
   210 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
   300020261
   3 0 6 661
   3 1 3 561
   3 2 3 461
   3 3 3 661
   3 4 4 461
   3 5 0 361
   3 5 5 861
   3 6 3 361
   3 6 5 561
   3 8 3 561
   3 9 3 361
   3 9 5 561
   310 3 361
   310 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561

生产:

黑色/白色vs白色/黑色

这是因此最短的程序(按字节计数)获胜。如果引擎发出喀嗒声,则奖励(-50)。


3
通常情况下,要求发布到沙盒中以进行澄清。您是否要关闭沙盒?
约翰·德沃夏克

5
对我个人而言,沙箱是一个死胡同。我太拖延了,无法完成它们。在这里,活着,我不能忽略屁股下的火。
luser droog

1
布尔连接器如何工作?它仅连接具有相同序列号的行吗?如果混合使用,是否存在某种形式的运算符优先级?您是否有依赖布尔连接器的测试用例?为什么您发布的测试用例没有序列号?结束语是否x总是包容性的?
彼得·泰勒2014年

5
这是一些喀哒声的响亮声。我会得到奖金吗?;-)
Digital Trauma 2014年

1
声音方面,您是否正在考虑使用火车站翻板?例如,巴黎巴黎北火车站的日光浴板显示-DIY驱动器电路。还是您在想更多的机械继电器声音?
Scott Leadley 2014年

Answers:


3

Mathematica,306281字节

这期望输入字符串存储在变量中 i

ListAnimate[ArrayPlot/@FoldList[({n,y,x,X,o,a}=#2;MapAt[IntegerDigits[o,2,4][[-1-FromDigits[{#,a},2]]]&,#,{y+1,x+1;;X+1}])&,Array[0&,{20,20}],ToExpression/@MapAt["16^^"<>#&,StringTrim/@SortBy[i~StringSplit~"\n"~StringCases~RegularExpression@"^....|..(?!.?$)|.",{#[[1]]&}],{;;,5}]]]

这里有一些空格:

ListAnimate[ArrayPlot /@ FoldList[(
     {n, y, x, X, o, a} = #2;
     MapAt[
      IntegerDigits[o, 2, 4][[-1 - FromDigits[{#, a}, 2]]] &,
      #,
      {y + 1, x + 1 ;; X + 1}
      ]
     ) &,
   Array[0 &, {20, 20}],
   ToExpression /@ 
    MapAt["16^^" <> # &, 
     StringTrim /@ 
      SortBy[i~StringSplit~"\n"~StringCases~
        RegularExpression@"^....|..(?!.?$)|.", {#[[1]] &}], {;; , 5}]
   ]]

这太该死了。这个挑战包含了许多琐碎的细节,尤其是输入解析在Mathematica中花费了很多代码(几乎一半的137字节只是在解析输入)。在适应Mathematica之前,我最终两次切换了语言(我以为我可以使用Ruby节省输入解析的时间,但是后来我意识到结果需要进行动画处理,因此我回到了Mathematica)。


2

非高尔夫球后记示例

这是一个“ protocol-prolog”风格的程序,因此数据会立即跟随在同一源文件中。可以使用ImageMagick的convert实用程序(使用ghostscript)生成gif文件动画convert clack.ps clack.gif

%%BoundingBox: 0 0 321 321

/t { token pop exch pop } def
/min { 2 copy gt { exch } if pop } def
/max { 2 copy lt { exch } if pop } def

/m [ 20 { 20 string }repeat ] def
/draw { change {
        m {} forall 20 20 8 [ .0625 0 0 .0625 0 0 ] {} image showpage
    } if } def

%insertion sort from https://groups.google.com/d/topic/comp.lang.postscript/5nDEslzC-vg/discussion
% array greater_function insertionsort array
/insertionsort
{ 1 1 3 index length 1 sub
    { 2 index 1 index get exch % v, j
        { dup 0 eq {exit} if
            3 index 1 index 1 sub get 2 index 4 index exec
            {3 index 1 index 2 copy 1 sub get put 1 sub}
            {exit} ifelse
        } loop
        exch 3 index 3 1 roll put
    } for
    pop
} def

/process {
    x X min 1 x X max { % change? x
        m y get exch  % row-str x_i
        2 copy get  % r x r_x 
        dup         % r x r_x r_x
        0 eq { 0 }{ 1 } ifelse  % r x r_x b(x)
        2 mul a add f exch neg bitshift 1 and   % r x r_x f(x,a)
        0 eq { 0 }{ 255 } ifelse  % r x r_x c(f)
        exch 1 index % r x c(f) r_x c(f)
        ne { /change true def } if
        put
    } for
    draw
} def

{ [ {
     currentfile 15 string
         dup 2 13 getinterval exch 3 1 roll
         readline not{pop pop exit}if
    pop
    [ exch
     /b exch dup 0 1 getinterval exch
     /n exch dup 1 1 getinterval exch
     /seq exch dup 2 4 getinterval exch
     /y exch dup 6 2 getinterval t exch
     /x exch dup 8 2 getinterval t exch
     /X exch dup 10 2 getinterval dup (  ) ne { t exch }{pop 2 index exch} ifelse
     /f exch dup 12 get (16#?) dup 3 4 3 roll put t exch
     /a exch 13 get 48 sub
     /change false def
    >>
}loop ]
dup { /seq get exch /seq get exch gt } insertionsort
true exch
{ begin
    b(A)eq{
        { process } if
    }{
        b(O)eq{
            not { process } if
        }{
            pop
            process
        }ifelse
    }ifelse
    change
    end
} forall
    draw
} exec
   100 016F0
   101 016F0
   102 016F0
   103 016F0
   104 016F0
   105 016F0
   106 016F0
   107 016F0
   108 016F0
   109 016F0
   110 016F0
   111 016F0
   112 016F0
   113 016F0
   114 016F0
   115 016F0
   200020261
   2 0 6 661
   2 1 3 561
   2 2 3 461
   2 3 3 661
   2 4 4 461
   2 5 0 361
   2 5 5 861
   2 6 3 361
   2 6 5 561
   2 8 3 561
   2 9 3 361
   2 9 5 561
   210 3 361
   210 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
   300020261
   3 0 6 661
   3 1 3 561
   3 2 3 461
   3 3 3 661
   3 4 4 461
   3 5 0 361
   3 5 5 861
   3 6 3 361
   3 6 5 561
   3 8 3 561
   3 9 3 361
   3 9 5 561
   310 3 361
   310 5 561
    00020261
     0 6 661
     1 3 561
     2 3 461
     3 3 661
     4 4 461
     5 0 361
     5 5 861
     6 3 361
     6 5 561
     8 3 561
     9 3 361
     9 5 561
    10 3 361
    10 5 561
0000 0 515F1
0000 1 11501
0000 1 115F1

通过运行发现边界框信息gs -sDEVICE=bbox clack.ps
luser droog 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.