Problem p02618 (python)

Fixed submission:
from typing import List
import sys


def read_data(file_name: str, std_in=True):
    satisfactions_list = list()
    file = sys.stdin if std_in else open(file_name, 'r')
    days = int(file.readline().rstrip())
    satisfaction_decreases = [int(c) for c in file.readline().rstrip().split(" ")]
    for i in range(days):
        satisfactions_list.append([int(c) for c in file.readline().rstrip().split(" ")])
    if not std_in:
        file.close()
    return days, satisfaction_decreases, satisfactions_list


class Contest:
    def __init__(self, _type: int, satisfactions: List[int], satisfaction_decrease: int):
        self.satisfaction = 0
        self.type = _type
        self.satisfactions = satisfactions
        self.satisfaction_decrease = -satisfaction_decrease

    def __getitem__(self, key: int):
        return self.satisfactions[key - 1]

    def __str__(self):
        return str(self.type)

    def __repr__(self):
        return f"Contest(_type={self.type}, satisfactions={self.satisfactions}, satisfaction_decrease={self.satisfaction_decrease})"

    def get_satisfaction_increase(self, day):
        return self[day] - (self.satisfaction + self.satisfaction_decrease)

    def winner(self, day):
        self.satisfaction += self[day]

    def loser(self):
        self.satisfaction += self.satisfaction_decrease


def get_best(contests :List[Contest], day: int):
    # improve this by optimistically making everyone a loser and then going back to undo that for the winner
    best = contests[0]
    for contest in contests:
        if contest.get_satisfaction_increase(day) > best.get_satisfaction_increase(day):
            best = contest
    return best


def main(file_name="input.txt"):
    contests = list()
    days, satisfaction_decreases, satisfactions_list = read_data(file_name)
    picks = list()

    for (_type, (satisfactions, satisfaction_decrease)) in enumerate(zip(zip(*satisfactions_list), satisfaction_decreases), start=1):
        contests.append(Contest(_type, satisfactions, satisfaction_decrease))

    for day in range(days):
        best = get_best(contests, day + 1)
        for contest in contests:
            if contest.type == best.type:
                contest.winner(day + 1)
                picks.append(contest)
            else:
                contest.loser()

    return "\n".join([str(pick) for pick in picks])


if __name__ == "__main__":
    print(main())

Buggy submission (verdict: Runtime Error):
from typing import List


def read_data(file_name: str):
    satisfactions_list = list()
    with open(file_name, 'r') as file:
        days = int(file.readline().rstrip())
        satisfaction_decreases = [int(c) for c in file.readline().rstrip().split(" ")]
        for i in range(days):
            satisfactions_list.append([int(c) for c in file.readline().rstrip().split(" ")])
    return days, satisfaction_decreases, satisfactions_list


class Contest:
    def __init__(self, _type: int, satisfactions: List[int], satisfaction_decrease: int):
        self.satisfaction = 0
        self.type = _type
        self.satisfactions = satisfactions
        self.satisfaction_decrease = -satisfaction_decrease

    def __getitem__(self, key: int):
        return self.satisfactions[key - 1]

    def __str__(self):
        return str(self.type)

    def __repr__(self):
        return f"Contest(_type={self.type}, satisfactions={self.satisfactions}, satisfaction_decrease={self.satisfaction_decrease})"

    def get_satisfaction_increase(self, day):
        return self[day] - (self.satisfaction + self.satisfaction_decrease)

    def winner(self, day):
        self.satisfaction += self[day]

    def loser(self):
        self.satisfaction += self.satisfaction_decrease


def get_best(contests :List[Contest], day: int):
    # improve this by optimistically making everyone a loser and then going back to undo that for the winner
    best = contests[0]
    for contest in contests:
        if contest.get_satisfaction_increase(day) > best.get_satisfaction_increase(day):
            best = contest
    return best


def main(file_name="input.txt"):
    contests = list()
    days, satisfaction_decreases, satisfactions_list = read_data(file_name)
    picks = list()

    for (_type, (satisfactions, satisfaction_decrease)) in enumerate(zip(zip(*satisfactions_list), satisfaction_decreases), start=1):
        contests.append(Contest(_type, satisfactions, satisfaction_decrease))

    for day in range(days):
        best = get_best(contests, day + 1)
        for contest in contests:
            if contest.type == best.type:
                contest.winner(day + 1)
                picks.append(contest)
            else:
                contest.loser()

    return "\n".join([str(pick) for pick in picks])


if __name__ == "__main__":
    print(main())