07:14 <discord_afpy_> <lythari59> matin.
07:14 <discord_afpy_> <lythari59> D11 j'ai tellement pas optimisé que j'ai planté ma machine xD #champion
07:14 <discord_afpy_> <lythari59> ça marche mieux une fois optimisé.
07:47 <entwanne> ouais pour la partie 2 va falloir trouver un truc
07:53 <entwanne> Bon, ça a pris trop de mémoire le programme s'est fait tuer
08:09 <mdk> hola la patie deux...
08:10 <mdk> 1 minute et j'ai pas de résultat, j'vais boire mon thé 😀
08:14 <entwanne> ok c'est bon ça marche mieux avec une meilleure représentation
08:15 <mdk> Bon bah j'ai raté mon pari. J'avais parié qu'une deque avait un temps d'insertion de O(1). Spoler : pas du tout.
08:17 <entwanne> 0,09s pour la P2 sur ma machine, ça me vz
08:17 <entwanne> * va
08:19 <mdk> GG
08:25 <mdk> Haha après 44 blinks j'utilise 50% de ma RAM, on va arrêter là et réfléchir 🙁
08:31 <debnet> Je viens de me lever et vous avez déjà fini l'AoC ? x)
08:33 <entwanne> On n'allait pas t'attendre non plus !
08:33 <debnet> Bah si !
08:36 <Mindiell> Bon, ben moi je sais ce que je vais présenté au prochain IOPCC \o/
08:41 <asyd> Mindiell: raconte ?
08:45 <discord_afpy_> <lythari59> 700ms la partie 2
08:45 <Mindiell> asyd: Un jeu vidéo en mode texte :o)
08:45 <discord_afpy_> <lythari59> ❤️
08:46 <Mindiell> Ca changera un peu des compute en math ou des trucs tarabiscotés
08:47 <Mindiell> J'ai aussi une autre idée qui est déjà à peu près fonctionnelle : un serveur qui répond aux protocoles définis sur les ports TCP 7, 9, 11, 13, 17, 19 et 37
08:48 <Mindiell> des vieux trucs inusités mais simplissimes :)
08:49 <Mindiell> pitet je virerai le 9 pour n'avoir que des protocoles "premiers" :o)
08:54 <discord_afpy_> <lythari59> Tu fais un livre dont vous êtes le héros où la "prochaine page" c'est le protocole sur lequel appeler ton serveur pour qu'il te réponde la suite du jeu.
09:05 <Mindiell> :D
09:05 <Mindiell> vu les protocoles, je pense pas
09:05 <Mindiell> Et j'avais présenté ce type de jeu avec gopher à la PyConFR 2023 :oP
09:06 <discord_afpy_> <lythari59> 🙂
09:06 <discord_afpy_> <lythari59> bah ça va pas te renvoyer du texte, mais des packet à parser pour comprendre la suite c'est sur que c'est pas les protocoles les plus adaptés xD.
10:12 <discord_afpy_> <Andy K (boss dreamer ou pas)> Salut
10:13 <Mindiell> o/
10:16 <discord_afpy_> <dancergraham> Bien vu le textwrap @lythari 😄
10:47 <debnet> Bon on va se pencher sur l'AoC.
10:47 <debnet> Mais ça pue le problème d'optimisation.
11:01 <debnet> Bon ma partie 2 tourne longtemps. ^^'
11:19 <debnet> Merci functools.cache. Praise the Lord.
11:29 <debnet> Quand t'as compris que les pierres ne se déplacent pas, c'est tout de suite plus simple.
11:30 <asyd> pierre qui roulent pas.. .. ?
11:32 <debnet> Exactement.
12:42 <entwanne> ah oui j'ai pas du tout eu l'intuition de voir les pierres individuellement pour le problème du jour, je pense qu'en voyant le puzzle/énoncé initial j'ai imaginé qu'il y aurait des interactions entre pierres
13:07 <debnet> entwanne: Pareil, ma solution naïve était de faire une double liste chaînée et je propageais le nombre d'éléments à droite et à gauche. Ca marchait terriblement bien pour la partie 1 mais pas pour la partie 2. Ensuite je me suis dit : "tiens, en fait il suffit de faire comme si chaque pierre était indépendante".
13:10 <entwanne> ouais moi au départ j'avais aussi une liste qui grossissait, mais finalement en P2 je me suis dit que je pouvais mutualiser (parce que c'est souvent les mêmes nombres qui reviennent). Je pense qu'au final ça fait à peu près la même chose que ta mise en cache, c'est juste une approche différente
13:18 <alain_afpy> uv : guide complet du nouveau gestionnaire de packages Python rapide et ambitieux - https://www.saaspegasus.com/guides/uv-deep-dive/
13:30 <debnet> Rapide et ambitieux. :D
13:34 <Mindiell> debnet: j'ia une question Django pour toi !
13:34 <debnet> Oui ?
13:35 <Mindiell> Je gère les parmaètres de mon utilisateur. Il y en a deux, mais ils ont le même fonctionnement :
13:35 <Mindiell> Il s'agit d'un entier qui doit être égal à la clef d'un auter modèle
13:35 <Mindiell> le souci c'est que ce modèle est lié à l'utilisateur car il appartient à l'utilisateur
13:36 <Mindiell> donc j'arrive à faire un form qui liste uniquement les objets de l'utilisateur
13:36 <Mindiell> mais quand je veux saisir une valeur (1 par exemple)
13:36 <Mindiell> il me jette en disant que ce n'est pas une valeur acceptée
13:36 <Mindiell> car j'ai mis un choices=() dans le modèle
13:36 <debnet> Bah mets pas de choices ? ^^
13:36 <Mindiell> ... ou alors je fais un formulaire totalement indépendant ?
13:36 <debnet> Fais voir ton modèle ?
13:36 <Mindiell> il faut un choices pour que le formulaire affiche la liste des objets
13:37 <Mindiell> mais je construits la liste en dynamique
13:37 <debnet> Si tu construits la liste en dynamique, il faudra surcharger ton champ de formulaire.
13:37 <debnet> Un choices vide ça n'a pas beaucoup de sens.
13:37 <Mindiell> https://wyz.fr/5Z-MH
13:37 <Mindiell> oui, c'est bien ce que je fais
13:37 <Mindiell> et je sélectionne la valeur 1
13:38 <Mindiell> mais il me jette en me disant que ce n'est pas une valeur acceptable
13:38 <Mindiell> (ou alors il faut jouer entre str et int tu penses ?)
13:38 <debnet> Le truc que je comprends pas, c'est pourquoi ton entier n'est pas une clé étrangère ?
13:38 <debnet> Si ça doit pointer vers un autre modèle.
13:38 <Mindiell> ah,
13:39 <Mindiell> parce que si je veux une clef étrangère (plus prratique ok) il faut que je lie le modèle de l'objet
13:39 <alain_afpy> WARNING !!! YAKAFOKON DETECTED !!!!
13:39 <debnet> Ouais et ?
13:39 <Mindiell> mais comme l'objet est lié à l'utilisateur : boucle d'import !
13:39 <debnet> Comment ça ?
13:39 <debnet> Tes modèles ne sont pas tous les module "models.py" ?
13:39 <debnet> s/les/dans le/
13:40 <Mindiell> si mais l'un est dans une app "toto" et l'autre dans mon app "accounts"
13:40 <Mindiell> et mon app toto a plusieurs modèles
13:41 <Mindiell> autant license est génrique et pas lié à l'utilisateur
13:41 <Mindiell> autnat Album a un auteur : l'utilisateur
13:41 <debnet> C'est pas grave, tu peux référencer un autre modèle avec une chaîne : https://docs.djangoproject.com/en/5.1/ref/models/fields/#lazy-relationships
13:41 <Mindiell> ouch!
13:41 <Mindiell> Je vais essayer ça alors
13:42 <Mindiell> si c'est aussi simple c'est cool, mais j'ai bossé pour rien...
13:42 <debnet> Bah ça serait BEAUCOUP plus propre ouais. :D
13:42 <Mindiell> mais donc pas besoin d'import ? Il cherchera tout seul ?
13:44 <debnet> Yep.
13:44 <debnet> Dans ton cas, faudra mettre certainement "toto.Album".
13:45 <Mindiell> ok
13:47 <debnet> Mindiell: Généralement, si tu rencontres un blocage en Django, faut te poser la question "est-ce que ça n'aurait pas été géré par le framework d'une manière plus simple que ce que j'imagine". :)
13:47 <debnet> Le framework a plus de 10 ans, ils ont couvert l'ensemble des cas pourris communs.
13:50 <Mindiell> oiu oui, j'avais commencé par cette solution. Ca semble fonctionner. Je vais nettoyer un peu mes cochonneries maintenant
13:50 <entwanne> <Mindiell> Il s'agit d'un entier qui doit être égal à la clef d'un auter modèle
13:50 <entwanne> C'est normal que tu n'utilises pas une clé étrangère vers ce modèle plutôt ?
13:50 <entwanne> ah pardon la question était posée plus bas
13:57 <Mindiell> j'avais bien utilisé une clef étrnagère au départ d'ailleurs ;o)
14:02 <entwanne> mais je pense que tous les frameworks permettent de définir des références cycliques
14:03 <entwanne> soit comme ici avec de l'évaluation paresseuse, soit en définissant la référence plus tard quand les deux classes ont été crées (et donc qu'on peut définir des relations utilisant les deux noms)
14:11 <Mindiell> j'avoue, Flask le permet effectivement. Je suis plus dans un mood je bricole 5 minutes devant le PC et je pars bricoler ou faire des samoussas là :o)
14:22 <debnet> xD
16:58 <alain_afpy> Livrer un environnement Python - https://linuxfr.org/forums/programmation-python/posts/livrer-un-environnement-python
16:59 <asyd> docker 😈
17:00 <debnet> Vade retro.
18:07 <misc> podman
18:44 <entwanne> bon je crois que j'ai enfin trouvé comment arriver à la solution pour le D21 2023
18:45 <entwanne> en tout cas mes calculs fonctionnent sur l'exemple, plus qu'à les coder
18:54 <debnet> entwanne il n'en a pas assez avec 2024, il fait 2023 en plus.
18:54 <entwanne> j'ai commencé, il faut que je finisse !
18:54 <alain_afpy> WARNING !!! YAKAFOKON DETECTED !!!!
19:47 <Mindiell> bon, djangorestframework c'est plus flou ...
19:50 <debnet> @Mindiell Pas tellement.
19:50 <debnet> Ca suit la même ligne que Django.
19:51 <debnet> Mais je reconnais qu'il faut quand même avoir une bonne connaissance de Django pour en cerner les preceptes.
19:51 <alain_afpy> WARNING !!! YAKAFOKON DETECTED !!!!
20:13 <entwanne> "You have completed Day 21!" 🥳
20:14 <entwanne> mon code est dégueulasse par contre, va falloir que je nettoie maintenant que je suis sûr du résultat https://github.com/entwanne/advent-of-code/blob/2023/2023/d21_p2.py
20:18 <debnet> entwanne: Je ne me souviens même plus de ce jour ci.
20:19 <debnet> entwanne: Ah ah j'ai regardé mon code pour ce jour là et j'ai un commentaire "# Disclaimer: not my idea!"
20:19 <debnet> Donc à mon avis un copain a du m'aider. ^^
20:21 <entwanne> ben j'ai l'impression qu'il faut forcément une dose de maths pour le régler
20:21 <debnet> Apparemment c'était une solution bruteforce vu le temps d'exécution de mon côté.
20:22 <debnet> Presque 30 secondes.
20:22 <entwanne> ouais ça moi aussi
20:22 <entwanne> mais ça a été très expérimental, j'ai identifié un pattern (croissance constante en fonction de la largeur de la carte) et j'ai extrapolé à partir de là
20:24 <debnet> Résume moi vite fait quel était l'exercice ?
20:24 <debnet> De ce que je vois vite fait, y avait un parcours.
20:27 <entwanne> C'était une carte de blocs traversables avec un point de départ donné (le point atteignable à l'étape 0). À chaque étape N, les 4 voisins directs (s'ils sont traversables) d'un point atteignable à l'étape N-1 devenaient atteignables
20:27 <debnet> Oh oui je me souviens vaguement.
20:27 <entwanne> ça faisait une sorte d'oscillations mais qui s'étendait jusqu'aux limites de la carte
20:27 <entwanne> on demandait à calculer le nombre de points accessibles à une étape donnée
20:28 <entwanne> et en partie 2, la carte était infinie
20:28 <debnet> Mon plus gros trauma d'AoC c'était la recherche de la créature marine. ^^
20:28 <debnet> Y avait aussi le foutu IntCode de 2019.
20:29 <debnet> Ils avaient tenté de faire un exercice qui revenait de jour en jour avec un degré de complexité supplémentaire.
20:29 <debnet> C'était un peu chiant car tu devais avoir réussi les jours précédents.
20:35 <entwanne> ouais je crois que je l'ai pas fini le 2019
20:35 <entwanne> (mais je l'avais fait après coup aussi, donc c'est pas la même motivation)
20:38 <Mindiell> debnet: la doc estmoins bien foutue qunad même
20:46 <debnet> Mindiell: Oui, elle part du principe que tu connais bien Django donc forcément.
22:14 <mdk> Youhou j'ai day11 en 268ms (hyperfine 'python day11.py'), j'me suis un peu fait déconcentrer par le boulot aujourd'hui mais ça m'a permis de prendre le temps de réfléchir dans le métro 😀
22:29 <debnet> mdk: Bravo!
22:43 <discord_afpy_> <chadys> @Mindiell après selon ton cas d'usage, ça peut être intéressant de regarder Django-ninja plutôt que DRF. C'est encore pire au niveau de la doc, ça part du principe que tu connais Django ET Pydantic, mais c'est sacrément plus moderne comme approche (basé sur les types)
22:46 <debnet> Ouais j'ai vu django-ninja, mais y a des trop de 3rd party libs for DRF encore qui sont trop pratiques.
22:47 <debnet> C'est l'avantage d'une réputation bien établie, ça arrivera sans doute avec ninja dans le futur.