Compare commits
5 Commits
15b4f24087
...
909b0d3b40
Author | SHA1 | Date | |
---|---|---|---|
909b0d3b40 | |||
19d640a7ac | |||
cdeda02aca | |||
aec31cd762 | |||
5d67709ab0 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
*/inputs
|
*/inputs
|
||||||
**/__pycache__
|
**/__pycache__
|
||||||
|
.venv
|
@ -5,6 +5,8 @@ Jour 24 du défi Advent Of Code pour l'année 2023
|
|||||||
import os
|
import os
|
||||||
import z3
|
import z3
|
||||||
|
|
||||||
|
from aoc_utils import decorators
|
||||||
|
|
||||||
def read_sample():
|
def read_sample():
|
||||||
"""récupère les entrées depuis le fichier texte correspondant"""
|
"""récupère les entrées depuis le fichier texte correspondant"""
|
||||||
filename = os.path.join(os.path.dirname(__file__ ), "inputs", "day24.txt")
|
filename = os.path.join(os.path.dirname(__file__ ), "inputs", "day24.txt")
|
||||||
@ -47,7 +49,7 @@ def intersection(h1, h2):
|
|||||||
return x, y
|
return x, y
|
||||||
|
|
||||||
|
|
||||||
|
@decorators.timeit
|
||||||
def part1(sample, left=200000000000000, right=400000000000000):
|
def part1(sample, left=200000000000000, right=400000000000000):
|
||||||
"""Partie 1 du défi"""
|
"""Partie 1 du défi"""
|
||||||
hailstones = [Hailstone(i) for i in sample]
|
hailstones = [Hailstone(i) for i in sample]
|
||||||
@ -63,12 +65,13 @@ def part1(sample, left=200000000000000, right=400000000000000):
|
|||||||
|
|
||||||
return count
|
return count
|
||||||
|
|
||||||
|
@decorators.timeit
|
||||||
def part2(sample):
|
def part2(sample):
|
||||||
"""Partie 2 du défi"""
|
"""Partie 2 du défi"""
|
||||||
hailstones = [Hailstone(i) for i in sample]
|
hailstones = [Hailstone(i) for i in sample]
|
||||||
|
|
||||||
px, py, pz, dx, dy, dz = z3.Ints("px py pz dx dy dz")
|
px, py, pz, dx, dy, dz = z3.Reals("px py pz dx dy dz")
|
||||||
collision = [z3.Int("t"+str(i)) for i in range(len(hailstones))]
|
collision = [z3.Real("t"+str(i)) for i in range(len(hailstones))]
|
||||||
solver = z3.Solver()
|
solver = z3.Solver()
|
||||||
for i in range(len(hailstones)):
|
for i in range(len(hailstones)):
|
||||||
h = hailstones[i]
|
h = hailstones[i]
|
||||||
|
77
2023/day25.py
Executable file
77
2023/day25.py
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Jour 25 du défi Advent Of Code pour l'année 2023
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
import networkx as nx
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
from aoc_utils import graph
|
||||||
|
|
||||||
|
def read_sample():
|
||||||
|
"""récupère les entrées depuis le fichier texte correspondant"""
|
||||||
|
filename = os.path.join(os.path.dirname(__file__ ), "inputs", "day25.txt")
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
sample = f.read().split('\n')
|
||||||
|
sample = [ i for i in sample if i != '' ]
|
||||||
|
return sample
|
||||||
|
|
||||||
|
def create_graph(sample):
|
||||||
|
g = graph.Graph()
|
||||||
|
for line in sample:
|
||||||
|
node = line.split(": ")[0]
|
||||||
|
dests = line.split(": ")[1].split()
|
||||||
|
if node not in g:
|
||||||
|
g.add_node(node)
|
||||||
|
|
||||||
|
for dest in dests:
|
||||||
|
if dest not in [i[0] for i in g[node]]:
|
||||||
|
g.add_edge(node, dest)
|
||||||
|
|
||||||
|
return g
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def part1(sample):
|
||||||
|
"""Partie 1 du défi"""
|
||||||
|
g = create_graph(sample)
|
||||||
|
|
||||||
|
ng = g.networkx()
|
||||||
|
cut, parts = nx.stoer_wagner(ng)
|
||||||
|
|
||||||
|
assert cut == 3
|
||||||
|
assert len(parts) == 2
|
||||||
|
|
||||||
|
return len(parts[0])*len(parts[1])
|
||||||
|
|
||||||
|
#* Initial code:
|
||||||
|
"""
|
||||||
|
ng = g.networkx()
|
||||||
|
nx.draw(ng, with_labels=True)
|
||||||
|
plt.savefig("path.png")
|
||||||
|
|
||||||
|
to_delete = [("vqj", "szh"), ("jbx", "sml"), ("zhb", "vxr")]
|
||||||
|
#to_delete = [("hfx", "pzl"), ("bvb", "cmg"), ("nvd", "jqt")]
|
||||||
|
for edge in to_delete:
|
||||||
|
g.remove_edges(*edge)
|
||||||
|
|
||||||
|
|
||||||
|
ccs = g.connexes()
|
||||||
|
print([len(i) for i in ccs])
|
||||||
|
return len(ccs[0])*len(ccs[1])
|
||||||
|
"""
|
||||||
|
|
||||||
|
def part2(sample):
|
||||||
|
"""Partie 2 du défi"""
|
||||||
|
return "Go push the big red button"
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Fonction principale"""
|
||||||
|
sample = read_sample()
|
||||||
|
print(f"part1: {part1(sample)}")
|
||||||
|
print(f"part2: {part2(sample)}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
@ -1,5 +1,8 @@
|
|||||||
from collections.abc import Mapping
|
from collections.abc import Mapping
|
||||||
from typing import TypeVar, Optional, Iterator, Generic
|
from typing import TypeVar, Optional, Iterator, Generic
|
||||||
|
import networkx as nx
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
||||||
@ -103,4 +106,36 @@ class Graph(Mapping, Generic[T]):
|
|||||||
if distances[u] + weight < distances[v]:
|
if distances[u] + weight < distances[v]:
|
||||||
raise ValueError("Graph contains a negative cycle")
|
raise ValueError("Graph contains a negative cycle")
|
||||||
|
|
||||||
return distances, predecessors
|
return distances, predecessors
|
||||||
|
|
||||||
|
def networkx(self):
|
||||||
|
g = nx.Graph()
|
||||||
|
g.add_nodes_from(self)
|
||||||
|
for node in self:
|
||||||
|
for dest, _ in self[node]:
|
||||||
|
g.add_edge(node, dest)
|
||||||
|
|
||||||
|
return g
|
||||||
|
|
||||||
|
def dfs(self, node, views=None):
|
||||||
|
if views is None:
|
||||||
|
views = set()
|
||||||
|
|
||||||
|
views.add(node)
|
||||||
|
if node in self:
|
||||||
|
for v, _ in self[node]:
|
||||||
|
if v not in views:
|
||||||
|
views = views | self.dfs(v, views=views)
|
||||||
|
return views
|
||||||
|
|
||||||
|
def connexes(self):
|
||||||
|
views = set()
|
||||||
|
|
||||||
|
ccs = []
|
||||||
|
for node in self:
|
||||||
|
if node not in views:
|
||||||
|
cur_views = self.dfs(node)
|
||||||
|
ccs.append(cur_views)
|
||||||
|
views = views | cur_views
|
||||||
|
|
||||||
|
return ccs
|
6
requirements.txt
Normal file
6
requirements.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
tqdm
|
||||||
|
z3-solver
|
||||||
|
matplotlib
|
||||||
|
networkx
|
||||||
|
requests
|
||||||
|
beautifulsoup
|
Loading…
Reference in New Issue
Block a user