Индекс списка вне диапазона при решении проблемы Каттиса - PullRequest
0 голосов
/ 20 июня 2019

Я работаю с этой проблемой (https://open.kattis.com/problems/whowantstoliveforever). И я получаю индекс списка вне диапазона из-за _list[index-1] == "0" и _list[index+1] == "0", и он явно не существует. Мне интересно, есть ли лучший способчтобы решить эту проблему.

ниже - мой код.

import sys


def liveForever(input_list):
    if len(set(input_list)) < 1:
        return True
    else:
        return False
    return False


def print_result(boolean):
    print("LIVE" if boolean else "DIES")


num_cases = int(sys.stdin.readline().strip())
for i in range(num_cases):
    _list = []
    case = sys.stdin.readline().strip()
    for char in case:
        _list.append(char)
    for index in range(len(_list)):
        if (_list[index-1] == "0" and _list[index+1] == "0") or (_list[index-1] == "1" and _list[index+1] == "1"):
            _list[index] == "0"
        elif(_list[index-1] == "0" and _list[index+1] == "1") or (_list[index-1] == "1" and _list[index+1] == "0"):
            _list[index] == "1"
        print(_list)
    print_result(liveForever(_list))

Здесь, по сути, мой вывод должен быть либо LIVES, либо DIES, основываясь на списке.

1 Ответ

0 голосов
/ 20 июня 2019

Если перефразировать старую шутку о докторе, если что-то приводит к краху вашей программы, , тогда не делайте этого.

Назначение четко указывает, что значение любого бита вне допустимого диапазона предполагается равным нулю. Поэтому, прежде чем получить доступ к списку, просто проверьте, выходит ли индекс за пределы, и верните ноль, если он есть. Один из способов сделать это - использовать функцию-обертку, например ::100100

def get_bit(bits, i):
    if 0 <= i < len(bits):
        return bits[i]
    else:
        return 0

Существуют и другие, возможно, более эффективные способы достижения того же результата, но я оставлю оптимизацию кода в качестве упражнения, которое должно быть.

Ps. Обратите внимание, что в вашем коде также есть (по крайней мере) еще одна ошибка: вы изменяете список битов, пока выполняете его. Поскольку предполагается, что состояния битов на следующем временном шаге зависят от состояний этих битов и их соседей на предыдущем шаге, за до они будут обновлены, что даст неверные результаты. Чтобы это работало, вам нужно иметь два списка, чтобы вы могли хранить обновленные значения в одном, читая старые значения из другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...