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


Powiązane , ale inne, ponieważ można mieć litery „spadające z mapy”.
— mbomb007


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.

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.


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]

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!


Wyjaśnię to później
— Luis Mendo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.