#!/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))
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)) |
English