Марио упадет в Сокращающийся Спутник? (Диаграмма добавлена)

23

Супер Марио Галактика имеет две ромбоубооктаэдрические * планеты, облицованные плитками с платформами, которые сжимаются, когда Марио пересекает. Если Марио упадет в треугольную дыру или пробел, оставленный плиткой, к которой он ранее прикоснулся, он будет поглощен черной дырой в ядре. (Часы: суматошный Galaxy , море Slide Galaxy )

Изображение: MarioWiki.com

Изображение: MarioWiki.com

(Вы можете думать о планете как о кубе 2x2x2, грани которого были отделены и соединены друг с другом 2x3 "мостами".)

К сожалению, так как мой контроллер очень сломан, Марио не может прыгать и ограничен четырьмя основными направлениями. Кроме того, Марио движется очень медленно и не может проследить даже один шаг без предварительного исчезновения платформы позади него.

Давайте предположим, что камера всегда находится над головой Марио, и он начинает в правом нижнем углу лица 2х2:

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

Ваша программа будет принимать список или строку направлений U D L R(вверх, вниз, влево, вправо), представляющих прогулку Марио по планете в виде последовательности шагов. Программа может выводить один из двух различных выходных данных: один, представляющий, что Марио все еще жив, и другой, представляющий, что где-то вдоль его пути, Марио упал в Сокращающийся Спутник.

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-aaaaaaaaaahh!

Тестовые случаи

Выход 1: все еще жив

DDDDDLUUUUU - Марио ходит по мосту и обратно.

RRRRDDDDLLL - Марио ходит в треугольнике.

LLLLLLUUUUUURRRRR - Марио ходит в большем треугольнике.

ULLDRDDDRU - Марио подвергает себя опасности.

RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRR - Марио идет нетрадиционным путем ... и подвергает себя опасности.

Марио пересекает каждую плитку ровно один раз. DDDDLUUUULLLLDDDLUUULLLLDDDDLUUUULLLLDDDLUUULLLURRRUUURDDDRRRRUUURDDDRRRRUUURDDDRRRRUUUUURDDDDD DLDRDLDLLLDRRRDDDDLLLLLLLLLDRRRRRRRRRDDDDLLLDRRRDDDRUUURRRRULLLLUUUURRRULLLUUUUURDRURDRUURULURU

Выход 2: W-аааааааааахх!

LLR - Марио пытается сделать шаг назад и падает.

UULDR - Марио дважды пытается пересечь плитку и выходит в воздух.

RRDDDDD - Марио уходит с моста на первом D (игнорируйте любые последующие шаги).

RRRRDDDDLLLL - Марио ходит в треугольнике и падает сквозь стартовую плитку.

LLLLLLUUUUUURRRRRR - Марио ходит в большем треугольнике и падает сквозь стартовую клетку.

UUUUUUUUUUUUUUUUUUUU - Марио ходит по планете и проваливается сквозь стартовую плитку.

RURDRURDRDLDRDLDLDLULDLLUU - Марио идет нетрадиционным путем и становится дезориентированным.

Марио, понимая, в какой опасности он находится, не имеет выбора.

ULLDRDDDRUUU ULLDRDDDRUUL ULLDRDDDRUUR ULLDRDDDRUUD RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRR RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRU RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRL RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRD

Наконец, скопируйте любой контрольный пример из «Марио пересекает каждую плитку ровно один раз» и измените или добавьте один шаг наугад. Марио должен упасть. (Если вы добавите шаг до конца, Марио падает, чтобы схватить Звезду власти!)

* Cantellated cube был бы более правильным термином, так как некоторые грани не квадратные, но вы должны признать, что «ромбикубоктаэдр» выглядит лучше.

darrylyeo
источник
3
Бонусные баллы за решение этой проблемы в Cubix или Cubically
Стивен
Это возвращает столько воспоминаний об игре Mario Galaxy - легко одной из моих любимых игр всех времен.
Notjagan
7
@StepHen Или MarioLANG: P
ETHproductions
@ Стефен, хотя это восьмиугольник, шестигранник, еще раз ... Знаешь, что, неважно, кто бы сделал это в hexAgony.
Волшебная Урна Осьминога
В 4-м из последнего теста Марио не умрет, если вы не добавите лишнее R. Я разработал это на бумаге, чтобы убедиться, что мой код правильный.
Уровень Река St

Ответы:

6

Рубин, гольф, 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 байт

Попробуйте онлайн

Лямбда-функция принимает строковый аргумент. Возвращает 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. Это образует квадраты, на которые Марио разрешено наступать. Когда Марио перемещается по квадрату, на котором он находится, устанавливается в ноль, и квадрат, к которому он движется, проверяется - он живет, он содержит 1, и умирает, если он содержит 0.

Если Марио уходит с верха или низа полосы, на которой он находится, он переходит к другой полосе. Если он уходит со стороны полосы, на которой он находится, если он находится на квадрате с y = 3 или y = 4, он переходит к другой полосе. Если у не 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"]
Уровень реки St
источник
Красиво сделано! Мне очень нравится отображение "полосы" и то, как вы учитываете угол наклона камеры.
darrylyeo