Loading...
Ttsvetelinn avatar Ttsvetelinn 0 Точки

06.Range Day from Python Advanced

Здравейте,

Имам питане по задача 06. Range Day

В джъдж ми гърми тест 9. Пробвах различни входове, но така и не открих какво се чупи. Много ще съм благодарен ако някой помогне.

Задача - https://softuni.bg/downloads/svn/python-advanced/May-2023/Python-Advanced/03-Multidimensional-Lists/03-Multidimensional-Lists-Exercise-Second.pdf

Код - https://pastebin.com/YHv5Kszr

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

Тагове:
0
Python Advanced
icowwww avatar icowwww 2876 Точки

Здравей,

При команда move се очаква да преместиш А на новите координати, а не да минаваш през всички елементи между старата точка и новата точка.

При теб въртиш цикъл като проверяваш всяка следваща точка в зададената посока дали отговаря на условията. Ако крайната точка е невалидн, но имаш валидни точки в тази посока, ти ще си преместил позицията на А. Отделно ако крайната точка е валидна, но например по пътя имаш елемент със стойност х, ще спреш преди нея. 

Затова просто, вместо да използваш цикъл вътре в условието за команда move, го замени с умножение на числата от речника по стъпките.

https://pastebin.com/kS1Pdjiu

1
Ttsvetelinn avatar Ttsvetelinn 0 Точки

Здравей колега,

Благодаря ти много за обяснението и поправката.

0
valerielashvili avatar valerielashvili 50 Точки

Оставям и моето решение на тази задача:

def get_shooter_position(rows, field):
    # Get Shooter's start position
    r, c = next(
        ((r, c) for r in range(rows) for c in range(rows) if field[r][c] == 'A'),
        (None, None)
    )
    return r, c


def move(way, r, c, distance, rows, field):
    dr, dc = DIRS[way]
    nr = r + dr * distance
    nc = c + dc * distance

    if in_boundary(nr, nc, rows) and field[nr][nc] == '.':
        field[r][c] = '.'
        field[nr][nc] = 'A'
        return field, nr, nc

    return field, r, c


def in_boundary(r, c, rows):
    return 0 <= r < rows and 0 <= c < rows


def update_field(r, c, field):
    field[r][c] = '*'
    return field


def shoot(way, r, c, rows, field):
    dr, dc = DIRS[way]
    nr, nc = r + dr, c + dc
    shot_target = None

    while in_boundary(nr, nc, rows):
        if field[nr][nc] == 'x':
            shot_target = (nr, nc)
            field[nr][nc] = '.'
            break
        nr += dr
        nc += dc

    return field, shot_target


size = 5
shooting_range = []
shot_targets = []
DIRS = {
    'up': (-1, 0),
    'down': (1, 0),
    'left': (0, -1),
    'right': (0, 1)
}

for line in range(size):
    shooting_range.append([c for c in input().split()])

row, col = get_shooter_position(size, shooting_range)
n_commands = int(input())

for _ in range(n_commands):
    tokens = input().split()
    cmd, direction, steps = tokens[0], tokens[1], int(tokens[2]) if len(tokens) > 2 else None
    current_target = None

    if cmd == 'move':
        shooting_range, row, col = move(direction, row, col, steps, size, shooting_range)
    elif cmd == 'shoot':
        shooting_range, current_target = shoot(direction, row, col, size, shooting_range)

        if current_target:
            shot_targets.append(current_target)

    if not any('x' in line for line in shooting_range):
        break

remaining_targets = sum(row.count('x') for row in shooting_range)

if not remaining_targets:
    print(f'Training completed! All {len(shot_targets)} targets hit.')
else:
    print(f'Training not completed! {remaining_targets} targets left.')

for target in shot_targets:
    print(f"[{target[0]}, {target[1]}]")

 

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