Mario cadrà nel satellite che si restringe? (Diagramma aggiunto)


23

Super Mario Galaxy presenta duepianeti a forma di romboedroedro * piastrellati con piattaforme che si restringono mentre Mario attraversa. Se Mario cade in un buco triangolare o in uno spazio lasciato da una tessera che ha toccato in precedenza, verrà consumato dal buco nero nel nucleo. (Guarda: Hurry-Scurry Galaxy , Sea Slide Galaxy )

Immagine: MarioWiki.com

Immagine: MarioWiki.com

(Puoi pensare al pianeta come a un cubo 2x2x2 le cui facce sono state staccate e collegate tra loro da "ponti" 2x3.)

Sfortunatamente, dato che il mio controller è molto rotto, Mario non può saltare ed è limitato alle quattro direzioni cardinali. Inoltre, Mario si muove molto lentamente e non può ripercorrere nemmeno un passo senza prima far sparire la piattaforma dietro di lui.

Supponiamo che la videocamera sia sempre sopra la testa di Mario e che inizi in basso a destra su una faccia 2x2:

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

Il tuo programma prenderà un elenco o una serie di direzioni U D L R(su, giù, sinistra, destra), che rappresentano la passeggiata di Mario intorno al pianeta fino a una serie di passaggi. Il programma può produrre uno di due distinti output: uno che rappresenta che Mario è ancora vivo e che cammina, e l'altro che lo rappresenta da qualche parte lungo il suo cammino, Mario è caduto nel satellite che si restringe.

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

Ovviamente, a differenza dei diagrammi di cui sopra, dovrai prendere in considerazione il 3D. Ecco un diagramma che potrebbe aiutarti a visualizzare meglio lo scenario:

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

Quindi, secondo questo diagramma, UUUUURRRRpotrebbe assomigliare a questo:

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

E UUUUUUUUULURRRRRRpotrebbe apparire così:

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

Possa il programma più breve in byte w-aaaaaaaaaahh!

Casi test

Uscita 1: Still Alive

DDDDDLUUUUU - Mario attraversa un ponte e torna indietro.

RRRRDDDDLLL - Mario cammina in un triangolo.

LLLLLLUUUUUURRRRR - Mario cammina in un triangolo più grande.

ULLDRDDDRU - Mario si mette in pericolo.

RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRR - Mario prende una strada non convenzionale ... e si mette in pericolo.

Mario attraversa ogni tessera esattamente una volta. DDDDLUUUULLLLDDDLUUULLLLDDDDLUUUULLLLDDDLUUULLLURRRUUURDDDRRRRUUURDDDRRRRUUURDDDRRRRUUUUURDDDDD DLDRDLDLLLDRRRDDDDLLLLLLLLLDRRRRRRRRRDDDDLLLDRRRDDDRUUURRRRULLLLUUUURRRULLLUUUUURDRURDRUURULURU

Uscita 2: W-aaaaaaaaaahh!

LLR - Mario tenta di fare un passo indietro e cade.

UULDR - Mario tenta di attraversare una tessera due volte e si mette in aria.

RRDDDDD - Mario esce da un ponte alla prima D (ignora tutti i passaggi seguenti).

RRRRDDDDLLLL - Mario cammina in un triangolo e cade attraverso la tessera iniziale.

LLLLLLUUUUUURRRRRR - Mario cammina in un triangolo più grande e cade attraverso la tessera iniziale.

UUUUUUUUUUUUUUUUUUUU - Mario cammina lungo il pianeta e cade attraverso la tessera iniziale.

RURDRURDRDLDRDLDLDLULDLLUU - Mario prende una strada non convenzionale e diventa disorientato.

Mario, rendendosi conto del pericolo in cui si trova, non ha altra scelta.

ULLDRDDDRUUU ULLDRDDDRUUL ULLDRDDDRUUR ULLDRDDDRUUD RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRR RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRU RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRL RURDRURDRDLDRDLDLDLULDLLLLLLLLLLLLLLLLURRRRRRRRRRRRRRD

Infine, copia qualsiasi caso di test da "Mario attraversa ogni tessera esattamente una volta" e modifica o aggiungi un passaggio a caso. Mario dovrebbe cadere. (Se aggiungi un passaggio alla fine, Mario cade per afferrare la Power Star!)

* Cubo cantellato sarebbe un termine più corretto in quanto alcune facce non sono quadrate, ma devi ammettere che "rombicubottaedro" scorre più bello.


3
Punti bonus per risolverlo in Cubix o Cubically
Stephen

Questo riporta così tanti ricordi di aver giocato a Mario Galaxy, facilmente uno dei miei giochi preferiti di tutti i tempi.
Notjagan,

7
@StepHen O MarioLANG: P
ETHproductions

@Stephen anche se è un ottagono, esagonia sti ... Sai cosa, non importa, chi lo farebbe in hexAgony.
Magic Octopus Urn,

Nel 4 ° dall'ultimo caso di test, Mario non muore se non aggiungi un extra R. L'ho elaborato su carta per essere sicuro che il mio codice sia corretto.
Level River St

Risposte:


6

Rubino, golfato, 244 230 byte

Sembra funzionare bene, metterà alla prova un po 'di più.

->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, prima versione funzionante, 260 byte

Provalo online

Funzione lambda che accetta un argomento stringa. Restituisce 4 per vivo, 0 per morto.

->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}

Spiegazione

La scheda è spiegata in 6 strisce di dimensioni 2x8, rappresentate dai caratteri /\e Oseguenti. Questi sono mappati su una mappa 2D 24 * 8, dove x = (numero di strip) * 4 + (posizione orizzontale su strip) e y = posizione verticale su strip.

       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

Questi sono memorizzati in un array di 8 numeri binari, quindi x aumenta andando verso sinistra e y aumenta diminuendo.

L'array viene inizializzato con 8 copie del numero 0x33333333. Questo forma i quadrati a cui Mario è autorizzato a calpestare. Mentre Mario si muove attorno al quadrato in cui si trova viene impostato a zero e il quadrato in cui si sta muovendo viene testato: vive contiene un 1 e muore se contiene uno 0.

Se Mario esce dalla parte superiore o inferiore della striscia su cui si trova, si sposta su un'altra striscia. Se si allontana dal lato della striscia su cui si trova, se si trova su un quadrato con y = 3 o y = 4 si sposta su un'altra striscia. Se y non è 3 o 4, non si sposta su un'altra striscia e finisce in un quadrato che aveva 0 dall'inizio del gioco, quindi muore.

Poiché la telecamera è sempre sopra la testa di Mario, ogni volta che Mario cambia striscia, il riferimento per le direzioni deve essere ruotato di 90 gradi.

Non registrato nel programma di test

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"]

Ben fatto! Mi piace molto la mappatura "a strisce" e il modo in cui hai tenuto conto dell'angolazione della telecamera.
darrylyeo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.