Cambia la gravedad del texto como el rompecabezas 2048


14

En el juego 2048, tienes una cuadrícula y puedes mover los elementos en cuatro direcciones. Todos se mueven en esa dirección lo más lejos que pueden. Para este desafío, se le dará una cadena 2D cuadrada y acolchada (ya sea con nuevas líneas o una lista de cadenas), de esta manera:

ab cd e 
 f ghij 
      kl
mno p   
 q r st 
u      v
 w x  y 
z       

o

['ab cd e ', ' f ghij ', '      kl', 'mno p   ', ' q r st ', 'u      v', ' w x  y ', 'z       ']

Las cuatro operaciones son left, right, up, y down. El resultado de cada uno en la entrada anterior:

Izquierda:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

o

['abcde   ', 'fghij   ', 'kl      ', 'mnop    ', 'qrst    ', 'uv      ', 'wxy     ', 'z       ']

Derecho:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

o

['   abcde', '   fghij', '      kl', '    mnop', '    qrst', '      uv', '     wxy', '       z']

Arriba:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

o

['abocdiel', 'mf ghsjv', 'un rp k ', 'zq x  t ', ' w    y ', '        ', '        ', '        ']

Abajo:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

o

['        ', '        ', '        ', ' b    e ', 'af c  j ', 'mn gd k ', 'uq rhitl', 'zwoxpsyv']

Su objetivo es rotar qué operación se realiza en cada iteración, realizándolas en los ntiempos de entrada . Entonces, si su orden es URDL, y la entrada dice que comience con D( 2, indexado a 0), y necesita 5operaciones, realice D-L-U-R-D, luego imprima.

Entrada:

  • Una cadena en un formato como el anterior
    • No se requieren espacios finales (pero probablemente sean útiles)
    • Será al menos 2x2
    • Solo contendrá ASCII y espacios imprimibles (y nuevas líneas según su formato de entrada)
    • Teóricamente deberías admitir cualquier longitud, pero las restricciones de memoria están bien
  • Un entero no negativo npara el número de operaciones que se realizarán.
  • Un entero 0-3o 1-4una letra que UDLRdescribe la operación para comenzar.
    • Por lo tanto, su programa debe poder comenzar o finalizar con cualquier operación
    • Puede definirlos en cualquier orden para fines de inicio, pero debe ser un orden coherente, por Ulo que a veces no puede seguir Ry también a veces seguir L.
  • Las operaciones deben realizarse de manera no trivial
    • Puede realizar operaciones en el orden LDRU(izquierda, abajo, derecha, arriba) repetidamente, pero no DLRUo UDLR(porque UDes lo mismo que D, y LRes lo mismo que hacer R).

Salida:

  • La cadena después de realizar las cuatro operaciones nveces
  • El formato de salida debe ser el mismo que el formato de entrada.
  • No se requieren espacios finales (pero probablemente sean útiles)

Ejemplo:

Este ejemplo usa el orden URDL.

Entrada:

10  (number of times operations are applied)
0   (starts with Up)
ab cd e 
 f ghij 
      kl
mno p   
 q r st 
u      v
 w x  y 
z       

Salidas para n = 0-5: (solo imprima el resultado final)

ab cd e 
 f ghij 
      kl
mno p   
 q r st 
u      v
 w x  y 
z       
---------------
abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 



---------------
abocdiel
 mfghsjv
   unrpk
    zqxt
      wy



---------------



      el
    dijv
   chspk
 bognrxt
amfuzqwy
---------------



el      
dijv    
chspk   
bognrxt 
amfuzqwy
---------------
eljvkxty
disprqw 
chgnz   
bofu    
am      


        

Mi implementación bonita y sin golf


Relacionado , pero diferente, porque ese puede tener letras "caer del mapa".
— mbomb007


1
¿Debería imprimirse solo el resultado final, o también los pasos intermedios? Además, ¿no es el resultado solo cíclico después de que las cuatro operaciones se hayan realizado una vez? (No estoy seguro, solo adivinando)
— Luis Mendo

