Змініть гравітацію тексту, як головоломка 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, а потім друкуєте.

Вхід:

  • Рядок у такому форматі, як вище
    • Пробіли не потрібні (але вони, мабуть, корисні)
    • Це буде як мінімум 2х2
    • Містить лише ASCII для друку та пробіли (та нові рядки у вхідному форматі)
    • Теоретично ви повинні підтримувати будь-яку довжину, але обмеження пам'яті добре
  • Невід’ємне ціле число nдля кількості операцій, які будуть виконані
  • Ціле число 0-3або 1-4буква або UDLRопис операції, з якої слід почати.
    • Отже, ваша програма повинна мати можливість починати або закінчувати будь-яку операцію
    • Ви можете визначити їх у будь-якому порядку для початкових цілей, але він повинен бути послідовним порядком, тому Uне може іноді йти, Rа також іноді дотримуватися L.
  • Операції потрібно виконувати нетривіально
    • Ви можете робити операції в порядку LDRU(вліво, вниз, вправо, вгору) кілька разів, але ні DLRUабо UDLR(тому що UDце те саме D, що і LRвиконуватиR .)

Вихід:

  • Рядок після виконання чотирьох операцій 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
Чи слід друкувати лише остаточний результат, або проміжні кроки теж? Крім того, чи результат не просто циклічний після того, як всі чотири операції були виконані один раз? (Не впевнений, лише здогадуюсь)
Луїс Мендо

Просто кінцевий результат. І я підтвердив, що це не циклічно .
mbomb007

Не циклічний після лише чотирьох операцій, тобто. Період буде набагато довшим.
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

Python 2 , 226 224 204 193 байт

-1 байт завдяки 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)

Спробуйте в Інтернеті!

Функція, яка видаляє всі пробіли кожного елемента зі списку та доповнює пробіли зліва чи справа.

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

Це транспонування (поворот на 90 °) , коли вхід 0або 1( Uабо D) і застосуватиg

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

1
Додатковий простір в for i in (...).
Trelzevir

Це, в основному, версія мого втілення в гольф (я ніколи не силкувався сильно гольфувати ).
mbomb007

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.