Le troisième d'une série de 25 forums qui proposeront de partager vos solutions pour l'édition 2023 de l'Advent of Code.
Vous pouvez vous inscrire à un leadboard privé que j'ai créé pour LinuxFR : 2423220-c94050af
Jour 3 (résumé) :
Partie 1
Vous empruntez une télécabine pour vous rendre à la source. Mais elle ne fonctionne pas. Un lutin vous explique qu'il manque des pièces, mais on ne sait pas lesquelles.
Il faudrait la somme de tous les numéros de pièce sur le schéma pour savoir lesquelles manquent. Mais ne doivent être comptés comme des pièces les nombres qui sont adjacents (diagonaux ou directs) à un symbole (sauf le point).
Un exemple :
467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..
Les nombres qui ne sont pas des pièces sont 114 et 58, la somme des autres à retrouver est 4361.
Partie 2
Mais ce n'est pas tout, il y a aussi un engrenage qui est faussé, il faut le trouver pour le changer.
Un engrenage est un symbole « *
» qui est adjacent à exactement 2 pièces. Son ratio est la multiplication des numéros des deux pièces.
Le même exemple :
467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..
Il y a là deux engrenages (celui à côté de 617 n'est adjacent qu'à une seule pièce). Le premier est en haut à gauche et a pour pièces 467 et 35, soit un ratio de 16345. Le deuxième en bas à droite en a un de 451490. Leur somme que vous devez trouver est de 467835.
# Je me lance ma soluce en Java
Posté par syj . Évalué à 1.
Un peu long à coder, j'ai passé plus de temps sur la première partie que sur la deuxième partie.
Partie 1 :
Pour la partie 2, l'idée est assez simple. J'identifie les engrenages '*' par leurs coordonnées et je stocke sur chaque coordonnée la liste des nombres associés (numsById)
# Bonne idée.
Posté par djibb (site web personnel) . Évalué à 2. Dernière modification le 04 décembre 2023 à 08:27.
moi c'est en python, mais c'est une NON réponse… il doit me manquer des cas que je n'identifie pas…
# On bourrine, on bourrine et on fait des bêtises...
Posté par Yth (Mastodon) . Évalué à 2.
Faut dire, j'ai pu m'y mettre vers 23h30 hier soir…
Et ma bêtise a été de transformer "927*741" en 927741 au lieu de 927 et 741 séparés.
Déjà, la somme totale de tous les nombre du jeu se calcule ainsi :
Ce calcul fait à l'avance m'aurait permis de voir que 9691964 comme résultat, c'était ouvertement faux…
Bref, j'ai commencé à chercher certaines optimisations, en utilisant des comparaisons de set() en python, qui sont plutôt efficaces. Et j'aurais probablement dû utiliser des frozenset, car c'est plus rapide, quand on n'a pas besoin de les modifier.
Il reste aussi des optimisations faisables, mais la taille des données ne les justifient pas encore.
Zéro structures de données, un traitement très linéaire, ça reste simple, on ne fait pas encore de réelles abstractions.
numbers
est la liste des nombres et de leur « enveloppe » c'est à dire des coordonnées de toutes les cases composant ce nombre et adjacentes à lui.C'est un
set()
de doublets.symbols
contient la liste des coordonnées (doublets) de tous les symboles du plan.gears
contient la liste des coordonnées des symboles*
uniquement, et ne servira que pour la seconde partie.Je trouve le code un poil moche, et un meilleur travail sur les entrées, et les conditions boucles, pourrait alléger, mais il faut absolument ne pas se planter dans les cas limites : un nombre en fin de ligne, deux nombres séparés par un symbole (celui-là m'a mis dedans), etc.
Être carré, clairs, précis, sinon c'est l'écran bleu… Euh, enfin, la mauvaise réponse quoi…
La résolution des problèmes est assez simple après ça.
Problème n°1 :
nope
me sert à la validation, vu que j'ai la somme de tous ems chiffres qui vaut 598313, je dois avoirresult + nope = 598313
, et j'aurais pu aussi juste calculer nope et obtenir mon résultat comme ça, par soustraction.Ça pourra servir comme façon de faire plus tard, je me rappelle d'un exercice avec du sable qui s'écoule, qui peut se résoudre très facilement en regardant uniquement là où il ne s'écoule pas et en faisant une soustraction…
Et le second challenge :
Rien à recalculer, on va analyser dans l'autre sens : pour chaque « gear » on regarde dans combien de « number » il se trouve, si c'est 2, bingo, on l'ajoute.
C'est tout.
[^] # Re: On bourrine, on bourrine et on fait des bêtises...
Posté par barmic 🦦 . Évalué à 3.
J'ai une solution proche, mais pas le code sous la main. J'ai trouvé très confortable de lire les lignes via une expression régulière :
([^.\d]|\d+)
.Quand tu itère dessus, chaque groupe que tu capture est soit un nombre soit un symbole et je n'ai pas vraiment rencontré de cas au limite.
Pour la seconde partie changer l'expression régulière par
(\*|\d+)
et le seul changement nécessaire dans l'initialisation.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
# Python
Posté par alberic89 🐧 . Évalué à 1. Dernière modification le 04 décembre 2023 à 20:49.
Voici ma solution du jour :
J'ai passé beaucoup de temps à essayer de comprendre pourquoi diable les test fonctionnaient mais pas l'input ! La réponse était dans ma fonction pour récupérer la taille d'un entier :
Avec
while nb > 0
au lieu dewhile nb >= 1
. Mais les données de test fonctionnaient, c'était incompréhensible.Et oui, je suis un grand adepte du
try ... except
quand je code vite et crade.L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.