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

Advent of Code 2020: день 06 с использованием наборов Python

Еще один короткий, это будет быстро. Вещи, упомянутые в этом посте: Теория установок, понимание списка … Tagged with AdventofCode, Python.

Еще один короткий, это будет быстро.

Вещи, упомянутые в этом посте: Теория установки, понимание списка, пересечение, функция карты, разрушение/сплат

Ссылка на вызов на веб -сайте Advent of Code 2020

Задача рассказывает о задаче, где вам нужно выяснить, сколько уникальных участников для каждого набора. Один из приведенных примеров был

ab
ac

Независимо от того, что говорит фактический текст цвета об этом, в конечном итоге задача – найти уникальный набор букв и подсчитать их. В этом случае просто A , b и C , или 3.

Питоны устанавливаются

У Python есть встроенные наборы, которые очень универсальны. Мы можем просто взять все данные и разделить их на записи, как и раньше:

data = open("input.txt").read().split("\n\n")

Пример записи (один член data ) выглядит следующим образом:

'donpevkjhymzl\nezyopckdlnvmj'

У этого есть новая линия, поэтому нам нужно разбить это для этой первой части

entry.replace("\n","")

Выход

'donpevkjhymzlezyopckdlnvmj'

Тогда мы просто вкладываем это в set () который автоматически рассматривает каждого символа как отдельного члена и де-дублирует его для нас.

set(entry.replace("\n", "")

Выход

{'c', 'd', 'e', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'v', 'y', 'z'}

Вопрос требует суммирования общей суммы этого, так что это может просто пойти в Len () Чтобы найти, сколько сет -участников

len(set(entry.replace("\n", ""))

Выход

14

Повторите это по всем записям в наборе данных:

sum([len(set(entry.replace("\n",""))) for entry in open("input.txt").read().split("\n\n")])

Это все решение для части 1

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

ab
ac

Только A распространен.

Итак, каждая запись мы должны разбить на отдельные элементы. Наборы Python имеют recsection () Метод, который может дать общие предметы. Однако, поскольку мы должны найти общие элементы по нескольким элементам на запись, мы должны сделать несколько recsection () с этим.

Итак, взяв запись, мы можем разделить его на элементы, используя обычные расколоть()

items = entry.split()

Выход

['donpevkjhymzl', 'ezyopckdlnvmj']

Python имеет set.Intersection () Метод, который принимает пересечение каждого установленного аргумента, переданного к нему. Например, если мы сделаем набор из двух элементов:

set.intersection(set(items[0]), set(items[1]))

Выход

{'d', 'e', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'v', 'y', 'z'}

Тем не менее, мы должны быть в состоянии обобщить это для произвольного количества элементов. Мы можем сделать это с разрушением (или «разбрызгиванием» или «распаковкой»), что позволяет нам передать произвольное (и переменное) количество аргументов в set.Intersection ()

set.intersection(*[set(item) for item in items])

(тот же выход)

Здесь мы используем понимание списка для применения set () каждому из предметов. Мы также можем использовать map () функция, которая делает почти то же самое:

set.intersection(*map(set, items))

(тот же выход)

* Вот оператор «SPLAT», что означает «распаковать этот список и использовать каждого из своих членов в качестве аргументов для функции». Терминология здесь несколько неясна, некоторые называют это «Splat», некоторые называют это «распаковкой», некоторые называют это «разрушением», некоторые называют это «расширяющимся».

Задача хочет продолжительности этого набора, и, чтобы суммировать длину всех записей, так что это случай, когда это поместите это в цикл и суммирование результатов:

total = 0
for entry in data:
    items = entry.split()
    common = set.intersection(*map(set, items))
    total += len(common)
print("total", total)

Или, чтобы код-гольф вниз до одной строки:

sum(len(set.intersection(*map(set, entry.split()))) for entry in open("input.txt").read().split("\n\n"))

Конец. Впереди!

Оригинал: “https://dev.to/meseta/advent-of-code-2020-day-06-using-python-sets-59af”