Рубрики
Без рубрики

Доступен код кода 3

Еще один день, еще одно появление кодового вызова! Как обычно, вы можете прочитать заявление о проблеме для T … Помечено с AdhentOfCode, Python.

Еще один день, еще одно появление кодового вызова! Как обычно, вы можете прочитать заявление о проблеме на сегодняшний вызов здесь.

Я решаю каждый из этих проблем, используя другой язык программирования. Я уже использовал Python и JavaScript и задавался вопросом, на каком языке я могу использовать следующий. Это немного позже в тот день, когда я работаю над этим, и я работаю весь день и не имею умственных способностей, чтобы попробовать новый язык. Так что для этой проблемы я нарушаю правило и работаю с языком программирования, который я уже использовал в этих проблемах: Python.

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

def increments(claim):
    return [
        (x, y)
        for x in range(claim["x"], claim["x"] + claim["width"])
        for y in range(claim["y"], claim["y"] + claim["height"])
    ]

Следующее, что мне нужно было сделать, это анализ входного файла. Хотя я обычно держу далеко от этого, я решил использовать регулярное выражение для анализа входов. Я копирую некоторые из данных в Regexr и играл с ценностями, пока я в конечном итоге не получит регулярное выражение для разбора вещей. Наконец, я настроил итератор, чтобы пройти через каждую дюймовую приращение в прямоугольнике и увеличить значение перекрываемой области на 1. Бег через районы дюйма на дюйм позволяет нам только подсчитать перекрытие, которые включают несколько прямоугольников только один раз.

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

import re

def increments(claim):
    return [
        (x, y)
        for x in range(claim["x"], claim["x"] + claim["width"])
        for y in range(claim["y"], claim["y"] + claim["height"])
    ]

with open("areas.txt") as claims:
    regex = "^#(\d+)\s@\s(\d+),(\d+):\s(\d+)x(\d+)"
    parsed_claims = []
    overlap = 0
    for claim in claims.readlines():
        m = re.search(regex, claim)
        parsed_claims.append(
            {
                "id": m.group(1),
                "x": int(m.group(2)),
                "y": int(m.group(3)),
                "width": int(m.group(4)),
                "height": int(m.group(5)),
            }
        )
    overlaps = {}
    for claim in parsed_claims:
        for increment in increments(claim):
            if increment in overlaps:
                overlaps[increment] += 1
            else:
                overlaps[increment] = 1
    overlapped_area = 0
    for overlap in overlaps.values():
        if overlap > 1:
            overlapped_area += 1
    print(overlapped_area)

    for claim in parsed_claims:
        if all(overlaps[increment] == 1 for increment in increments(claim)):
            print(claim)

Оригинал: “https://dev.to/captainsafia/advent-of-code-day-3-1cde”