马里奥会落入萎缩卫星吗?(添加图)


23

超级马里奥银河(Super Mario Galaxy)拥有两个菱形八面体形状的*行星,它们的平台平铺,随着马里奥(Mario)的掠过而缩小。如果Mario掉入一个三角形的孔或先前触摸过的瓷砖留下的缝隙,他将被核心处的黑洞吞噬。(观看: Hurry-Scurry星系 Sea Slide星系

图片:MarioWiki.com

图片:MarioWiki.com

(您可以将行星视为一个2x2x2立方体,其面已通过2x3“桥”分离并彼此连接。)

不幸的是,由于我的控制器非常损坏,因此Mario无法跳跃,并且只能在四个基本方向上操作。此外,马里奥动作非常缓慢,即使不先离开身后的平台也无法退一步。

假设相机始终在马里奥的头顶上方,并且从2x2脸部的右下角开始:

      ■ ■
      ■ ■
      ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ M ■ ■ ■
      ■ ■
      ■ ■
      ■ ■

您的程序将采用一个列表或方向字符串U D L R(上,下,左,右),以一系列步骤代表Mario在地球上的行走。该程序可以输出两个截然不同的输出之一:一个代表马里奥还活着并在行走,另一个代表马里奥在行走中的某个地方掉入了收缩卫星。

RR:   ■ ■                 RRD:  ■ ■                 RRL:  ■ ■      
      ■ ■                       ■ ■                       ■ ■      
      ■ ■                       ■ ■                       ■ ■      
■ ■ ■ ■ ■ ■ ■ ■           ■ ■ ■ ■ ■ ■ ■ ■           ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ □ □ M ■           ■ ■ ■ ■ □ □ □ ■           ■ ■ ■ ■ □ M □ ■
      ■ ■    \                  ■ ■   M                   ■ ■  \
      ■ ■     Let's-a go!       ■ ■    \                  ■ ■   W-aaaaaaaaaahh!
      ■ ■                       ■ ■     W-aaaaaaaaaahh!   ■ ■

当然,与上述图表不同,您必须考虑3D。这是一个可以帮助您更好地可视化场景的图:

                Top 2x2 face
   <- clockwise           anticlockwise ->
   -   ■    -    ■    -    ■    -    ■   -
     /   \     /   \     /   \     /   \  
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■    Left and right
   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ M ■ ■ ■ ■ ■ ■ ■ ■ ■    edges wrap around.
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
     \   /     \   /     \   /     \   /  
   -   ■    -    ■    -    ■    -    ■   -
   <- anticlockwise           clockwise ->
               Bottom 2x2 face

因此,根据此图,UUUUURRRR可能看起来像这样:

   -   ■    -    ■    -    □    -    ■   -
     /   \     /   \     /   \     /   \  
   ■       ■ ■       ■ □       □ ■       ■
   ■       ■ ■       ■ □       □ ■       ■
   ■       ■ ■       ■ □       □ ■       ■
   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ ■ ■ ■ M ■ ■ ■ ■ ■
   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ ■ ■ ■ ■ ■ ■ ■ ■ ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
     \   /     \   /     \   /     \   /  
   -   ■    -    ■    -    ■    -    ■   -

而且UUUUUUUUULURRRRRR可能是这样的:

   -   ■    -    ■    -    □    -    □   -
     /   \     /   \     /   \     /   \  
   ■       ■ ■       ■ □       ■ ■       □
   ■       ■ ■       ■ □       ■ ■       □
-> □       ■ ■       ■ □       ■ ■       □ ->
<- □ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ ■ ■ ■ M □ □ □ □ □ <-
   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ ■ ■ ■ ■ ■ ■ ■ ■ ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
   ■       ■ ■       ■ ■       ■ ■       ■
     \   /     \   /     \   /     \   /  
   -   ■    -    ■    -    ■    -    ■   -

可能是以w-aaaaaaaaaahahh为单位的最短程序!

测试用例

输出1:仍然有效

DDDDDLUUUUU -马里奥(Mario)穿过桥,然后返回。

RRRRDDDDLLL -马里奥走成三角形。

LLLLLLUUUUUURRRRR -马里奥走在一个更大的三角形中。

ULLDRDDDRU -马里奥(Mario)身陷险境。

RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRR -马里奥(Mario)走了一条非常规的路线……并使自己陷入危险。

马里奥(Mario)准确地穿过每个瓷砖一次。 DDDDLUUUULLLLDDDLUUULLLLDDDDLUUUULLLLDDDLUUULLLURRRUUURDDDRRRRUUURDDDRRRRUUURDDDRRRRUUUUURDDDDD DLDRDLDLLLDRRRDDDDLLLLLLLLLDRRRRRRRRRDDDDLLLDRRRDDDRUUURRRRULLLLUUUURRRULLLUUUUURDRURDRUURULURU

输出2:W-aaaaaaaaaahahh!

LLR -马里奥(Mario)试图退步并掉下。

UULDR -马里奥(Mario)试图越过瓷砖两次并进入空气。

RRDDDDD -马里奥(Mario)在第一个D处从桥上走过(忽略任何后续步骤)。

RRRRDDDDLLLL -马里奥(Mario)行走在一个三角形中,从起始瓷砖上掉下来。

LLLLLLUUUUUURRRRRR -马里奥(Mario)进入一个较大的三角形,并穿过起始砖块。

UUUUUUUUUUUUUUUUUUUU -马里奥(Mario)一直绕着地球行走,并从起始地砖掉落。

RURDRURDRDLDRDLDLDLULDLLUU -马里奥(Mario)走上一条非常规路线,迷失了方向。

马里奥意识到自己处于危险之中,别无选择。

ULLDRDDDRUUU ULLDRDDDRUUL ULLDRDDDRUUR ULLDRDDDRUUD RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRR RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRU RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRL RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRD

最后,复制“ Mario准确地跨每个图块一次”中的任何测试用例,并随机更改或添加一个步骤。马里奥应该跌倒。(如果您在最后添加一个步骤,那么马里奥(Mario)会抓住力量之星(Power Star)!)

* 斜角立方体将是一个更正确的术语,因为某些面不是正方形,但您必须承认-“菱形八面体”的流动性更好。


3
在Cubix或Cubically中解决此问题的奖励积分
Stephen

这带回了许多关于玩Mario Galaxy的回忆-轻松成为我有史以来最喜欢的游戏之一。
notjagan

7
@StepHen或MarioLANG:P
ETHproductions'Aug

@Stephen,尽管它是一个八边形,六角形的sti ...你知道,没关系,谁会在hexAgony中这样做。
魔术章鱼缸

在最后一个测试用例的第4个中,除非添加额外的,否则Mario不会死R。我已经在纸上解决了这个问题,以确保我的代码正确无误。
级圣河在

Answers:


6

红宝石,golfed,244个 230字节

似乎工作正常,还会测试更多。

->s{a=[8**8/5]*8
v=[-1,x=d=0,1,0]
y=m=4
s.chars{|c|a[y]&=~(1<<x) 
y+=v[e="URDL".index(c)+d&3]
x+=v[e-1]
r= ~0**q=x/4
i=q+x&1
j=q+y&1
y%9>7&&(y=4-i;x+=4-j*11-x%2;d+=r)
x&2>0&&-y/2==-2&&(y=i*7;x+=6-x%2*9+j;d-=r)
m*=1&a[y]>>x%=24}
m}

Ruby,第一个工作版本,260字节

在线尝试

Lambda函数采用字符串参数。返回4表示存活,0表示死亡。

->s{a=[0x333333]*8
v=[0,-1,0,1]
x=d=0
y=m=4
s.chars{|c|a[y]&=~(1<<x) 
e="URDL".index(c)+d
x+=v[e%4]
y+=v[-~e%4]
p=x&-2
q=x/4%2
y%9>7&&(d-=q*2-1;y,x=4-(q+x)%2,(p+4-(q+y)%2*11)%24)
x&2>0&&-y/2==-2&&(y,x=(q+x)%2*7,(p+6-x%2*8+(q+y)%2)%24;d+=q*2-1)
m*=a[y]>>x&1}
m}

说明

木板被展开成6个大小为2x8的条,由下面的/\O字符表示。它们被映射到24 * 8 2D映射上,其中x =(带编号)* 4 +(带上的水平位置),y =带上的垂直位置。

       Map        4         2         0          Initial state of array a
                 /         /         /   
                / /       / /       / /          1100110011001100110011
               / /       / /       / /           1100110011001100110011 
              O /       O /       O /            1100110011001100110011
             O O       O O       O O             1100110011001100110011
      \     / O \     / O \     / X              110011001100110011001X
     \ \   / / \ \   / / \ \   / /               1100110011001100110011
      \ \ / /   \ \ / /   \ \ / /                1100110011001100110011
       \ O /     \ O /     \ O /                 1100110011001100110011
        O O       O O       O O 
         O \       O \       O \                 X=Mario's start point 
          \ \       \ \       \ \  
           \ \       \ \       \ \    
            \         \         \
             5         3         1

它们存储在一个由8个二进制数组成的数组中,因此x向左增加,而y向下降。

数组以数字的8个副本初始化0x33333333。这形成了允许马里奥踩的正方形。马里奥(Mario)在正方形周围移动时,将其设置为零,并且对其正移动的正方形进行了测试-他所居住的正方形包含1,如果包含0,则死亡。

如果马里奥(Mario)走出所在小条的顶部或底部,他将移至另一条小条。如果他走在他所在的地带一侧,如果他在y = 3或y = 4的正方形上,则他将移至另一条地带。如果y不是3或4,则他不会移动到另一条带上,并从游戏一开始就进入其中包含0的正方形,因此他死了。

由于摄像头始终位于马里奥的头顶上方,因此,每当马里奥改变条形时,方向的参考点都必须旋转90度。

取消测试程序

f=->s{                             #Move sequence is taken as string argument s.
  a=[0x333333]*8                   #Setup board as an array of 8 copies of 1100110011001100110011.
  v=[0,-1,0,1]                     #Displacements for moving.
  x=d=0                            #Mario starts at 0,4.
  y=m=4                            #d=offset for directions. m=4 when Mario is alive (value chosen for golfing reasons) 0 when dead.

  s.chars{|c|                      #For each character c in s
    a[y]&=~(1<<x)                  #Set the square where Mario is to 0.

    e="URDL".index(c)+d            #Decode the letter and add the offset 
    x+=v[e%4]                      #x movement direction is v[e%4]   
    y+=v[-~e%4]                    #y movement direction is v[(e+1)%4]
    p=x&-2                         #p is a copy of x with the last bit set to zero (righthand edge of strip).
    q=x/4%2                        #q is 0 for an even number strip, 1 for an odd number strip.
    y%9>7&&(                       #If y out of bounds (8 or -1)
      d-=q*2-1;                    #Adjust d so directions will be interpreted correctly on the next move.
      y,x=
        4-(q+x)%2,                 #y becomes 3 or 4 depending on the values of q and x.
        (p+4-(q+y)%2*11)%24        #If q+y is even, move 1 strip left. if even, move 2 strips right. Take x%24.  
    )
    x&2>0&&-y/2==-2&&(             #If x&2>0 Mario has walked sideways off a strip. If y is 3 or 4, move him to a different strip.
      y,x=                       
        (q+x)%2*7,                 #y becomes 0 or 7, depending on the values of q and x.
        (p+6-x%2*8+(q+y)%2)%24;    #If x%2 is even, move 2 strips left. If odd, move 1 strip right*. Pick the left or right column of the strip depending on (q+y)%2. Take x%24 
        d+=q*2-1                   #Adjust d so directions will be interpreted correctly on the next move.
    )

    m*=a[y]>>x&1                   #Multiply m by the value (0 or 1) of the current square. Mario is either alive (4) or dead (0).  
    #puts x,y,m,a.map{|i|"%022b"%i}#Uncomment this line for diagnostics.
  }
m}                                 #Return value of m.  


#Still alive, return value 4
puts f["DDDDDLUUUUU"] # Mario walks across a bridge and back.
puts f["RRRRDDDDLLL"] # Mario walks in a triangle.
puts f["LLLLLLUUUUUURRRRR"] # Mario walks in a bigger triangle.
puts f["ULLDRDDDRU"] # Mario puts himself in peril.
puts f["RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRR"] # Mario takes an unconventional route... and puts himself in peril.
puts f["DDDDLUUUULLLLDDDLUUULLLLDDDDLUUUULLLLDDDLUUULLLURRRUUURDDDRRRRUUURDDDRRRRUUURDDDRRRRUUUUURDDDDD"] 
puts f["DLDRDLDLLLDRRRDDDDLLLLLLLLLDRRRRRRRRRDDDDLLLDRRRDDDRUUURRRRULLLLUUUURRRULLLUUUUURDRURDRUURULURU"]

#Dead, return value 0

puts f["LLR"] #  Mario attempts to retrace a step and falls off.
puts f["UULDR"] #  Mario attempts to cross a tile twice and steps into air.
puts f["RRDDDDD"] #  Mario walks off a bridge at the first D (ignore any following steps).
puts f["RRRRDDDDLLLL"] #  Mario walks in a triangle and falls through the starting tile.
puts f["LLLLLLUUUUUURRRRRR"] #  Mario walks in a bigger triangle and falls through the starting tile.
puts f["UUUUUUUUUUUUUUUUUUUU"] #  Mario walks all the way around the planet and falls through the starting tile.
puts f["RURDRURDRDLDRDLDLDLULDLLUU"] # 

puts f["ULLDRDDDRUUU"] 
puts f["ULLDRDDDRUUL"] 
puts f["ULLDRDDDRUUR"] 
puts f["ULLDRDDDRUUD"] 
puts f["RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRR"] #text case in q is wrong. one more R added to make the kill.
puts f["RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRU"] 
puts f["RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRL"] 
puts f["RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRD"]

做得很好!我真的很喜欢“条形”贴图以及您占摄像机角度的方式。
darrylyeo
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.