Zmień grawitację tekstu, jak puzzle 2048

14

W grze 2048 masz siatkę i możesz przenosić elementy w czterech kierunkach. Wszystkie poruszają się w tym kierunku tak daleko, jak to możliwe. Do tego wyzwania otrzymasz wyściełany, kwadratowy ciąg 2D (albo z nowymi liniami, albo z listą ciągów), w następujący sposób:

ab cd e 
 f ghij 
      kl
mno p   
 q r st 
u      v
 w x  y 
z       

lub

['ab cd e ', ' f ghij ', '      kl', 'mno p   ', ' q r st ', 'u      v', ' w x  y ', 'z       ']

Cztery operacje są left, right, up, i down. Wynik każdego z powyższych danych wejściowych:

Lewo:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

lub

['abcde   ', 'fghij   ', 'kl      ', 'mnop    ', 'qrst    ', 'uv      ', 'wxy     ', 'z       ']

Dobrze:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

lub

['   abcde', '   fghij', '      kl', '    mnop', '    qrst', '      uv', '     wxy', '       z']

W górę:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

lub

['abocdiel', 'mf ghsjv', 'un rp k ', 'zq x  t ', ' w    y ', '        ', '        ', '        ']

Na dół:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

lub

['        ', '        ', '        ', ' b    e ', 'af c  j ', 'mn gd k ', 'uq rhitl', 'zwoxpsyv']

Twoim celem jest obrócenie, która operacja jest wykonywana podczas każdej iteracji, wykonując je w czasie wejściowym n. Więc jeśli twoje zamówienie jest URDL, a dane wejściowe mówią, aby zacząć od D( 2, indeksowane 0), a potrzebujesz 5operacji, wykonujesz D-L-U-R-D, a następnie drukujesz.

Wejście:

  • Ciąg w formacie jak wyżej
    • Spacje końcowe nie są wymagane (ale prawdopodobnie są pomocne)
    • Będzie to co najmniej 2x2
    • Będzie zawierać tylko drukowalne ASCII i spacje (oraz znaki nowego wiersza według formatu wejściowego)
    • Powinieneś teoretycznie obsługiwać dowolną długość, ale ograniczenia pamięci są w porządku
  • Nieujemna liczba całkowita, ndla liczby operacji, które zostaną wykonane
  • Liczba całkowita 0-3lub 1-4litera UDLRopisująca operację na początek.
    • Twój program musi być w stanie rozpocząć lub zakończyć się dowolną operacją
    • Możesz zdefiniować je w dowolnej kolejności dla celów początkowych, ale musi to być spójna kolejność, więc Uczasami nie można wykonać, Ra czasem także wykonać L.
  • Operacje muszą być wykonywane nietrywialnie
    • Możesz wykonywać operacje w kolejności LDRU(w lewo, w dół, w prawo, w górę) wielokrotnie, ale nie DLRUlub UDLR(ponieważ UDjest taki sam, jak Di LRrobi to samo R.)

Wynik:

  • Łańcuch po wykonaniu czterech operacji nrazy
  • Format wyjściowy musi być taki sam jak format wejściowy
  • Spacje końcowe nie są wymagane (ale prawdopodobnie są pomocne)

Przykład:

W tym przykładzie użyto zamówienia URDL.

Wejście:

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       

Dane wyjściowe dla n = 0-5: (wystarczy wydrukować wynik końcowy)

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      


        

Moja ładna, nie golfowa implementacja

mbomb007
źródło
Powiązane , ale inne, ponieważ można mieć litery „spadające z mapy”.
mbomb007
Powiązane
Laikoni
1
Powinien być wydrukowany tylko wynik końcowy, czy też kroki pośrednie? Czy wynik nie jest po prostu cykliczny po wykonaniu wszystkich czterech operacji jeden raz? (Nie jestem pewien, tylko zgaduję)
Luis Mendo
Właśnie wynik końcowy. I potwierdziłem, że to nie jest cykliczne .
mbomb007
To znaczy nie cykliczne po zaledwie czterech operacjach. Okres będzie znacznie dłuższy.
mbomb007

Odpowiedzi:

2

Galaretka , 23 bajty

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

Wypróbuj online!

Jestem trochę niezadowolony, ale MATL potrzebował trochę konkurencji. : P

Używa kolejności URDL. Wejścia:

  • tablica wejściowa jako tablica wypełnionych linii
  • liczba powtórzeń
  • ruch, aby rozpocząć (1 = U, 2 = R, 3 = D, 4 = L)

Wyjaśnienie

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
źródło
2

JavaScript (ES6), 168 bajtów

(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

Nie golfowany:

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

djest początkowym indeksem w kierunkach, które są URDL.

Neil
źródło
1

Python 2 , 226 224 204 193 bajtów

-1 bajt dzięki Trelzevirowi

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)

Wypróbuj online!

Funkcja, która usuwa wszystkie spacje każdego elementu na liście i uzupełnia spacje po lewej lub prawej stronie.

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

Ma to na celu transpozycję (obrót o 90º), gdy wejście jest 0lub 1( Ulub D) i zastosowanieg

x=[map(''.join,zip(*g(map(''.join,zip(*x)),i))),g(x,i)][i>1]
Pręt
źródło
1
Dodatkowe miejsce w for i in (...).
Trełżewir
Jest to w zasadzie wersja golfowa mojej implementacji (nigdy nie zadawałem sobie z tym trudu).
mbomb007
1

MATL , 24 23 bajty

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

Zamówienie jest URDL, 1-na. Więc 1jest Ù ,2is R` etc.

Dane wejściowe to: liczba razy, kierunek początkowy, macierz ;znaków (przy użyciu jako separator wierszy).

Wypróbuj online!

Luis Mendo
źródło
Wyjaśnię to później
Luis Mendo