Ubah gravitasi teks seperti puzzle 2048

14

Dalam permainan 2048, Anda memiliki kisi, dan Anda dapat memindahkan elemen dalam empat arah. Mereka semua bergerak ke arah itu sejauh yang mereka bisa. Untuk tantangan ini, Anda akan diberi string 2D persegi berlapis (baik dengan baris baru, atau daftar string), seperti:

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

atau

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

Empat operasi yang left, right, up, dan down. Hasil masing-masing pada input di atas:

Kiri:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

atau

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

Baik:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

atau

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

Naik:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

atau

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

Turun:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

atau

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

Tujuan Anda adalah memutar operasi mana yang dilakukan setiap iterasi, dan menjalankannya pada waktu input n. Jadi jika pesanan Anda adalah URDL, dan input mengatakan mulai dengan D( 2, 0-diindeks), dan Anda perlu 5operasi, Anda lakukan D-L-U-R-D, kemudian cetak.

Memasukkan:

  • Sebuah string dalam format seperti di atas
    • Ruang tambahan tidak diperlukan (tetapi mungkin membantu)
    • Paling tidak akan 2x2
    • Hanya akan berisi ASCII dan spasi yang dapat dicetak (dan baris baru per format input Anda)
    • Secara teoritis Anda harus mendukung panjang apa pun, tetapi kendala memori tidak masalah
  • Integer non-negatif n,, untuk jumlah operasi yang akan dilakukan
  • Integer 0-3atau 1-4, atau surat UDLR, yang menjelaskan operasi untuk memulai.
    • Jadi program Anda harus dapat memulai atau mengakhiri dengan operasi apa pun
    • Anda dapat menentukannya dalam urutan apa pun untuk tujuan awal, tetapi haruslah urutan yang konsisten, sehingga Uterkadang tidak dapat mengikuti Rdan juga terkadang mengikuti L.
  • Operasi harus dilakukan secara non-sepele
    • Anda bisa melakukan operasi dalam urutan LDRU(kiri, bawah, kanan, atas) berulang kali, tetapi tidak DLRUatau UDLR(karena UDsama seperti D, dan LRsama seperti melakukan R.)

Keluaran:

  • Tali setelah melakukan empat nkali operasi
  • Format output harus sama dengan format input Anda
  • Ruang tambahan tidak diperlukan (tetapi mungkin membantu)

Contoh:

Contoh ini menggunakan perintah URDL.

Memasukkan:

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       

Output untuk n = 0-5: (cetak saja hasil akhirnya)

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      


        

Implementasi saya yang cantik dan tidak serigala

mbomb007
sumber
Terkait , tetapi berbeda, karena orang itu dapat memiliki huruf "jatuh dari peta".
mbomb007
Terkait
Laikoni
1
Haruskah hanya mencetak hasil akhir, atau langkah perantara juga? Juga, bukankah hasilnya hanya siklik setelah keempat operasi telah dilakukan sekali? (Tidak yakin, hanya menebak-nebak)
Luis Mendo
Hanya hasil akhirnya. Dan saya menegaskan bahwa itu bukan siklik .
mbomb007
Bukan siklus setelah hanya empat operasi, yaitu. Masa akan lebih lama.
mbomb007

Jawaban:

2

Jelly , 23 byte

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

Cobalah online!

Saya agak tidak puas, tetapi MATL membutuhkan beberapa kompetisi. : P

Menggunakan pesanan URDL. Input:

  • array input sebagai array dari garis-garis empuk
  • jumlah pengulangan
  • langkah untuk memulai dari (1 = U, 2 = R, 3 = D, 4 = L)

Penjelasan

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
sumber
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

Tidak Disatukan:

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

dadalah indeks awal ke arah yang URDL.

Neil
sumber
1

Python 2 , 226 224 204 193 byte

-1 byte berkat 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)

Cobalah online!

Fungsi yang menghapus semua spasi dari setiap elemen dalam daftar dan lengkap dengan spasi di kiri atau kanan.

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

Ini untuk mengubah posisi (putar 90º) ketika inputnya adalah 0atau 1( UatauD ) dan terapkang

x=[map(''.join,zip(*g(map(''.join,zip(*x)),i))),g(x,i)][i>1]
tongkat
sumber
1
Ruang ekstra di for i in (...).
Trelzevir
Ini pada dasarnya adalah versi golf dari implementasi saya (saya tidak pernah terlalu peduli untuk golf itu).
mbomb007
1

MATL , 24 23 byte

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

Pesanan URDL, 1berbasis. Begitu1 juga Ù ,2 isR` dll.

Input adalah: berapa kali, arah awal, matriks char (menggunakan ; sebagai pemisah baris).

Cobalah online!

Luis Mendo
sumber
Saya akan menambahkan penjelasan di kemudian hari
Luis Mendo