1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3
# coding=utf-8

# Copyright (C) 2022  Paweł Widera
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details:
# http://www.gnu.org/licenses/gpl.html

h, w = map(int, input().split())
board = [list(input()) for i in range(h)]

k = int(input())
moves = input()


def up(board):
	for column in range(w):
		tiles = [board[row][column] for row in range(h) if board[row][column] != '.']
		tiles.extend(["."] * (h - len(tiles)))

		# TODO: replace with numpy vstack?
		# TODO: check iteration over sparse arrays
		for row in range(h):
			board[row][column] = tiles[row]

def down(board):
	for column in range(w):
		tiles = [board[row][column] for row in range(h) if board[row][column] != '.']
		empty = ["."] * (h - len(tiles))
		empty.extend(tiles)

		for row in range(h):
			board[row][column] = empty[row]

def left(board):
	for row in range(h):
		tiles = [x for x in board[row] if x != '.']
		tiles.extend(["."] * (w - len(tiles)))
		board[row] = tiles

def right(board):
	for row in range(h):
		tiles = [x for x in board[row] if x != '.']
		board[row] = ["."] * (w - len(tiles))
		board[row].extend(tiles)


def show(board):
	for row in board:
		print("".join(row))


def simulate(board, moves):
	MOVES = {"G": up, "D": down, "L": left, "P": right}

	last = None
	for move in moves:
		if move == last:
			continue

		MOVES[move](board)
		last = move

	show(board)


def shorten(moves):
	last = ""

	ignore = set()

	for i, m in enumerate(moves):
		if (m in "DG" and last in "DG") or (m in "LP" and last in "LP"):
			ignore.add(i - 1)
		last = m

	return (m for i, m in enumerate(moves) if i not in ignore)


simulate(board, shorten(moves))