aoc2016/day07.py
2024-12-28 11:26:20 +01:00

75 lines
2.0 KiB
Python

from tools.aoc import AOCDay
from typing import Any
class Day(AOCDay):
inputs = [
[
(105, "input7"),
],
[
(258, "input7"),
],
]
def parse_input(self) -> list[tuple[list[str], list[str]]]:
ips = []
for line in self.getInput():
ip = []
hypernets = []
for sp in line.split("["):
if "]" not in sp:
ip.append(sp)
else:
hypernet, sp_ip = sp.split("]")
hypernets.append(hypernet)
ip.append(sp_ip)
ips.append((ip, hypernets))
return ips
def part1(self) -> Any:
def has_abba(sequence: str) -> bool:
abba_found = False
for x in range(len(sequence) - 3):
if (
sequence[x] == sequence[x + 3]
and sequence[x + 1] == sequence[x + 2]
and sequence[x] != sequence[x + 1]
):
abba_found = True
return abba_found
ans = 0
for ips, hypernets in self.parse_input():
if any(has_abba(i) for i in ips) and not any(has_abba(h) for h in hypernets):
ans += 1
return ans
def part2(self) -> Any:
ans = 0
for ips, hypernets in self.parse_input():
found_aba_bab = False
for ip in ips:
for i in range(len(ip) - 2):
if (
ip[i] == ip[i + 2]
and ip[i] != ip[i + 1]
and any(ip[i + 1] + ip[i] + ip[i + 1] in h for h in hypernets)
):
found_aba_bab = True
break
if found_aba_bab:
break
if found_aba_bab:
ans += 1
return ans
if __name__ == "__main__":
day = Day(2016, 7)
day.run(verbose=True)