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       ']

네 작업은 left, right, up,와 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이고 입력이 D( 2, 0- 인덱스) 로 시작하고 5조작 이 필요 하면을 수행 D-L-U-R-D한 다음 인쇄합니다.

입력:

  • 위와 같은 형식의 문자열
    • 후행 공백은 필요하지 않지만 도움이 될 수 있습니다.
    • 최소 2x2입니다.
    • 인쇄 가능한 ASCII 및 공백 만 포함합니다 (입력 형식 당 줄 바꿈).
    • 이론적으로 모든 길이를 지원해야하지만 메모리 제약 조건은 괜찮습니다.
  • n수행 할 작업 수에 대한 음이 아닌 정수
  • 시작할 작업을 설명 하는 정수 0-3또는 1-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

답변:


2

젤리 , 23 바이트

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

온라인으로 사용해보십시오!

약간 불만족 스럽지만 MATL에는 경쟁이 필요했습니다. :피

주문을 사용합니다 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

자바 스크립트 (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

파이썬 (2) , 226 (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또는 1( U또는 D) 일 때 조옮김 (90º 회전)g

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

1
에 추가 공간이 for i in (...)있습니다.
Trelzevir

이것은 기본적으로 내 구현의 골프 버전입니다 (나는 골프를 많이 신경 쓰지 않았습니다).
mbomb007

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.