Koopa Shell序列


19

在各种《超级马里奥》游戏中,绿色红色的 Koopa Troopa弹壳可以在平坦表面上无摩擦地滑动,并破坏在途中的砖块。当壳碰到砖块时,块破裂,将其变成空白空间,而Koopa壳反转方向。例如,在这里观看红色外壳。

假设“超级马里奥”级别只有一个街区高,并且每个网格单元都是砖块或空白空间,但最左边的单元包含向右移动的外壳。该关卡也是周期性的,因此,如果壳退出该关卡的右边缘或左边缘,它将在另一侧重新进入。在这种情况下,壳将继续弹起并破坏该关卡中的所有砖块,直到不再有。最后一块砖块破裂后,壳会走多远?

挑战

编写一个包含非负十进制整数的程序或函数。这个数字以二进制形式表示,没有前导零(唯一的例外是0本身),对一个块的高级布局进行编码。A 1是砖块,a 0是空白空间。

Koopa外壳插入到水准仪的最左边缘,并且最初向右移动。例如,与输入关联的级别39

>100111

因为100111是二进制39,以及><右表示和左侧分别移动壳。

一旦最后一块积木(aka 1)损坏,您需要打印或返回壳体行进的总距离。

对于输出39IS 7和水平看起来像这样的变化:

Level      Cumulative Distance
>100111    0
<000111    0
>000110    0
0>00110    1
00>0110    2
000>110    3
000<010    3
00<0010    4
0<00010    5
<000010    6
000001<    7
000000>    7  <-- output

类似地,输出为6IS 1

Level    Cumulative Distance
>110     0
<010     0
001<     1
000>     1  <-- output

以字节为单位的最短代码获胜。

作为参考,这里有输入输出020

0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 2
12 2
13 1
14 3
15 3
16 0
17 0
18 1
19 3
20 2

这是直到输入为止的输出1000

Answers:


6

CJam,29 26 24字节

感谢Sp3000节省了3个字节。

q~2b{_1&}{W\({%}*0+}w],(

测试套件。(这将打印所有结果,从0到STDIN上给出的整数。)

说明

这稍微改变了规范:我们不用移动外壳通过二进制字符串,而是移动和反转二进制字符串,使外壳始终在最前面,指向右边:

q~      e# Read and evaluate the input.
2b      e# Convert to base-2 to get the "level".
{_1&}{  e# While there is a 1 in the level...
  W\    e#   Put a -1 below the level.
  (     e#   Pull off the first digit, i.e. the cell the shell is pointing at.
  {     e#   If it's a 1 (i.e. a brick)...
    %   e#     Reverse the level, consuming the -1. This isequivalent to reversing the 
        e#     shell in place.
  }*
  0+    e#   Append a zero. If the cell was a brick, this just replaces it with an empty
        e#   cell. Otherwise, this rotates the level by one cell. This is equivalent 
        e#   to moving the shell one cell through the periodic level.
        e#   Note that if the leading cell was 0, the -1 remains on the stack.
}w
],(     e# Wrap the stack in an array, get its length and decrement.

5

Pyth,24个字节

&.WsH_XZeaYxZ1 0jQ2ssPBY

在线尝试:演示测试套件

下面的22字节代码也可以解决问题。由于Pyth编译器中的错误,当前无法使用。

&u_XGeaYxG1ZjQ2)ssPBPY

编辑:修正了错误,但是解决方案当然不计算在内。

在线尝试:演示测试套件

说明:

从正面和背面交替进行以下操作:

  • 我搜寻1
  • 通过将其放在列表中来记住该索引
  • 将此1更新为0

当没有1时,我计算距离。重要的是:除最后一个距离外,壳体都会两次移动列表中的每个距离(向前和向后)。

&.WsH_XZeaYxZ1 0jQ2ssPBY   implicit: Y = empty list
                jQ2        convert input number to binary
 .WsH                      start with Z=^; 
                           while the sum(Z) > 0, apply the the following to Z:
           xZ1                index of 1 in Z
         aY                   append this to Y
        e                     take the last element of Y (=this index)
      XZ       0              set this 1 (at index ^) in Z to 0
     _                        and revert the order of Z
                           this returns a list of zeros
&                          don't print ^, print the next thing
                     PBY   creates the list [Y, Y[:-1]]
                    s      combine these lists
                   s       sum up the distances
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.