Calendrier de l'avent 🎄 (mais sans chocolats)

Jour 6, la partie 1 est ezpz, la 2 j’ai semi-bruteforcĂ©e pour Ă©viter de perdre trop de temps :wink: Il y a sĂ»rement moyen d’ĂȘtre trĂšs efficace en faisant une dichotomie, mais honnĂȘtement flemme de coder ça.

Le code donc, ça tourne en ~1.4s sur mon vieil i3 :slight_smile:

Day 6 aprĂšs le day 5 :


TorchĂ© en 20 minutes. Surement moyen d’optimiser aussi mais dĂ©jĂ  c’est pas de la pure brute force donc je suis content.

image
Bon, j’ai put finaliser le day 5 un peu en dĂ©calĂ©! Comme tout le monde, beaucoup de temps dans des bugs a la con mais au final un algo recursif propre et hyper rapide. C’était violent le debugage :smiley:
Au final plus de ligne de print que de ligne de code :sweat_smile:
Et aussi une fonction d’overlap de la mort a garder sous le coude :slight_smile: pour la prochaine fois !

Pas encore regardĂ© le day 6, mais ça peut pas ĂȘtre pire
 si ? :scream:

2 « J'aime »

J’ai le mĂȘme comportement sur le langage que j’utilise au boulot, il suffit de parcourir la liste a l’envers :slight_smile: .

1 « J'aime »

Bon Day 6, rien a voir avec hier :slight_smile:.
Je pense que le day 5 a du en décourager qq uns!


Deux heures Ă  essayer de debug hier sans rĂ©sultat. Deux minutes pendant ma pause aujourd’hui et je vois direct le souci. DĂ©goutĂ©. Mais j’y suis arrivĂ©.

4 « J'aime »

Bon, jour 6 qui passe tranquille en brute force (3s en python 
). J’ai mĂȘme pas essayĂ© autrement. L’algo est stupide, mais ça passe.

J’avais commencĂ© Ă  rĂ©flĂ©chir Ă  l’équation associĂ©. Mais entre une boucle for Ă©crite en 30 secondes et rĂ©soudre l’équation, j’ai eu la flemme :smiley:

Bref, jour 6 torché en 20min en buvant mon café :smiley:

Jour 6

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

2023 --- Day 6: Wait For It ---
****** First Star = 281600
****** Second Star = 33875953

Duration: 0:00:03.641092

J’ai commencĂ© un peu tard cette annĂ©e mais c’est bon j’ai rattrapĂ© le retard.
Jour 6 tranquille, fait aussi en 20 min.
Le jour 5 n’était pas si compliquĂ© avec la mĂ©thode bruteforce. 20 min Ă  coder, 20 minutes Ă  exĂ©cuter (en multithread) sur ma vieille machine. Un peu la flemme de faire un code plus optimisĂ©, j’aurais sĂ»rement mis plus de temps au total :slight_smile:

1 « J'aime »

Pas trop de soucis pour le jour 7. Code

Pas de difficulté particuliÚre sur ce jour 7.

Juste quelques astuces a utiliser pour se simplifier la vie:

astuce 1

Transformer TJQKA en ABCDE pour faire un tri alpha pour le rank.
Et remplacer J part 1 pour la part 2

astuce 2

Compter le nombre de carte unique pour faire la catĂ©gorisation (utilisation du set en python!) → plus que 5 cas

J’arrive a une catĂ©gorisation assez simple au final.

Résumé
uniqueCardLst = list(set(hand))
uniqueCardCnt = len(uniqueCardLst)
if uniqueCardCnt == 5: 
    handType = HIGH_CARD
elif uniqueCardCnt == 4: 
    handType = ONE_PAIR
elif uniqueCardCnt == 3:
    if hand.count(uniqueCardLst[0]) == 2 or hand.count(uniqueCardLst[1]) == 2:
        handType = TWO_PAIR
    else:
        handType = THREE_OF_A_KIND
elif uniqueCardCnt == 2:
    if hand.count(uniqueCardLst[0]) == 1 or hand.count(uniqueCardLst[0]) == 4:
        handType = FOUR_OF_A_KIND
    else:
        handType = FULL_HOUSE
elif uniqueCardCnt == 1: 
    handType = FIVE_OF_A_KIND

Avez vous trouvĂ© d’autres astuces ?

1 « J'aime »

Jour 7 terminé aussi. Pas vraiment de difficulté.

Je suis passĂ© par l’établissement d’une valeur numĂ©rique respectant l’ordre des diffĂ©rents main, puis j’ai fais une fonctionne qui Ă©value une main suivant cette mĂ©thode.

Par contre, je n’ai pas pensĂ© Ă  utiliser l’ordre alphabetique comme @arzhuras et j’ai beaucoup sa solution qui est bien plus simple et efficace !

jour 7

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

2023 --- Day 7: Camel Cards ---
****** First Star = 246912307
****** Second Star = 246894760

Duration: 0:00:00.012524

