Added template + day12 in progress

This commit is contained in:
Fedaya 2023-12-12 08:06:58 +01:00
parent ed55a50ec7
commit f234fc62bf
10 changed files with 148 additions and 0 deletions

66
day12/common.py Normal file
View File

@ -0,0 +1,66 @@
from dataclasses import dataclass
from typing import NamedTuple, NewType
import re
def im_replace(line: str, mask: str) -> str:
idx = 0
new_line = ""
for c in line:
if c != "?":
new_line += c
else:
new_line += mask[idx]
idx += 1
return new_line
class SpringLine(NamedTuple):
line: str
groups: tuple[int, ...]
def arrangments(self) -> list[str]:
count_im = self.line.count("?")
print(count_im)
possibles = []
for i in range(pow(2, count_im)):
rep_str = f"{i:b}".rjust(count_im, "0").replace("0", ".").replace("1", "#")
print(rep_str, end=" / ")
tentative = im_replace(self.line, rep_str)
possible = SpringLine(tentative, self.groups)
print(possible, end=": ")
if possible.is_valid():
possibles.append(im_replace(self.line, rep_str))
print("valid")
else:
print("invalid")
return possibles
def is_valid(self) -> bool:
# TODO: correct this (re.match with generated pattern based en groups)
line_copy = self.line
for group in self.groups:
idx = line_copy.find("#" * group)
if idx == -1:
return False
line_copy = line_copy[idx + group :]
return True
Spring = NewType("Spring", list[SpringLine])
def parse(input_file: str) -> Spring:
spring_lines = []
with open(input_file, "r", encoding="utf-8") as inputfd:
while line := inputfd.readline():
if match := re.match("([?#.]+)\s([0-9,]+)", line):
# print(match.group(0))
spring_lines.append(
SpringLine(
match.group(1),
tuple(map(lambda c: int(c), match.group(2).split(","))),
)
)
return Spring(spring_lines)

6
day12/example_input.txt Normal file
View File

@ -0,0 +1,6 @@
???.### 1,1,3
.??..??...?##. 1,1,3
?#?#?#?#?#?#?#? 1,3,1,6
????.#...#... 4,1,1
????.######..#####. 1,6,5
?###???????? 3,2,1

13
day12/part1.py Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env python3.11
from common import *
def part1(input_file: str) -> int:
spring = parse(input_file)
print(spring)
interm = list(map(lambda s: s.arrangments(), spring))
print(interm)
interm = list(map(len, interm))
print(interm)
return sum(interm)

3
day12/part2.py Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env python3.11
from common import *

31
day12/test.py Executable file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env python3.11
import logging
from unittest import TestCase, main
from common import *
from part1 import part1
class DayXTests(TestCase):
def test_parsing(self):
parsed_spring = parse("example_input.txt")
spring: Spring = [
SpringLine("???.###", (1, 1, 3)),
SpringLine(".??..??...?##.", (1, 1, 3)),
SpringLine("?#?#?#?#?#?#?#?", (1, 3, 1, 6)),
SpringLine("????.#...#...", (4, 1, 1)),
SpringLine("????.######..#####.", (1, 6, 5)),
SpringLine("?###????????", (3, 2, 1)),
]
self.assertEqual(parsed_spring, spring)
def test_part1(self):
self.assertEqual(part1("example_input.txt"), 21)
def test_part2(self):
pass
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
main(verbosity=2)

2
template/common.py Normal file
View File

@ -0,0 +1,2 @@
def parse(input_file: str) -> T:
pass

View File

3
template/part1.py Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env python3.11
from common import *

3
template/part2.py Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env python3.11
from common import *

21
template/test.py Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env python3.11
from unittest import TestCase, main
import logging
from common import *
class DayXTests(TestCase):
def test_parsing(self):
pass
def test_part1(self):
pass
def test_part2(self):
pass
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
main(verbosity=2)