2048 yapboz gibi metin yerçekimi değiştirme


14

Oyunda 2048, bir ızgara var ve öğeleri dört yönde hareket ettirebilirsiniz. Hepsi olabildiğince bu yönde hareket ediyor. Bu meydan okuma için, aşağıdaki gibi bir yastıklı, kare 2D dize (yeni satırlarla veya dizelerin bir listesi) verilecektir:

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

veya

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

Dört operasyonlardır left, right, up, ve down. Yukarıdaki girişlerde her birinin sonucu:

Ayrıldı:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

veya

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

Sağ:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

veya

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

yukarı:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

veya

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

Aşağı:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

veya

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

Amacınız, her yinelemede hangi işlemin gerçekleştirildiğini döndürmek ve bunları giriş nzamanlarında yapmaktır . Bu nedenle, siparişiniz buysa URDLve girdi D( 2, 0 dizinli) ile başlıyorsa ve 5işlemlere ihtiyacınız varsa, gerçekleştirin D-L-U-R-D, ardından yazdırın.

Giriş:

  • Yukarıdaki gibi bir formattaki bir dize
    • Sondaki boşluklar gerekli değildir (ancak muhtemelen yararlıdır)
    • En az 2x2 olacak
    • Yalnızca yazdırılabilir ASCII ve boşluklar (ve giriş biçiminize göre yeni satırlar) içerir
    • Teorik olarak herhangi bir uzunluğu desteklemelisiniz, ancak bellek kısıtlamaları iyi
  • nGerçekleştirilecek işlem sayısı için negatif olmayan bir tam sayı
  • Başlamak için işlemi açıklayan bir tamsayı 0-3veya 1-4bir harf UDLR.
    • Böylece programınız herhangi bir işlemle başlayabilmeli veya bitebilmelidir.
    • Bunları başlangıç ​​amacıyla herhangi bir sırayla tanımlayabilirsiniz, ancak tutarlı bir sıra olmalıdır, bu yüzden Ubazen takip edemez Rve bazen takip edemez L.
  • İşlemler önemsiz olmayan bir şekilde yapılmalıdır
    • İşlemleri sırayla LDRU(sol, aşağı, sağ, yukarı) art arda yapabilirsiniz, ancak değil DLRUya da yapabilirsiniz UDLR(çünkü UDaynıdır Dve LRaynen yapmakla aynıdır R).

Çıktı:

  • Dört işlem nsüresinin gerçekleştirilmesinden sonraki dize
  • Çıktı biçimi, giriş biçiminizle aynı olmalıdır
  • Sondaki boşluklar gerekli değildir (ancak muhtemelen yararlıdır)

Misal:

Bu örnek siparişi kullanır URDL.

Giriş:

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 için çıkışlar: (sadece sonucu yazdırın)

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      


        

Güzel, dinlenmemiş uygulamam


İlgili , ama farklı, çünkü "haritadan düşmek" harfleri olabilir.
mbomb007


1
Sadece nihai sonucu mı yoksa ara adımları mı yazdırmalısınız? Ayrıca, dört işlemin tümü bir kez gerçekleştirildikten sonra sonuç sadece döngüsel değil mi? (Emin değilim, sadece tahmin ediyorum)
Luis Mendo

Sadece sonuç. Ve bunun döngüsel olmadığını doğruladım .
mbomb007

Sadece dört işlemden sonra döngüsel değil. Süre çok daha uzun olacak.
mbomb007

Yanıtlar:


2

Jöle , 23 bayt

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

Çevrimiçi deneyin!

Biraz memnun değilim ama MATL'nin biraz rekabete ihtiyacı vardı. : P

Siparişi kullanır URDL. girişler:

  • giriş dizisini dolgulu çizgiler dizisi olarak
  • tekrar sayısı
  • başlangıç ​​hareketi (1 = U, 2 = R, 3 = D, 4 = L)

açıklama

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 bayt

(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

Ungolfed:

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

dolan yönergeler için başlangıç ​​dizinidir URDL.


1

Python 2 , 226 224 204 193 bayt

Trelzevir sayesinde -1 bayt

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)

Çevrimiçi deneyin!

Listedeki her öğenin tüm boşluklarını kaldıran ve sol veya sağdaki boşluklarla tamamlanan işlev.

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

Giriş 0veya 1( Uveya D) olduğunda devrik (90 (döndür ) veg

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

1
İçinde fazladan boşluk for i in (...).
17'de Trelzevir

Bu temelde benim uygulama golf edilmiş bir versiyonu (asla çok golf için rahatsız).
mbomb007

1

MATL , 24 23 bayt

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

Sipariş edilir URDL, 1tabanlı. Yani 1Ù ise ,2 isR` vb

Girişler: kaç kez, başlangıç ​​yönü, karakter matrisi ( ;satır ayırıcı olarak kullanılır ).

Çevrimiçi deneyin!


Günün ilerleyen saatlerinde bir açıklama ekleyeceğim
Luis Mendo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.