Изменить гравитацию текста, как головоломки 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']

Up:

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
источник
Связанные , но разные, потому что у них могут быть буквы "упасть с карты".
mbomb007
1
Стоит только распечатать конечный результат или промежуточные этапы тоже? Кроме того, не является ли результат просто циклическим после того, как все четыре операции были выполнены один раз? (Не уверен, просто догадываюсь)
Луис Мендо
Просто конечный результат. И я подтвердил, что это не циклично .
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.
PurkkaKoodari
источник
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

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

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 (...).
Трелзевир,
Это в основном версия моей реализации в гольф (я никогда не беспокоился об этом).
mbomb007
1

MATL , 24 23 байта

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

Заказ URDL, 1-. Так же 1это R ,2 isR` и т. Д.

Входные данные: количество раз, начальное направление, матрица символов (используется в ;качестве разделителя строк).

Попробуйте онлайн!

Луис Мендо
источник
Я добавлю объяснение позже в тот же день
Луис Мендо