Чи потрапить Маріо в супутник, що скорочується? (Діаграма додана)


23

Супер Маріо Галактика оснащений двомапланетами у формі ромбікобоктаеда, обробленими плитками, що стискаються, коли Маріо перебігає. Якщо Маріо потрапить у трикутну дірку або зазор, залишений плиткою, яку він раніше торкався, його поглине чорна діра в основі. (Годинник: метушливий Galaxy , море Slide Galaxy )

Зображення: MarioWiki.com

Зображення: MarioWiki.com

(Ви можете уявити про планету як куб 2х2х2, обличчя якого були відокремлені та з'єднані один з одним 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-aaaaaaaaahh!

LLR - Маріо намагається просунути крок і падає.

UULDR - Маріо намагається двічі перетнути плитку і ступить у повітря.

RRDDDDD - Маріо спускається з мосту на першій D (ігноруйте будь-які наступні кроки).

RRRRDDDDLLLL - Маріо йде в трикутник і провалюється через стартову плитку.

LLLLLLUUUUUURRRRRR - Маріо ходить у більший трикутник і провалюється через стартову плитку.

UUUUUUUUUUUUUUUUUUUU - Маріо прогулює всю планету і провалюється через стартову плитку.

RURDRURDRDLDRDLDLDLULDLLUU - Маріо проходить нетрадиційний маршрут і стає дезорієнтованим.

Маріо, усвідомлюючи небезпеку, в якій він знаходиться, залишається без вибору.

ULLDRDDDRUUU ULLDRDDDRUUL ULLDRDDDRUUR ULLDRDDDRUUD RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRR RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRU RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRL RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRD

Нарешті, скопіюйте будь-який тестовий випадок із "Маріо перетинає кожну плитку рівно один раз" та змініть або додайте один крок навмання. Маріо повинен впасти. (Якщо додати крок до кінця, Маріо падає, щоб схопити Power Star!)

* Нарізаний куб був би більш правильним терміном, оскільки деякі грані не є квадратними, але ви повинні визнати - "ромбікубоктаедр" протікає приємніше.


3
Бонусні бали за вирішення цього питання в Cubix або Cubically
Стівен

Це повертає стільки спогадів про гру в Mario Galaxy - легко одну з моїх улюблених ігор усіх часів.
notjagan

7
@StepHen Або MarioLANG: P
ETHproductions

@Stephen, хоча це восьмигранник, шестикутник ... Знаєте, що, неважливо, хто це зробив би в шестигранній геніагонії.
Magic Octopus Urn

У 4-му з останнього тестового випадку Маріо не вмирає, якщо ви не додасте зайвого R. Я опрацював це на папері, щоб переконатися, що мій код правильний.
Рівень річки Св.

Відповіді:


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.

Якщо Маріо відходить від верхньої або нижньої частини смуги, на якій він знаходиться, він переходить до іншої смуги. Якщо він відходить від сторони смуги, на якій він знаходиться, якщо він знаходиться на квадраті з у = 3 або у = 4, він переходить до іншої смуги. Якщо y не 3 чи 4, він не переходить до іншої смуги і опиняється на квадраті, який із самого початку гри мав 0, тож він помирає.

Оскільки камера завжди знаходиться над головою Маріо, кожного разу, коли Маріо змінює смугу, орієнтир для напрямків повинен повертатися на 90 градусів.

Ungolfed в тестовій програмі

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.