121

Re: Advent of Code

2022#11, Python 3.8.10
import copy, math, operator, re

monkeys = []

for line in open("input.txt").readlines():
    line = line.strip()

    if line.startswith("Monkey"):
        monkeys.append([])
        continue

    if line.startswith("Start"):
        monkeys[-1].append(list(map(int, re.findall("\d+", line))))
        continue

    if line.startswith(("Test", "If")):
        monkeys[-1].append(int(re.search(r"\d+", line).group()))
        continue

    if line == "":
        continue

    monkeys[-1].append(line.split("= old ")[-1].split(" "))

ops = {
    "+": operator.add,
    "-": operator.sub,
    "*": operator.mul,
    "/": operator.truediv,
}


def operation(old, new):
    op, val = new
    val = old if val == "old" else int(val)
    return ops[op](old, val)


def inspecting(isridiculous: bool = True):
    inspectors = copy.deepcopy(monkeys)
    activities = [0] * len(inspectors)
    magic = math.prod([inspector[2] for inspector in inspectors]) if isridiculous else 3

    for _ in range(10_000 if isridiculous else 20):
        for m, (worries, new, isdiv, yeah, nope) in enumerate(inspectors):
            if len(worries) == 0:
                continue

            activities[m] += len(worries)

            for worry in worries:
                worry = operation(worry, new)
                worry = worry % magic if isridiculous else worry // magic
                inspectors[nope if worry % isdiv else yeah][0].append(worry)

            inspectors[m][0] = []

    activities = sorted(activities)
    print(activities[-1] * activities[-2])

inspecting(False) # Part One: 56120
inspecting() # Part Two: 24389045529

122

Re: Advent of Code

Бачу купу зайвих continue, можна було elif-ами обійтися.
А взагалі я погано розумію, як вам не ліньки запам'ятовувати, що у вас у inspector[2]. Чи не логічніше клас проголосити з нормальними назвами полів?

Подякували: dot1

123 Востаннє редагувалося dot (24.12.2022 16:29:19)

Re: Advent of Code

koala написав:

Бачу купу зайвих continue, можна було elif-ами обійтися.

Ja prosto ne pamjatav, ćy spracjovuje nastupnyj elif, jakśćo otrymaly true. Ja ćomusj spryjmav ce jak (ne pajtonovsjki) switch + case, de nastupnyj case moźe spracjuvaty, jakśćo tut true. Ale perevêrjaty menê bulo lênjky, ale śćojno pohljanuv — ne spracjovuje. Djakuju, śćo ukazaly, teper maty jmu na uvazê.

Pererobyv cej fragment, nićoho osoblyvoho:

    if line.startswith("Monkey"):
        monkeys.append([])
    elif line.startswith("Start"):
        monkeys[-1].append(list(map(int, re.findall("\d+", line))))
    elif line.startswith(("Test", "If")):
        monkeys[-1].append(int(re.search(r"\d+", line).group()))
    elif line != "":
        monkeys[-1].append(line.split("= old ")[-1].split(" "))

А взагалі я погано розумію, як вам не ліньки запам'ятовувати, що у вас у inspector[2]. Чи не логічніше клас проголосити з нормальними назвами полів?

Zvôdsy (pravda, to daljśe), kek:

for m, (worries, new, isdiv, yeah, nope) in enumerate(inspectors):

Ale, tak, zhôdnyj, śćo to ne duźe po ludzjky. A peretvorjuvaty v slovnyk poky ne xoću. Śće moźna stvoryty okremi masyvy, teź varijant.

124

Re: Advent of Code

Я 2017 рік пропустив, зараз проходжу. Схоже, дарма, це, видається, був найлегший для мене - я вже 21 день зробив, усе нормально іде. Щоб не спамити, ось мій гітхаб.

Подякували: dot, leofun012

125

Re: Advent of Code

2017-23-2. Нарешті щось складне. Десь я читав, що таке якимись хитрими матрицями робиться. Може, на тижні пошукаю.