Calendrier de l'avent 🎄 (mais sans chocolats)

Effectivement, pas de soucis non plus sur ce day 11
et effectivement part 2 = part1 si la premiÚre partie a été faite de façon rusée!.

Jour 11 beaucoup plus simple :slight_smile:

Jour 11

https://github.com/Nebsorg/AdventOfCode/blob/main/2023/Day11.py

2023 --- Day 11: Cosmic Expansion ---
****** First Star = 9312968
****** Second Star = 597714117556

Duration: 0:00:00.037152

Bon maintenant faut que je trouve le courage de retourner aux frontiĂšres du jour 10 :smiley:

Jour 12 trÚs intéressant !

J’ai implementĂ© la partie 1 en essayant d’optimiser autant que possible sentant la douille arriver pour la partie 2, malheureusement ce n’est pas suffisant et mon CPU est en train de chauffer. N’hĂ©sitez pas Ă  investir votre temps de cerveau disponible dĂšs la partie 1.

[Edit] Je bloque pour le moment, je ne vois pas trop comment prendre le problĂšme plus efficacement.

J’ai un truc qui fonctionne à peu prùs pour la partie 1 du jour 12 (ça tourne en 1.5s sur mon vieux laptop en Python), par contre c’est clairement pas suffisant pour la partie 2.

Idées

Pour le moment, ma façon de faire c’est : au fur et Ă  mesure, j’avance dans ma string en remplaçant un ? par # ou ., et Ă  chaque fois je vĂ©rifie que c’est cohĂ©rent avec la rĂšgle.

Sauf que c’est overkill : on ne veut pas toutes les strings possibles, on veut toutes les combinaisons possibles. Je pensais qu’un autre moyen Ă©tait de dire : on rĂ©cupĂšre les blocks ([#?]+), pour chaque block on calcule toutes leurs rĂšgles possibles et leur occurence, et aprĂšs il suffit de « concatĂ©ner Â» les blocks pour que la rĂšgle globale soit respectĂ©e. Sauf que ça ne marche pas pour une string du type ???####???####??? vu que ça fait un Ă©norme block.

Idée

Je pense essayer de commencer par caser les plus gros blocks, ça devrait relativement contraindre les possibilités pour caser les plus petits.

AprĂšs il ne faut pas avoir des millions de possibilitĂ©s de caser les gros blocks non plus
 Ă  tester, mais c’est pas gagner. J’ai l’impression de louper un truc important.

DeuxiÚme Idée

Au lieu de me prendre la tĂȘte avec les plus grosses valeurs, je prend une value en milieu de liste et je divise la liste de part et d’autre. Ensuite, je trouve toutes les positions valides pour la valeur du milieu, et pour chaque position valide, je recurse sur la droite et la gauche, en Ă©lagant dĂšs qu’une possiblitĂ© retourne 0 position valide. Ça se tente, mĂȘme is ça serait plus efficace en prenant la plus grande valeur de la liste plutĂŽt que la valeur du milieu.

Rhaaaaa la deuxiÚme idée rame à mort sur certaines lignes mais ça passe !
Victoire ! Du coup j’ai paumĂ© mon aprĂšs midi avec ces conneries, mais bon sang que ça valait le coup. Je n’ai jamais rencontrĂ© un problĂšme qui m’a forcĂ© Ă  abandonner 3 approches diffĂ©rentes Ă  la suite avant de trouver un truc qui marche Ă  peu prĂšs.

1 « J'aime »

partie 1 réalisée proprement surement optimisable (10s). Nonogramme for ever pour ceux a qui ça parle :blush:
On sent bien le gag arriver pour la part 2. J’ai mĂȘme pas tentĂ© le brut force !
Pour la partie 2, j’ai des idĂ©es pour y arriver, mais non dispo jusqu’à demain. Je le ferai donc sĂ»rement demain.

'nuf said (pourcentage de participants qui n’ont fait que la partie 1).

EspĂ©rons que le jour 13 soit moins prise de tĂȘte. ([Edit] En effet c’est bien plus abordable)

Source

Sinon il semblerait (une fois de plus pour les problĂšme de parcours d’arbres trop grands) qu’une bonne approche pour la partie 2 soit le Dynamic Programming, autrement dit de la rĂ©cursion (ou pas) tout en mettant en cache les rĂ©sultats dĂ©jĂ  trouvĂ©s pour un input donnĂ© afin d’éviter de refaire la mĂȘme chose encore et encore. Perso mon algo n’utilise pas de DP (juste de la rĂ©cursion) et il se finit en environ 2 minutes (en Kotlin), donc Ă  vous de voir.

2 « J'aime »

Pour le moment je met 12.2 de cÎté :smiley:
Jour 13 partie 1 OK sans trop de soucis, pas eu le temps de trop regarder la partie 2 mais j’ai encore peur que le brute force pose problĂšme. J’ai essayĂ© d’ĂȘtre malin pour ma partie 1, peut-ĂȘtre que ça peut passer pour 2.

Edit: ça passe pour la partie 2, le code

Non non ça passe crÚme.

j’ai du mettre en pose AoC hier, et je serai en deplacement pendant 4 jours à partir de demain, donc plus d’AoC pour moi avant la semaine prochaine :cry:

Pas de gros soucis pour ce day 13. MĂȘme code pour la partie 1 & 2. Pas de brut force.

J’ai mis un peu de temps avant de percuter que : les miroirs dĂ©marrent toujours en premiĂšre ou derniĂšre ligne/colonne :man_facepalming:

Une petite astuce pour optimiser le tout: d’abord chercher le dĂ©but et la fin d’un mirroir avant de regarder si tout est identique (a 0 ou 1 prĂšs) entre les 2

Je garde le 12.2 dans ma todo mais pas mal occupé aussi!

Hier mon code pour 12.2 n’était pas du tout assez optimisĂ©, ça bloquait dĂ©jĂ  sur l’exemple.
Là c’est en train de tourner sur mon input, ça devrait le faire. :crossed_fingers:

En attendant je vais regarder le jour 13.

Je pense que tout le monde a dĂ» avoir comme moi un input avec que des « ? Â» - Tu peux commencer par tenter juste celui-la et voir si ça se termine.

Ouais non du coup ça n’a pas fini cette nuit :confused:

Tant pis je passe, idem pour 13.2 oĂč je ne suis pas inspirĂ©.
Heureusement le 14 j’ai rĂ©ussi les deux parties :slight_smile:

Le 14.2 je l’ai fini Ă  la main pour trouver quand ça se rĂ©pĂ©tait aprĂšs quelques centaines de cycles, puis j’ai calculĂ© la valeur qui tombait au milliard avec la calculatrice windows.
MĂȘme pas honte :slight_smile:

2 « J'aime »

Pas de soucis pour 14.1, pour 14.2 j’imagine que ça va cycler, mais pas le temps ce matin de coder l’algo. On verra plus tard.

Edit: partie 2 finie, le code

Ah ah, bon pareil. Mais j’ai au moins fait le modulo en Python :sweat_smile:

Jour 15 tranquille, le seul challenge c’est de comprendre le problùme.

1 « J'aime »

Je suis bien d’accord, beaucoup de blabla pour pas beaucoup de code au final :smiley:

le fil rouge sur le fil vert, le fil bleu sur
 :crazy_face: