Thay đổi trọng lực văn bản như câu đố 2048


14

Trong trò chơi 2048, bạn có một lưới và bạn có thể di chuyển các yếu tố theo bốn hướng. Tất cả đều di chuyển theo hướng đó càng xa càng tốt. Đối với thử thách này, bạn sẽ được cung cấp một chuỗi 2D vuông, có đệm (có dòng mới hoặc danh sách các chuỗi), như vậy:

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

hoặc là

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

Bốn hoạt động được left, right, up, và down. Kết quả của mỗi đầu vào trên:

Trái:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

hoặc là

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

Đúng:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

hoặc là

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

Lên:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

hoặc là

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

Xuống:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

hoặc là

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

Mục tiêu của bạn là xoay vòng thao tác nào được thực hiện mỗi lần lặp, thực hiện chúng vào nthời gian đầu vào . Vì vậy, nếu đơn đặt hàng của bạn là URDL, và đầu vào nói bắt đầu bằng D( 2, được lập chỉ mục 0) và bạn cần 5thao tác, bạn thực hiện D-L-U-R-D, sau đó in.

Đầu vào:

  • Một chuỗi trong một định dạng như trên
    • Không gian lưu trữ là không cần thiết (nhưng chúng có thể hữu ích)
    • Nó sẽ có ít nhất 2x2
    • Sẽ chỉ chứa ASCII có thể in và dấu cách (và dòng mới trên định dạng đầu vào của bạn)
    • Về mặt lý thuyết bạn nên hỗ trợ bất kỳ độ dài nào, nhưng hạn chế về bộ nhớ là ổn
  • Một số nguyên không âm n, cho số lượng các hoạt động sẽ được thực hiện
  • Một số nguyên 0-3hoặc 1-4, hoặc một chữ cái UDLR, mô tả hoạt động để bắt đầu.
    • Vì vậy, chương trình của bạn phải có thể bắt đầu hoặc kết thúc với bất kỳ hoạt động nào
    • Bạn có thể định nghĩa chúng theo bất kỳ thứ tự nào cho mục đích bắt đầu, nhưng nó phải là một thứ tự nhất quán, vì vậy Uđôi khi không thể làm theo Rvà đôi khi cũng tuân theo L.
  • Hoạt động phải được thực hiện không tầm thường
    • Bạn có thể thực hiện các thao tác theo thứ tự LDRU(trái, xuống, phải, lên) nhiều lần, nhưng không DLRUhoặc UDLR(vì UDgiống như DLRgiống như đang làm R.)

Đầu ra:

  • Chuỗi sau khi thực hiện bốn nlần thao tác
  • Định dạng đầu ra phải giống với định dạng đầu vào của bạn
  • Không gian lưu trữ là không cần thiết (nhưng chúng có thể hữu ích)

Thí dụ:

Ví dụ này sử dụng thứ tự URDL.

Đầu vào:

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       

Đầu ra cho n = 0-5: (chỉ in kết quả cuối cùng)

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      


        

Thực hiện đẹp, không có căn cứ của tôi


Liên quan , nhưng khác nhau, bởi vì người ta có thể có các chữ cái "rơi ra khỏi bản đồ".
mbomb007


1
Chỉ nên in kết quả cuối cùng, hoặc các bước trung gian quá? Ngoài ra, không phải kết quả chỉ là chu kỳ sau khi cả bốn thao tác đã được thực hiện một lần? (Không chắc chắn, chỉ cần đoán)
Luis Mendo

Chỉ là kết quả cuối cùng. Và tôi xác nhận rằng nó không phảichu kỳ .
mbomb007

Không tuần hoàn chỉ sau bốn hoạt động, đó là. Thời gian sẽ dài hơn nhiều.
mbomb007

Câu trả lời:


2

Thạch , 23 byte

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

Hãy thử trực tuyến!

Tôi có một chút không hài lòng, nhưng MATL cần một số cạnh tranh. : P

Sử dụng thứ tự URDL. Đầu vào:

  • mảng đầu vào như một mảng của các dòng đệm
  • số lần lặp lại
  • di chuyển để bắt đầu từ (1 = U, 2 = R, 3 = D, 4 = L)

Giải trình

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 byte

(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

Ung dung:

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

dlà chỉ số ban đầu vào các hướng URDL.


1

Python 2 , 226 224 204 193 byte

-1 byte nhờ 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)

Hãy thử trực tuyến!

Chức năng loại bỏ tất cả các khoảng trắng của từng thành phần trong danh sách và hoàn thành với khoảng trắng ở bên trái hoặc bên phải.

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

Điều này để hoán vị (xoay 90)) khi đầu vào là 0hoặc 1( Uhoặc D) và áp dụngg

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

1
Không gian thêm trong for i in (...).
Trelzevir

Đây về cơ bản là một phiên bản chơi golf của tôi (tôi không bao giờ bận tâm đến việc chơi golf nhiều).
mbomb007

1

MATL , 24 23 byte

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

Đặt hàng là URDL, 1dựa trên. Vì vậy, 1là Ù ,2 isr`, vv

Các đầu vào là: số lần, hướng ban đầu, ma trận char (sử dụng ;làm dấu tách hàng).

Hãy thử trực tuyến!


Tôi sẽ thêm một lời giải thích sau trong ngày
Luis Mendo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.