2048パズルのようにテキストの重力を変更する


14

ゲーム2048では、グリッドがあり、4つの方向に要素を移動できます。それらはすべて、可能な限りその方向に移動します。このチャレンジでは、次のように、パディングされた正方形の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       ']

4つの操作は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-3または1-4、または文字UDLR
    • したがって、プログラムは任意の操作で開始または終了できる必要があります
    • 開始の目的で任意の順序で定義できますが、一貫した順序である必要があるため、後にU続くRことも、時には続くこともできませんL
  • 操作は簡単に実行する必要があります
    • LDRU繰り返し(左、下、右、上)の順序で操作を行うことはできますが、そうではありません(DLRUまたはと同じであり、実行と同じです)。UDLRUDDLRR

出力:

  • 4 n回の操作を実行した後の文字列
  • 出力形式は入力形式と同じである必要があります
  • 末尾のスペースは必要ありません(ただし、おそらく役に立つでしょう)

例:

この例では、順序を使用してい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
最終結果のみ、または中間ステップも印刷する必要がありますか?また、4つの操作すべてが1回実行された後、結果は単なる循環ではありませんか?(わからない、推測するだけ)
ルイスメンドー

ちょうど最終結果。そして、私はそれが周期的ないことを確認しました。
mbomb007

つまり、4つの操作だけで循環的ではありません。期間はずっと長くなります。
mbomb007

回答:


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

パイソン2226の 224 204 193バイト

Trelzevirのおかげで-1バイト

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]

これは、入力が0または1UまたはD)であるときに転置(90度回転)して適用g

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

1
の余分なスペースfor i in (...)
トレゼビル

これは基本的に私の実装のゴルフバージョンです(私はそれをあまり気にしませんでした)。
mbomb007

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.