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