Pareil, une fonction pour trier les cartes (j’me suis juste « cassĂ© la tĂȘte Â» en « base 13 Â» parceque 13 cartes et que j’aime pas triĂ©s des strings). Et pour le type de mains, comme toi. J’ai juste mis un switch Ă  la place des elif et je retourne un valeur. Qu’il suffit d’ajouter au dĂ©but de la main pour faire le tri tout seul.

Résumé
match len(types) :
        case 5 : return 0 #highCard
        case 4 : return 1 #One pair
        case 3:             
            if t[1] ==2: return 2 #Two pair
            return 3 #3 of a kind
        case 2 : 
            if t[0] ==2: return 4 #full house
            return 5 #4 of a kind
        case 1 : return 6 #5 of a kind

Edit: Le « base 13 Â», c’est juste pour dire que j’ai dico carte->valeur et que j’ai une boucle qui fait

    for char in cards:
        result *= 13
        result += valueDic[char]
    return result

rien de bien difficile si on compte bien le nombre de carte (ouai j’aurais du mettre len(valueDic) Ă  la place de 13, ça m’aurait Ă©vitĂ© un run de dĂ©bug :sweat_smile:)

1 « J'aime »

Suite a ta remarque, je viens de voir que depuis le Python 3.10 (sortie il y a 2 ans), ils ont enfin mit un équivalent au switch case dans Python! Ca me rendait fou ce manque.

Enfin :raised_hands: Bon j’ai plus qu’a le tester! :slight_smile:

Aaah c’est pour ça que je vois pleins d’exemples avec ces horribles elif partout
 Les switch existaient pas. Du coup les programmeurs pythons remontent un peu dans mon estime :wink:

Et je viens de tester ! Ca marche! :slight_smile:
Ca rend vraiment le code plus lisible

Oui, je te rassure, on ne faisait pas ça que par pure masochisme :sweat_smile:

Le Python, c’est la vie :grin:
+1 programming language war :grinning:

Je bloque sur la partie 2 du jour 8. Je sens bien qu’il doit y avoir un truc oĂč il faut dĂ©tecter les moments oĂč ça se rĂ©pĂšte et utiliser ces infos pour calculer la rĂ©ponse intelligemment, mais je n’arrive pas Ă  mettre le doigt dessus.

Va falloir que je reprenne un café ou que je sorte une feuille et un crayon.
C’est trùs frustrant que ça arrive le jour 8.

Bon courage Ă  vous !

Bon, je l’ai passĂ©, mais c’était vraiment du grand n’importe quoi. Je ne comprends toujours pas pourquoi bidouiller ainsi les chiffre que j’ai trouvĂ© donne le bon rĂ©sultat.
Le jeu de donnĂ©es fourni a un comportement bien particulier qui n’a rien de garanti Ă  premiĂšre vue, les chemins auraient pu se comporter d’autres façon, et il n’y a pas moyen de le savoir de prime abord.

Ça a fini sur un vieux site en PHP pour calculer le Least Common Multiple, je me sens sale


Je viens de passer le jour 8.
Pour la part2, il faut simplement trouver les cycles de chaque entrĂ©e/sortie individuellement → ne surtout pas dĂ©rouler les chemins en parallĂšles. J’ai vĂ©rifiĂ© aussi que la sortie Z repointe bien sur le mĂȘme circuit que pour l’entrĂ©e A: il y a donc qu’un seul niveau de boucle pour une entrĂ©e donnĂ©e
Et ensuite y’a plus qu’a Calculer le PPCM des diffĂ©rents cycles (j’ai pas refait le PPCM moi mĂȘme, j’ai Ă©tĂ© chopper un bout de code sur le net
 ça va rentrer dans ma librairie ça aussi!

En fait l’input est bien calibrĂ©, mais il faut le dĂ©couvrir (mĂȘme si l’exemple donne un peu le ton) : les cycles pour chaque position de fin xxZ sont de mĂȘme longueur, c’est Ă  dire que si on part de xxZ, il faut N pas pour retourner Ă  xxZ, si on part de yyZ, il faut aussi N pas pour retourner Ă  yyZ. AprĂšs il faut trouver combien de steps il faut en partant de chaque uuA pour aller Ă  un xxZ. Et finalement ça donne des Ă©quations Ă  rĂ©soudre du type e + xN = M, d + xN = M, etc.

1 « J'aime »

L’input est encore mieux calibrĂ©e que ça: Pour que ça marche il faut que la sortie Z repointe bien sur le mĂȘme circuit que pour l’entrĂ©e A, mais aussi le fasse en autant d’étapes qu’entre l’entrĂ©e A et le dĂ©but de la boucle, ce qui est loin d’ĂȘtre acquis vu qu’on a quelques Ă©tapes avant de commencer la boucle Ă  chaque fois.

Rien dans le jeu d’exemple ou les instructions ne laisse Ă  supposer que c’est forcĂ©ment le cas.

1 « J'aime »