像2048拼图一样更改文字重力


14

在游戏2048中,您有一个网格,并且可以在四个方向上移动元素。他们都朝着这个方向努力。对于此挑战,将为您提供带填充的方形2D字符串(带有换行符或字符串列表),如下所示:

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

要么

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

这四个操作是leftrightup,和down。以上输入中每个的结果:

剩下:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

要么

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

对:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

要么

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

上:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

要么

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

下:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

要么

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

您的目标是轮流在每次迭代中执行哪些操作,并在输入n时间执行这些操作。因此,如果您的订单是URDL,并且输入说要以D2,索引为0的索引)开头,并且您需要进行5操作,请执行D-L-U-R-D,然后进行打印。

输入:

  • 像上面格式的字符串
    • 不需要尾随空格(但可能会有所帮助)
    • 至少为2x2
    • 仅包含可打印的ASCII和空格(以及每种输入格式的换行符)
    • 理论上,您应该支持任何长度,但是内存限制可以
  • 非负整数,n表示将要执行的操作数
  • 一个整数0-31-4,或一个字母UDLR,描述开始的操作。
    • 因此,您的程序必须能够以任何操作开始或结束
    • 您可以按开始的顺序以任何顺序定义它们,但必须是一致的顺序,因此U有时不能遵循R,有时也不能遵循L
  • 操作必须轻而易举地进行
    • 您可以按LDRU(左,下,右,上)的顺序重复执行操作,但不能DLRUUDLR(因为UD与相同D,并且LR与相同R)。

输出:

  • 进行四倍运算后的字符串n
  • 输出格式必须与您的输入格式相同
  • 不需要尾随空格(但可能会有所帮助)

例:

本示例使用order URDL

输入:

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       

n = 0-5的输出:(仅打印最终结果)

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      


        

我漂亮的,不折不扣的实现


相关,但有所不同,因为一个字母可以“落在地图上”。
mbomb007


1
应该只打印最终结果,还是中间步骤?此外,在完成所有四个操作一次之后,结果是否只是循环的?(不确定,只是猜测)
Luis Mendo

只是最终结果。而且我确认这不是周期性的
mbomb007

也就是说,仅执行四个操作就不会循环。期限将更长。
mbomb007 '17

Answers:


2

果冻,23字节

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

在线尝试!

我有点不满意,但是MATL需要一些竞争。:P

使用命令URDL。输入:

  • 输入数组为填充行数组
  • 重复次数
  • 从(1 = U,2 = R,3 = D,4 = L)开始

说明

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个字节

(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

取消高尔夫:

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

d是指向的初始索引URDL


1

Python 2中226 224 204 193字节

-1字节感谢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)

在线尝试!

删除列表中每个元素的所有空格并在左侧或右侧添加空格的函数。

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

当输入为01UD)时移调(旋转90º )并应用g

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

1
中的多余空间for i in (...)
Trelzevir

这基本上是我的实现的高尔夫版本(我从不费心去打高尔夫)。
mbomb007

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.