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