Loading...
Yordan_Iliev_Petrov avatar Yordan_Iliev_Petrov 1 Точки

Radioactive Mutant Vampire Bunnies

Привет, Колеги,

На  9-та задача(*Radioactive Mutant Vampire Bunnies) от упраженнията за Multidimensional Arrays, не мога да разбера, защо и при какви случай ми гърми кода. Доколкото разбирам от условието, няма значение дали е умрял или победил играча, зайците се мултиплицират за съответния опит. Аз съм го направил да мултиплицира зайците първо, после да проверява дали играча се спасява или умира. Много ще се радвам да ми дадете някаква идея, защо моето решение не работи(40/100) и при какви случай се чупи.

Решение: https://pastebin.com/fJGCBqxH

Благодаря предварително!

Поздрави,

Данчо

Тагове:
0
Python Advanced
Martinzca avatar Martinzca 11 Точки

Привет

Най-вероятно е вече късно, но нека има отговор за да има завършек пост-а.

Линка, към pastebin e невалиден вече, затова ще карам с основните неща, които трябва да се покрият.

Правило номер едно, когато тестовете не минават е човек да си разпише всички възможни сценарии, които могат да се случат на база условието на задачата. Най-често проблемни са т.нар "edge" случаи.

В конкретния пример, при мен също не минаваше тест #8, затова си измислих долния тест. Оказа се, че не прекъсвам правилно цикъла и размножавам зайците повече отколкото трябва и съответно финалната матрица е изцяло запълнена с "B".

4 4
....
..B.
..B.
...P
RRRR

Returns:
..B.                                                                                                            
.BBB                                                                                                            
.BBB                                                                                                            
..B.                                                                                                            
won: 3 3 

Алгоритъмът, който съчиних е:

1. Намирам позицията на играча

2. За всяка команда

  • Местя играча - проверявайки дали стъпва на заек (умира) или излиза извън матрицата (печели)
  • Размножавам зайчиците - проверявайки дали някой от тях стъпва върху играча (играта приключва)
  • Проверявам дали играчът е излязъл или е имал среща със заек (е умрял)

3. Проверявам дали играчът е умрял и принтирам съответния израз

Ето и моя код:

rows, cols = [int(item) for item in input().split()]
matrix = []

for _ in range(rows):
    matrix.append(list(input()))

commands = input()

# End of inputs


def find_player(matrix):
    stop = False
    postion = ()
    for r in range(rows):
        if stop:
            break
        for c in range(cols):
            if matrix[r][c] == 'P':
                postion = (r, c)
                stop = True
    return postion


def multiply_bunny(matrix, dead):
    bunnies_location = []
    for r in range(len(matrix)):
        for c in range(len(matrix[r])):
            if matrix[r][c] == 'B':
                bunnies_location.append((r, c))

    for bun in bunnies_location:
        up = (bun[0] - 1, bun[1])
        down = (bun[0] + 1, bun[1])
        left = (bun[0], bun[1] - 1)
        right = (bun[0], bun[1] + 1)

        if 0 <= up[0] < rows and 0 <= up[1] < cols:
            if matrix[up[0]][up[1]] == 'P':
                dead = True
            matrix[up[0]][up[1]] = 'B'
        if 0 <= down[0] < rows and 0 <= down[1] < cols:
            if matrix[down[0]][down[1]] == 'P':
                dead = True
            matrix[down[0]][down[1]] = 'B'
        if 0 <= left[0] < rows and 0 <= left[1] < cols:
            if matrix[left[0]][left[1]] == 'P':
                dead = True
            matrix[left[0]][left[1]] = 'B'
        if 0 <= right[0] < rows and 0 <= right[1] < cols:
            if matrix[right[0]][right[1]] == 'P':
                dead = True
            matrix[right[0]][right[1]] = 'B'

    return dead, matrix


def move_player(loc, go, matrix, dead):
    out = False
    last = loc
    if go == 'U':
        new = (loc[0] - 1, loc[1])
        if 0 <= new[0] < rows and 0 <= new[1] < cols:
            last = new
            if matrix[new[0]][new[1]] == 'B':
                dead = True
                return last, dead, out, matrix
            else:
                matrix[new[0]][new[1]] = 'P'
                matrix[loc[0]][loc[1]] = '.'
                return last, dead, out, matrix
        else:
            out = True
            matrix[last[0]][last[1]] = '.'
            return last, dead, out, matrix

    elif go == 'D':
        new = (loc[0] + 1, loc[1])
        if 0 <= new[0] < rows and 0 <= new[1] < cols:
            last = new
            if matrix[new[0]][new[1]] == 'B':
                dead = True
                return last, dead, out, matrix
            else:
                matrix[new[0]][new[1]] = 'P'
                matrix[loc[0]][loc[1]] = '.'
                return last, dead, out, matrix
        else:
            out = True
            matrix[last[0]][last[1]] = '.'
            return last, dead, out, matrix

    elif go == 'L':
        new = (loc[0], loc[1] - 1)
        if 0 <= new[0] < rows and 0 <= new[1] < cols:
            last = new
            if matrix[new[0]][new[1]] == 'B':
                dead = True
                return last, dead, out, matrix
            else:
                matrix[new[0]][new[1]] = 'P'
                matrix[loc[0]][loc[1]] = '.'
                return last, dead, out, matrix
        else:
            out = True
            matrix[last[0]][last[1]] = '.'
            return last, dead, out, matrix

    elif go == 'R':
        new = (loc[0], loc[1] + 1)
        if 0 <= new[0] < rows and 0 <= new[1] < cols:
            last = new
            if matrix[new[0]][new[1]] == 'B':
                dead = True
                return last, dead, out, matrix
            else:
                matrix[new[0]][new[1]] = 'P'
                matrix[loc[0]][loc[1]] = '.'
                return last, dead, out, matrix
        else:
            out = True
            matrix[last[0]][last[1]] = '.'
            return last, dead, out, matrix

    return last, dead, out, matrix

# Main 
dead = False
where = find_player(matrix)
for ch in commands:
    where, dead, out, matrix = move_player(where, ch, matrix, dead)
    dead, matrix = multiply_bunny(matrix, dead)
    if dead or out:
        break

if dead:
    for row in matrix:
        print(*row, sep="")

    print("dead: ", end='')
    print(*where, sep=' ')
else:
    for row in matrix:
        print(*row, sep="")
    print("won: ", end='')
    print(*where, sep=' ')


 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.