Ändern Sie die Schwerkraft des Textes wie das Puzzle 2048

14

Im Spiel 2048 hast du ein Gitter und kannst die Elemente in vier Richtungen bewegen. Sie bewegen sich alle in diese Richtung, so weit sie können. Für diese Herausforderung erhalten Sie eine gepolsterte, quadratische 2D-Zeichenfolge (entweder mit Zeilenumbrüchen oder einer Liste von Zeichenfolgen), wie folgt:

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

oder

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

Die vier Operationen sind left, right, up, und down. Das Ergebnis von jedem auf der obigen Eingabe:

Links:

abcde   
fghij   
kl      
mnop    
qrst    
uv      
wxy     
z       

oder

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

Richtig:

   abcde
   fghij
      kl
    mnop
    qrst
      uv
     wxy
       z

oder

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

Oben:

abocdiel
mf ghsjv
un rp k 
zq x  t 
 w    y 


        

oder

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

Nieder:

        


 b    e 
af c  j 
mn gd k 
uq rhitl
zwoxpsyv

oder

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

Ihr Ziel ist es, bei jeder Iteration zu rotieren, welche Operation ausgeführt wird, und diese an den Eingabezeiten nauszuführen. Wenn Ihre Bestellung also lautet URDLund die Eingabe lautet, dass sie mit D( 2, 0-indiziert) beginnen soll und Sie 5Operationen benötigen , führen Sie diese aus D-L-U-R-Dund drucken sie dann aus.

Eingang:

  • Ein String in einem Format wie oben
    • Nachgestellte Leerzeichen sind nicht erforderlich (aber wahrscheinlich hilfreich)
    • Es wird mindestens 2x2 sein
    • Enthält nur druckbare ASCII-Zeichen und Leerzeichen (und Zeilenumbrüche je nach Eingabeformat)
    • Sie sollten theoretisch jede Länge unterstützen, aber die Speicherbeschränkungen sind in Ordnung
  • Eine nicht negative Ganzzahl nfür die Anzahl der auszuführenden Operationen
  • Eine Ganzzahl 0-3oder 1-4ein Buchstabe UDLR, der die Operation beschreibt, mit der begonnen werden soll.
    • Ihr Programm muss also mit jeder Operation beginnen oder enden können
    • Sie können sie zu Startzwecken in beliebiger Reihenfolge definieren, aber es muss eine konsistente Reihenfolge sein, sodass Umanchmal nicht gefolgt werden kann Rund manchmal auch nicht L.
  • Operationen müssen nicht trivial ausgeführt werden
    • Sie können Vorgänge in der Reihenfolge LDRU(links, unten, rechts, oben) wiederholt ausführen , aber nicht DLRUoder UDLR(da UDist das Gleiche wie Dund LRdas Gleiche wie R.)

Ausgabe:

  • Die Zeichenfolge nach den vier Operationen nZeiten
  • Das Ausgabeformat muss mit Ihrem Eingabeformat übereinstimmen
  • Nachgestellte Leerzeichen sind nicht erforderlich (aber wahrscheinlich hilfreich)

Beispiel:

In diesem Beispiel wird die Reihenfolge verwendet URDL.

Eingang:

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       

Ausgaben für n = 0-5: (nur das Endergebnis ausgeben)

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      


        

Meine hübsche, ungolfed Implementierung

mbomb007
quelle
Verwandt , aber anders, denn damit kann man Buchstaben "von der Karte fallen" lassen.
mbomb007
Related
Laikoni
1
Soll nur das Endergebnis gedruckt werden, oder auch die Zwischenschritte? Ist das Ergebnis nicht auch nur zyklisch, nachdem alle vier Vorgänge einmal ausgeführt wurden? (Nicht sicher, nur Vermutungen)
Luis Mendo
Nur das Endergebnis. Und ich habe bestätigt, dass es nicht zyklisch ist .
mbomb007
Nicht zyklisch nach nur vier Operationen. Der Zeitraum wird viel länger sein.
mbomb007

Antworten:

2

Jelly , 23 Bytes

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

Probieren Sie es online!

Ich bin etwas unzufrieden, aber MATL brauchte Konkurrenz. : P

Verwendet die Bestellung URDL. Eingänge:

  • das Eingabearray als Array von gepolsterten Zeilen
  • die Anzahl der Wiederholungen
  • der Zug zum Start von (1 = U, 2 = R, 3 = D, 4 = L)

Erläuterung

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
quelle
2

JavaScript (ES6), 168 Byte

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

dist der Anfangsindex in die Richtungen, die sind URDL.

Neil
quelle
1

Python 2 , 226 224 204 193 Bytes

-1 Byte dank 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)

Probieren Sie es online!

Funktion, die alle Leerzeichen jedes Elements in der Liste entfernt und mit Leerzeichen links oder rechts ergänzt.

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

Dies wird transponiert (um 90º gedreht), wenn der Eingang 0oder 1( Uoder D) ist und angewendet wirdg

x=[map(''.join,zip(*g(map(''.join,zip(*x)),i))),g(x,i)][i>1]
Stange
quelle
1
Zusätzlicher Platz in for i in (...).
Trelzevir
Dies ist im Grunde eine Golfversion meiner Implementierung (ich habe mich nie darum gekümmert , viel Golf zu spielen).
mbomb007
1

MATL , 24 23 Bytes

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

Ordnung ist URDL, 1-basiert. So 1ist Ù ,2 isR` etc.

Eingaben sind: Anzahl der Male, Anfangsrichtung, Zeichenmatrix (Verwendung ;als Zeilentrennzeichen).

Probieren Sie es online!

Luis Mendo
quelle
Ich werde später am Tag eine Erklärung hinzufügen
Luis Mendo