Pour la première partie, il faut déterminer le point d'intersection entre deux droites données par chacune par un point et un vecteur.
Je n'avais pas trop envie de me prendre la tête à calculer ça alors j'ai regardé sur Wikipedia. J'ai bien fait parce que la formule n'est pas évidente.
Pour la partie 2:
étant données n grelons de positions initiales px_i, py_i pz_i et de vitesse vx_i, vy_i vz_i, il faut trouver un grelon de position initial px, py, pz et de vitesse vx, vy, vz qui rentre en collision avec tous les autres.
C'est à dire que pour tout i dans [1..n], il existe un temps t_i tel que
- px + vx * t_i = px_i + vx_i * t_i
- py + vy * t_i = py_i + vy_i * t_i
- pz + vz * t_i = pz_i + vz_i * t_i
Ca revient donc à résoudre un système d'équations linéaires (avec une matrice sparse).
Comme je n'avais pas envie de réimplémenter ça, j'ai utilisé Z3. Et là, c'est vraiment une purge, le binding Z3 n'est pas terrible, il est beaucoup trop verbeux.
Je vais essayer d'écrire quelques helpers pour simplifier ça si j'ai le temps.
Ou alors, utiliser une autre librairie.
# Solution en Haskell
Posté par Guillaume.B . En réponse au message Advent of Code 2023, jour 24. Évalué à 2.
Pour la première partie, il faut déterminer le point d'intersection entre deux droites données par chacune par un point et un vecteur.
Je n'avais pas trop envie de me prendre la tête à calculer ça alors j'ai regardé sur Wikipedia. J'ai bien fait parce que la formule n'est pas évidente.
https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
Pour la partie 2:
étant données n grelons de positions initiales
px_i, py_i pz_iet de vitessevx_i, vy_i vz_i, il faut trouver un grelon de position initialpx, py, pzet de vitessevx, vy, vzqui rentre en collision avec tous les autres.C'est à dire que pour tout i dans [1..n], il existe un temps
t_itel que-
px + vx * t_i = px_i + vx_i * t_i-
py + vy * t_i = py_i + vy_i * t_i-
pz + vz * t_i = pz_i + vz_i * t_iCa revient donc à résoudre un système d'équations linéaires (avec une matrice sparse).
Comme je n'avais pas envie de réimplémenter ça, j'ai utilisé Z3. Et là, c'est vraiment une purge, le binding Z3 n'est pas terrible, il est beaucoup trop verbeux.
Je vais essayer d'écrire quelques helpers pour simplifier ça si j'ai le temps.
Ou alors, utiliser une autre librairie.
Voici le code: