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

mbomb007
fuente
Relacionado , pero diferente, porque ese puede tener letras "caer del mapa".
mbomb007
Relacionado
Laikoni
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.
PurkkaKoodari
fuente
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.

Neil
fuente
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]
varilla
fuente
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!

Luis Mendo
fuente
Agregaré una explicación más tarde en el día
Luis Mendo