Solo el resultado final. Y confirmé que no es cíclico .
— mbomb007

No es cíclico después de solo cuatro operaciones, es decir. El período será mucho más largo.
— mbomb007

Respuestas:


2

Jalea , 23 bytes

UZ
Ç¡=⁶$Þ€Ç$⁴¡ZU$⁵+⁴¤¡Y

Pruébalo en línea!

Estoy un poco insatisfecho, pero MATL necesitaba algo de competencia. :PAG

Utiliza el pedido URDL. Entradas:

  • la matriz de entrada como una matriz de líneas acolchadas
  • la cantidad de repeticiones
  • el movimiento para comenzar desde (1 = U, 2 = R, 3 = D, 4 = L)

Explicación

UZ       Helper link. Argument: A (the 2D array)
U        Reverse each line and...
 Z       ...transpose. Rotates 90° CCW.

Ç¡=⁶$Þ€Ç$⁴¡ZU$⁵+⁴¤¡Y    Main link. Arguments: A, n (2D array, repetitions)
Ç                       Rotate 90° CCW...
 ¡                      ...m times. (m = which move to start on)

     Þ                  Sort...
      €                 ...each line of the array...
  =⁶                    ...based on the characters' equality to " ".
       Ç                Rotate 90° CCW.
        $               Combine the sort and rotate to one action.
         ⁴¡             Do that n times. (n = repetition count)

           Z            Transpose and...
            U           ...reverse each line. Rotates 90° CW.
             $          Combine the transpose and reverse to one action.
                  ¡     Do that...
              ⁵+⁴¤      ...m + n times.

                   Y    Join the array by newlines.

2

JavaScript (ES6), 168 bytes

(n,d,s,t=s.replace([RegExp(`( )([^]{${l=s.search`
`}})(\\w)`),/(.)(\b)( )/,RegExp(`(\\w)([^]{${l}})( )`),/( )(\b)(.)/][d%4],`$3$2$1`))=>n?t!=s?f(n,d,t):f(n-1,d+1,s):s

Sin golf:

function gravity(count, direction, string) {
    let width = string.indexOf('\n');
    let up = new RegExp('( )([^]{' + width + '})(\\w)');
    let down = new RegExp('(\\w)([^]{' + width + '})( )');
    while (count--) {
        let regexp = [up, /(.)(\b)( )/, down, /( )(\b)(.)/][direction++ % 4];
        while (regexp.test(string)) string = string.replace(regexp, '$3$2$1');
    }
    return string;
}

des el índice inicial en las direcciones que son URDL.


1

Python 2 , 226 224 204 193 bytes

-1 byte gracias a Trelzevir

x,s,n=input()
j=''.join
g=lambda x,i:[eval("j(_.split(' ')).%sjust(len(_))"%'lr'[i%2])for _ in x]
for i in([0,3,1,2]*n)[s:s+n]:x=[map(j,zip(*g(map(j,zip(*x)),i))),g(x,i)][i>1];print'\n'.join(x)

Pruébalo en línea!

Función que elimina todos los espacios de cada elemento en la lista y completa con espacios a la izquierda o derecha.

g=lambda x,i:[eval("''.join(_.split(' ')).%sjust(len(_))"%'lr'[i%2])for _ in x]

Esto para transponer (rotar 90º) cuando la entrada es 0o 1( Uo D) y aplicarg

x=[map(''.join,zip(*g(map(''.join,zip(*x)),i))),g(x,i)][i>1]

1
Espacio extra en for i in (...).
— Trelzevir

Esta es básicamente una versión de golf de mi implementación (nunca me molesté mucho en jugar golf).
— mbomb007

1

MATL , 24 23 bytes

:+"@X!XJ_JXzJ32>S(c@_X!

Pedido sea URDL, 1basados en. Entonces 1es Ù ,2 isR` etc.

Las entradas son: número de veces, dirección inicial, matriz de caracteres (usando ;como separador de filas).

Pruébalo en línea!


Agregaré una explicación más tarde en el día
— Luis Mendo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.