Упражнение по кодированию - сбор мусора за каждое движение игрока python - PullRequest
0 голосов
/ 29 мая 2020

Представьте себе двумерную сетку (NxN), где в каждом квадрате есть мусор, для каждого движения, описанного N, S, E, W (для севера, юга, востока и запада), игрок перемещается соответственно и захватывает в этом квадрате был мусор.

Если вход = 'NESW', выход должен быть = 4 - 1 для квадрата, в котором игрок начал: 1 идет на север, 1 на восток, 1 на юг и 0 на запад, потому что он достигает начального квадрата, с которого он начал, который уже "очищен"

Для input = 'NSNSNSNS' output = 2 по той же причине.

У меня проблемы с подсчетом мусора и знанием если игрок уже был в этом месте.

def total_garbage(positions):
  garbage = 0
  N, S, E, W = 0, 0, 0, 0

  for direction in positions:

    if direction.upper() == 'N':
      N += 1
      garbage += 1
    elif direction.upper() == 'S':
      S += 1
      garbage += 1
    elif direction.upper() == 'E':
      E += 1
      garbage += 1
    elif direction.upper() == 'W':
      W += 1
      garbage += 1

  if N == S and E == W and E != 0 and W != 0:
    return garbage
  elif N == S and E == 0 and W == 0:
    return (garbage - min(N,S))

qp = total_garbage(['N','E','S','W'])
print(qp)

Это то, что у меня есть, это было просто для начала и пробовать кое-что, но не очень успешно: /

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Вы можете создать массив, как предложил Ахмет в комментариях, но если вы не хотите, вы можете сделать это следующим образом:

x, y = 0, 0 # this will be our position 
visited_idx = set() # indexes where we have already gathered garbage
for direction in positions:
    if direction.upper() == 'N':
      y += 1
    elif direction.upper() == 'S':
      y -= 1
    elif direction.upper() == 'E':
      x += 1
    elif direction.upper() == 'W':
      x -= 1

    current_idx = (x,y)
    # You wrote that there is no garbage in the first cell hence the second codition
    if current_idx not in visited_idx and current_idx != (0,0):
        visited_idx.add(current_idx)

units_of_garbage_gathered = len(visited_idx)
0 голосов
/ 29 мая 2020

Во-первых, когда я запускаю этот код, я получаю 4, как я думаю, вы ищете. Если вы хотите знать, был ли уже собран мусор в вашем квадрате, я думаю, вам может потребоваться отслеживать это параллельно с вашими перемещениями и коллекциями ... есть несколько способов сделать это, я бы предложил список списков для вашего grid, если вам нужна сетка 3x3, создайте что-то вроде:

grid = [[0,0,0],[0,0,0],[0,0,0]]

, теперь у вас может быть что-то для отслеживания того, где был собран мусор и есть ли какой-то мусор.

Итак, теперь вашим следующим шагом будет определение начальной точки, например

grid[0][0]

, тогда, если вы переместитесь на одну выше, вы окажетесь в

grid[1][0]

если вы посетите это место, в своей функции сделайте что-нибудь вроде:

newPos = grid[1][0]
if (newPos != 1) {
     // do your collecting and change grid[1][0] form 0 to 1
} else {
     // don't collect, track your movement or whatever else you want.
}

Надеюсь, это было полезно! Удачи

0 голосов
/ 29 мая 2020

, поскольку ваша сетка двумерная, смоделируйте ее как 2D-сетку - поэтому выберите начальное местоположение (скажем (0,0)), и каждое направление изменяет это местоположение - так от (0,0):

  • N становится (0, -1)
  • S становится (0,1)
  • E становится (1,0)
  • W становится (-1, 0)

и так далее

Вы сохраняете местоположения, которые вы посетили, в наборе python - и перед тем, как go в новое местоположение, вы проверяете, есть ли это местоположение еще не в наборе. То есть, если вам нужен только один кусок мусора на каждое место - если вы хотите, чтобы в конечном итоге было несколько частей, вы можете смоделировать сетку как словарь; а в комплекте -

def total_garbage(positions):

    # Create a dictionary translating direction to co-ordinate changes
    deltas = {'N':(0,-1),'S':{0,1),'E':(1,0),'W':(-1,0)}

    cleaned_locations = set()
    start_location = (0,0)
    garbage = 0

    for direction in positions:
        dx, dy = deltas[direction]
        x,y = start_location
        nx, xy = x + dx, y+dx

       # Count this site so long as it isn't already cleaned.
       if (nx, ny) not in cleaned:
          garbage += 1
          cleaned.add((nx,ny))
      else:
          return garbage

qp = total_garbage(['N','E','S','W'])
print(qp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...