Changer la gravité du texte comme le puzzle 2048

14

Dans le jeu 2048, vous avez une grille et vous pouvez déplacer les éléments dans quatre directions. Ils vont tous dans cette direction autant qu'ils le peuvent. Pour ce défi, vous recevrez une chaîne 2D carrée rembourrée (avec des nouvelles lignes ou une liste de chaînes), comme suit:

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

ou

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

Les quatre opérations sont left, right, upet down. Le résultat de chacun sur l'entrée ci-dessus:

La gauche:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

ou

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

Droite:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

ou

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

Vers le haut:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

ou

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

Vers le bas:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

ou

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

Votre objectif est de faire pivoter quelle opération est effectuée à chaque itération, en les exécutant sur les ntemps d' entrée . Donc, si votre commande est URDL, et l'entrée indique de commencer par D( 2, indexé 0), et si vous avez besoin d' 5opérations, vous effectuez D-L-U-R-D, puis imprimez.

Contribution:

  • Une chaîne dans un format comme ci-dessus
    • Les espaces de fin ne sont pas nécessaires (mais ils sont probablement utiles)
    • Ce sera au moins 2x2
    • Contiendra uniquement de l'ASCII imprimable et des espaces (et des retours à la ligne selon votre format d'entrée)
    • Vous devriez théoriquement prendre en charge n'importe quelle longueur, mais les contraintes de mémoire sont correctes
  • Un entier non négatif,, npour le nombre d'opérations qui seront effectuées
  • Un entier 0-3ou 1-4, ou une lettre UDLR, décrivant l'opération pour commencer.
    • Votre programme doit donc pouvoir démarrer ou se terminer avec n'importe quelle opération
    • Vous pouvez les définir dans n'importe quel ordre à des fins de démarrage, mais ce doit être un ordre cohérent, donc Une peut pas parfois suivre Ret parfois aussi suivre L.
  • Les opérations doivent être effectuées de manière non triviale
    • Vous pouvez effectuer des opérations dans l'ordre LDRU(gauche, bas, droite, haut) à plusieurs reprises, mais pas DLRUou UDLR(car UDc'est la même chose queD , et LRc'est la même chose que faire R.)

Production:

  • La chaîne après avoir effectué les quatre opérations nfois
  • Le format de sortie doit être le même que votre format d'entrée
  • Les espaces de fin ne sont pas nécessaires (mais ils sont probablement utiles)

Exemple:

Cet exemple utilise la commande URDL .

Contribution:

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       

Sorties pour n = 0-5: (il suffit d'imprimer le résultat 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      


        

Ma jolie implémentation non golfée

mbomb007
la source
Lié , mais différent, car celui-ci peut avoir des lettres "tomber de la carte".
mbomb007
En relation
Laikoni
1
Doit être uniquement imprimer le résultat final, ou les étapes intermédiaires aussi? De plus, le résultat n'est-il pas simplement cyclique après que les quatre opérations ont été effectuées une fois? (Pas sûr, juste deviner)
Luis Mendo
Juste le résultat final. Et j'ai confirmé que ce n'était pas cyclique .
mbomb007
Pas cyclique après seulement quatre opérations, c'est-à-dire. La période sera beaucoup plus longue.
mbomb007

Réponses:

2

Gelée , 23 octets

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

Essayez-le en ligne!

Je suis un peu insatisfait, mais MATL avait besoin de compétition. : P

Utilise la commande URDL. Contributions:

  • le tableau d'entrée sous forme de tableau de lignes matelassées
  • le nombre de répétitions
  • le mouvement à partir de (1 = U, 2 = R, 3 = D, 4 = L)

Explication

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
la source
2

JavaScript (ES6), 168 octets

(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

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

dest l'indice initial dans les directions qui le sont URDL.

Neil
la source
1

Python 2 , 226 224 204 193 octets

-1 octet grâce à 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)

Essayez-le en ligne!

Fonction qui supprime tous les espaces de chaque élément de la liste et complète avec des espaces à gauche ou à droite.

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

Ceci pour transposer (tourner à 90º) lorsque l'entrée est 0ou 1( Uou D) et appliquerg

x=[map(''.join,zip(*g(map(''.join,zip(*x)),i))),g(x,i)][i>1]
Barre
la source
1
Espace supplémentaire for i in (...).
Trelzevir
Il s'agit essentiellement d'une version golfée de mon implémentation (je n'ai jamais pris la peine de jouer beaucoup au golf).
mbomb007
1

MATL , 24 23 octets

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

Commande URDL, 1-Basé. 1Est donc Ù ,2is R`, etc.

Les entrées sont: nombre de fois, direction initiale, matrice de caractères (en utilisant ;comme séparateur de lignes).

Essayez-le en ligne!

Luis Mendo
la source
J'ajouterai une explication plus tard dans la journée
Luis Mendo