Added 2021 (python)
This commit is contained in:
22
2021/12/input
Normal file
22
2021/12/input
Normal file
@ -0,0 +1,22 @@
|
||||
um-end
|
||||
pk-um
|
||||
FE-il
|
||||
ay-FE
|
||||
pk-start
|
||||
end-jt
|
||||
um-FE
|
||||
RO-il
|
||||
xc-ay
|
||||
il-end
|
||||
start-EZ
|
||||
pk-FE
|
||||
xc-start
|
||||
jt-FE
|
||||
EZ-um
|
||||
pk-xc
|
||||
xc-EZ
|
||||
pk-ay
|
||||
il-ay
|
||||
jt-EZ
|
||||
jt-om
|
||||
pk-EZ
|
67
2021/12/prog.py
Normal file
67
2021/12/prog.py
Normal file
@ -0,0 +1,67 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [line.strip() for line in f.readlines()]
|
||||
|
||||
|
||||
|
||||
def dfs(start, end, I_V, E, visited, path, part):
|
||||
verbose(f"\t\tvisiting {I_V[start]} ({part = })")
|
||||
if start == end:
|
||||
verbose(f"found end")
|
||||
verbose(f"\t\tpath {list(map(lambda i: I_V[i], path))}")
|
||||
verbose("\t\t", end = "")
|
||||
for i, v in enumerate(visited):
|
||||
if v:
|
||||
verbose(f"{I_V[i]} visted {v}, ", end = "")
|
||||
verbose()
|
||||
return 1
|
||||
ret = 0
|
||||
for i, e in enumerate(E[start]):
|
||||
if e > 0 and visited[i] < part and visited.count(2) <= 2 :
|
||||
tmp_v = visited[:]
|
||||
if I_V[i] == I_V[i].lower():
|
||||
tmp_v[i] += 1
|
||||
# verbose(f"\tstarting search from {I_V[i]}")
|
||||
ret += dfs(i, end, I_V, E, tmp_v[:], path + [i], part)
|
||||
return ret
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
# construct the graph with an adjacency matrix
|
||||
V_I = {}
|
||||
I_V = []
|
||||
for line in inp:
|
||||
nodes = line.split('-')
|
||||
for n in nodes:
|
||||
if n not in V_I:
|
||||
V_I[n] = len(I_V)
|
||||
I_V.append(n)
|
||||
|
||||
E = [[0 for _ in range(len(V_I))] for _ in range(len(V_I))]
|
||||
|
||||
for line in inp:
|
||||
nodes = line.split('-')
|
||||
n1, n2 = V_I[nodes[0]], V_I[nodes[1]]
|
||||
E[n1][n2] += 1
|
||||
E[n2][n1] += 1
|
||||
|
||||
start = V_I["start"]
|
||||
verbose(f"{start = }")
|
||||
end = V_I["end"]
|
||||
verbose(f"{end = }")
|
||||
visited = [0] * len(V_I)
|
||||
visited[start] = 2
|
||||
|
||||
res = dfs(start, end, I_V, E, visited, [start], part)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
7
2021/12/sample_p1
Normal file
7
2021/12/sample_p1
Normal file
@ -0,0 +1,7 @@
|
||||
start-A
|
||||
start-b
|
||||
A-c
|
||||
A-b
|
||||
b-d
|
||||
A-end
|
||||
b-end
|
10
2021/12/sample_p2
Normal file
10
2021/12/sample_p2
Normal file
@ -0,0 +1,10 @@
|
||||
dc-end
|
||||
HN-start
|
||||
start-kj
|
||||
dc-start
|
||||
dc-HN
|
||||
LN-dc
|
||||
HN-end
|
||||
kj-sa
|
||||
kj-HN
|
||||
kj-dc
|
18
2021/12/sample_p3
Normal file
18
2021/12/sample_p3
Normal file
@ -0,0 +1,18 @@
|
||||
fs-end
|
||||
he-DX
|
||||
fs-he
|
||||
start-DX
|
||||
pj-DX
|
||||
end-zg
|
||||
zg-sl
|
||||
zg-pj
|
||||
pj-he
|
||||
RW-he
|
||||
fs-DX
|
||||
pj-RW
|
||||
zg-RW
|
||||
start-pj
|
||||
he-WI
|
||||
zg-he
|
||||
pj-fs
|
||||
start-RW
|
18
2021/12/test.py
Normal file
18
2021/12/test.py
Normal file
@ -0,0 +1,18 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 10)
|
||||
self.assertEqual(result(get_input(sample = True, part = 2)), 19)
|
||||
self.assertEqual(result(get_input(sample = True, part = 3)), 226)
|
||||
|
||||
def test_sol1(self):
|
||||
self.assertEqual(result(get_input()), 3497)
|
||||
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 36)
|
||||
self.assertEqual(result(get_input(sample = True, part = 2), part = 2), 103)
|
||||
self.assertEqual(result(get_input(sample = True, part = 3), part = 2), 3509)
|
||||
|
Reference in New Issue
Block a user