Faut voir le bon coté des choses!
Imagine quelqu'un garé en double-file devant ta voiture, ou garé devant ton entrée de garage…
Tu cherches la plaque dans la liste fuitée, et ca te donne nom, numero de télephone et email a contacter!
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Juste pour clarifier: l'hote d'un chip ESP32 ce n'est pas "ton kernel Linux", c'est habituellement l'OS principal d'un objet IoT comme le distributeur de croquettes connecte pour ton chat, un smartlock etc.
L'ESP32 peut etre utilise:
- de facon completement autonome, c'est a dire que c'est le chip principal de l'objet IoT (les gens qui font de la domotique l'utilisent beaucoup comme ca pour des capteurs ou actionneurs, avec leur programme dans la RAM de l'ESP)
- ou juste pour gerer la partie Bluetooth/Wifi, et en cas la ROM de l'ESP va exposer une interface (la fameuse HCI) pour qu'un autre microcontrolleur dans l'objet IoT puisse controller le Bluetooth.
Ici, en l'occurence, grace a ces fonctions non-documentees dans l'interface, l'objet IoT pourrait lancer des attaques bluetooth. Donc le risque serait si l'objet IoT lui-meme est compromis, l'attaque pourrait se propager au chip ESP32 et faire des choses louches au niveau des trames Bluetooth.
Note que c'est un peu dommage que pour une fois qu'un constructeur de microcontrolleur publie le code de la ROM, il se prenne un bad buzz et est accuse de backdoor, alors que ces fonctions non-documentees sont autorisees par le protocol HCI et apparemment relativement frequentes sur les chips Bluetooth (bien que faibles cote securite, et qui auraient du etre retirees en effet).
Que l'objet IoT ait acces complet a sa propre puce Wifi/Bluetooth, ca peut meme sembler logique.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Dans la boite ou je travaille (en Australie), il n'y a pas besoin de fournir de lettre de motivation (cover letter) pour candidater.
Les RHs font une selection simple: enlevent les personnes qui n'ont pas de visa de travail ou les profils complement a cote de la plaque.
Ensuite ils demandent aux candidats de passer un test de programmation en ligne - je precise je parle du recrutement de devs. Il parait qu'on perd une bonne partie des candidats, je ne sais pas s'ils ont la femme de passer le test en ligne ou ils abandonnent apres quelques questions.
Ensuite les CVs restants vont vers le manager qui recrute, avec le resultat du test en ligne. Les CVs ici font habituellement 2-3 pages, sauf pour les 'graduates' (qui sortent d'universite et n'ont pas encore grand chose a mettre dessus). Le manager selectionne une dizaine de candidats pour entretiens.
Le premier entretien commence avec une discussion, on laisse au candidat l'opportunite de dire ce qu'il aurait dit dans une lettre de motivation, et on continue avec un nouvel exercice de programmation, mais en live et en se focalisant aussi sur la capacite a echanger, trouver des solutions constructives ensemble etc. Ce qui se passe tous les jours dans une equipe de dev.
Ensuite, un autre entretien avec un autre manager+HR, plus classique, mais c'est rare que ca change l'opinion du premier entretien.
En tant que recruteur, ce qui est assez difficile c'est essayer d'eviter les biais, notamment le biais de similitude.
Apres, pas mal d'embauches se font en fin de stage quand on est content du stagiaire (et qu'il est content du boulot qu'on fait).
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Ce qu'ils ont decide est de ne plus couper le Docker Free Team Plan pour les membres actuels, mais il n'est plus possible de s'inscrire au Docker Free Team Plan depuis 2021, d'apres leur FAQ.
Donc la strategie generale ne change pas. Le Docker-sponsored Open Source plan est toujours reserve aux projets Open Source non-commerciaux.
Ca reste problematique pour les projets Open Source qui ont un petit revenu (donc ne qualifient pas pour DSOS) de publier leurs images sur Docker Hub, s'ils n'etaient pas inscrits au Free Team plan depuis 2021.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Tu as des references?
J'ai fait pas mal de traductions d'articles anglais vers le francais (sur des lieux geographiques qui ne portaient pas trop a debat) et a ma connaissance, aucun n'a ete supprime et je n'ai eu aucune remarque.
Je me doutais qu'il y avait un algorithme assez simple comme ca pour faire la conversion, mais comme Jerome ce n'est pas ma specialite du tout et a cause du fait que les entiers vont de -2 a 2 j'aurais ete incapable de le trouver.
Du coup j'ai fait un algo a ma sauce qui est nettement moins joli (mais au moins je le comprends). Mais j'ai ete plutot vite, environ une heure.
Bravo Yth pour tes algos et pour avoir remporte le leaderboard linuxfr!
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Posté par Eric P. .
En réponse au message Avent du Code, jour 24.
Évalué à 1.
Dernière modification le 24 décembre 2022 à 23:36.
J'aime beaucoup ta solution en effet. Joli et super efficace!
Chez moi aussi, c'est le calcul des grilles qui est plus long que la solution. Vu qu'il n'etait execute que moins de 300 fois par trajet, je n'ai pas cherche a l'optimiser. La ou je passe le plus de temps c'est pendant le deepcopy de ma grille avant de commencer la suivante.
Justement j'ai beaucoup ton calcul de grilles. A la place de looper sur les etats et mettre a jour la grille complete, tu calcules chaque blizzard pour chaque etat, et ensuite tu zippes tout ca avec l'unpacking operator.
Le PPCM par contre ne te fait pas gagner tant que ca vu qu'il n'est pas beaucoup plus petit que le nombre complet d'etats a connaitre.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Ca peut etre sympa a regarder en lisant les enonces sur Advent of Code.
Je n'ose imagine le temps que cette personne a passe pour d'abord resoudre le probleme, et ensuite faire toute la modelisation 3D.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Ma solution prend:
epignet@dell> time bin/pypy 2022/day24.py
trip1=249 trip2=246 trip3=240 (trip1+trip2+trip3)=735
bin/pypy 2022/day24.py 5.65s user 0.07s system 99% cpu 5.748 total
5.65s pour la partie 2.
J'utilise une liste de dictionaires pour ma grille, le dictionnaire etait le nombre de chaque caractere dans la case.
J'utilise un deque pour mon BFS.
Ce que j'ai fait pour optimiser au maximum, c'est:
python -m cProfile 2022\day24.py
qui ma dit que c'etait ma fonction qui retourne les cases libres autour de moi, qui etait la ou je passais le plus de temps. Du coup j'ai precalcule si chaque case etait libre au moment de mettre a jour les blizzards, pour ne pas avoir a le faire pour chaque essai.
Chaque essai consiste juste a est verifier les cases libres autour de soi et ajouter a un deque, ce qui est ultra rapide si les cases libres sont precalculees.
J'ai fait la partie 2 apres le repas de reveillon - eh oui il est 21:46 a Sydney a l'heure ou j'ecris, c'est peut-etre les quelques verres de Champagne qui m'ont fait un peu galerer sur un bug bete (je recalculais la grille une fois de trop apres chaque trajet) mais la partie 2 n'ajoutait pas de difficulte.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Posté par Eric P. .
En réponse au message Avent du Code, jour 23.
Évalué à 1.
Dernière modification le 24 décembre 2022 à 01:14.
889 rounds pour moi.
Et mon programme prend moins de 2s.
Il n'est pas tres different des votres, mais je stocke les coordonnees des Elfs dans un dictionary a la place d'un set, car la plupart des acces se font a key connue. Je me suis dit qu'un acces par key serait plus rapide qu'un 'in' sur un set qui parcourerait le set.
Ce qui est en fait faux, d'apres https://wiki.python.org/moin/TimeComplexity
Le set etant implemente comme un hash table, en moyenne un in dans un set est en O(1).
Cela dit mon implementation etant presque instantanee je n'ai rien eu a faire pour la partie 2.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Alors la je suis oblige de te demander plus de details sur cette visualisation qui est absolument sublime.
Meme les axes sont super jolis.
Quelle bibliotheque ou outil as-tu utilise pour ca?
Personnellement je n'ai paradoxalement pas trop galere pour ce probleme. A peu pres une heure pour chaque partie. Pour la partie 2 je n'ai meme pas ecrit la fonction de transition de faces pour les donnees de test pour gagner du temps. C'est la premiere fois que je zappe les donnees de test. Les mouvements avaient l'air corrects sur ma visualisation, et une fois n'est pas coutume c'est passe du premier coup.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Ce coup ci j'ai ete paresseux, et pour la deuxieme partie mon code ne marche pas avec tous les inputs.
J'ai fait le cube correspondant a mon input en papier en inscrivant le numero des faces, pour voir quelle face transitionnait vers quelle face, et j'ai hardcode le passage d'une face a l'autre (methode wrap3D).
fromdataclassesimportdataclassimportreboard=[]drawboard=[]ARROWS={0:">",1:"v",2:"<",3:"^"}isPart2=False@dataclassclassMe:x:inty:intdirection:int# 0=R 1=D 2=L 3=Udefwrap2D(self):matchself.direction:case0:# rightreturnnext(xforxinrange(len(board[self.y]))ifboard[self.y][x]!=" "),self.y,0case1:# downreturnself.x,next(yforyinrange(len(board))ifboard[y][self.x]!=" "),1case2:# leftreturnlen(board[self.y])-1,self.y,2case3:# upreturnself.x,next(yforyinrange(len(board)-1,-1,-1)iffindInBoard(self.x,y)!=" "),3defwrap3D(self):matchself.direction:case0:# rightifself.y<50:# right of 2 -> right of 5 reversedreturn99,149-self.y,2elifself.y<100:# right of 3 -> down of 2returnself.y+50,49,3elifself.y<150:# right of 5 -> right of 2 reversedreturn149,49-self.y+100,2else:# right of 6 -> down of 5returnself.y-100,149,3case1:# downifself.x<50:# down of 6 -> up of 2returnself.x+100,0,1elifself.x<100:# down of 5 -> right of 6return49,self.x+100,2else:# down of 2 -> right of 3return99,self.x-50,2case2:# leftifself.y<50:# left of 1 -> left of 4 reversereturn0,149-self.y,0elifself.y<100:# left of 3 -> up of 4returnself.y-50,100,1elifself.y<150:# left of 4 -> left of 1 reversereturn50,49-self.y+100,0else:# left of 6 -> up of 1returnself.y-100,0,1case3:# upifself.x<50:# up of 4 -> left of 3return50,self.x+50,0elifself.x<100:# up of 1 -> left of 6return0,self.x+100,0else:# up of 2 -> down of 6returnself.x-100,199,3defmoveWrap(self):x,y,dir=self.wrap3D()ifisPart2elseself.wrap2D()iffindInBoard(x,y)==".":self.x=xself.y=yself.direction=dirdefdrawPosition(self):s=drawboard[self.y]drawboard[self.y]=s[:self.x]+ARROWS[self.direction]+s[self.x+1:]defmoveBy1(self,offsetX,offsetY):matchfindInBoard(self.x+offsetX,self.y+offsetY):case".":self.x+=offsetXself.y+=offsetYcase" ":self.moveWrap()case"#":passdefmove(self,size:int):foriinrange(size):matchself.direction:case0:# rightself.moveBy1(1,0)case1:# downself.moveBy1(0,1)case2:# leftself.moveBy1(-1,0)case3:# upself.moveBy1(0,-1)self.drawPosition()deffindInBoard(x,y):ifx==-1ory==-1ory>=len(board)orx>=len(board[y]):return" "returnboard[y][x]withopen("2022/input_files/day22")asf:data="".join([lineforlineinf])groups=[group.split("\n")forgroupindata.split("\n\n")]board=groups[0]drawboard=board.copy()instructions=groups[1][0]moveSizes=list(map(int,re.findall(r"(\d+)",instructions)))turns=re.findall(r"([A-Z]+)",instructions)me=Me(board[0].index("."),0,0)formoveSize,turninzip(moveSizes,turns):me.move(moveSize)me.direction+=1ifturn=="R"else-1me.direction%=4me.move(moveSizes[-1])password=1000*(me.y+1)+4*(me.x+1)+me.directionprint(f"{password=}")
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
En fait j'avais commence par un DFS (en profondeur), et je l'ai reecrit completement en un BFS (en largeur) pour justement pouvoir comparer les chemins et garder les meilleurs.
Au final la partie algo est assez simple et standard, c'est assez simple de convertir un DFS en BFS.
C'est vrai que c'est impossible de savoir quand tu as la meilleure solution.
Pour moi, j'ai commence a 100 000, Advent of code m'a confirme que c'etait le bon resultat, et je suis descendu petit a petit jusqu'a 100. A 50 ca me trouvait moins de geodes.
J'aurais pu faire le contraire, commencer bas, tester dans Advent of Code, puis monter si le resultat etait trop bas.
Comme le dit le commentaire precedent, tout depend des inputs, mais ca depend aussi de la fonction de scoring et si tu as des heuristiques en plus de la fonction de scoring.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Il faut voir le verre a moitie plein, si je regarde le leaderboard plus personne ne peut te rattraper et ta place sur le podium est garantie!
On est encore 8 actifs dans le leaderboard, donc en gros si j'ai bien compris les regles, on peut tu peux gagner au maximum 7 points par jour sur les autres, et il ne reste que 4 jours.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Personnellement j'ai fait un Tree et j'ai utilise de la recursion pour les deux parties.
1ere partie: node::calculate() renvoie child1.calculate() plus/moins/fois/divise par child2.calculate()
2e partie: node::findUnknown(expectedResult)-> Unknown
D'abord je fait un calculate() de chaque child pour savoir qui a une valeur et qui a l'unknown.
Imaginons que child1 a la valeur et node.operation est *, ma fonction retourne findUnknown(expectedResult / child1.val)
Imaginons que child1 a la valeur et node.operation est +, ma fonction retourne findUnknown(expectedResult - child1.val)
Etc.
Je fais findUnknown recursivement a partir du root et ca me donne la bonne reponse.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Pour moi, pas de modelisation en classes aujourd'hui.
Le truc qui m'a pris du temps c'est de realiser qu'il y avait plusieurs fois les memes valeurs dans les donnees reelles. J'ai resolu ca au plus vite en stockant une liste de tuples (valeur, rang d'apparition de cette valeur).
En fait je peux descendre mon top d'options a garder a chaque minute jusqu'a 100 et les resultats sont toujours corrects:
part1_quality_with_mult=2193 part2_quality_product=7200
pypy3.9-v7.3.10-linux64/bin/pypy day19.py 0.26s user 0.05s system 52% cpu 0.593 total 0.26s elapsed pour l'ensemble des deux parties!
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Je suis un peu degoute sur celui-ci, j'ai perdu un temps fou pour une erreur bete.
J'avais du code qui me donnait les bonnes reponses 9 et 12 sur l'exemple, mais beaucoup trop lent.
Du coup je commence a ajouter des heuristiques d'optimisation. J'arrive a faire descendre le temps d'execution dans la minute, je commence a tester et je ne trouve plus que 7 et 10. Je me dis que mes optims sont trop brutales et je perd litteralement des heures a essayer de trouver des optims qui me redonnent le nombre correct… avant de realiser que j'avais introduit un bug et je ne collectais plus les ressources lors de la minute 24…
Bon apres fix de ce probleme, j'ai un algo suffisemment rapide qui me donne les bonnes reponses pour la partie 1, et aussi pour la partie 2.
Je ne garde qu'un nombre fixe d'options a chaque minute, je trie les options par score et je garde le top 200000 (j'aurais pu descendre beaucoup plus bas), donc le temps d'execution est a peu pres lineaire, et la partie 2 ne posait pas de probleme.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
A peu près pareil pour moi. Mais simple BFS a la place de Dijkstra.
Code non cleané et non optimisé (pas besoin aujourd'hui, phew).
defincluded(cube):foriinrange(3):globalmax_coordinateifcube[i]<-1orcube[i]>max_coordinate+1:returnFalsereturnTruedefget_adjacents(cube):x,y,z=cubeforadjin[(x,y,z+1),# up(x,y,z-1),# down(x-1,y,z),# left(x+1,y,z),# right(x,y-1,z),# back(x,y+1,z),# front]:ifincluded(adj):yieldadjdroplet=[]max_coordinate=0withopen("2022/input_files/day18")asf:fordatainf:cube=tuple(map(int,data.rstrip().split(",")))max_coordinate=max(max_coordinate,max(cube))droplet.append(cube)# Start BFS on top left corner to find exterior areaexterior=[(0,0,0)]queue=[]queue.append((0,0,0))whilequeue:cube=queue.pop(0)foradjinget_adjacents(cube):ifadjnotinexteriorandadjnotindroplet:exterior.append(adj)queue.append(adj)part1_surface=0part2_surface=0forcubeindroplet:foradjinget_adjacents(cube):ifadjnotindroplet:part1_surface+=1ifadjinexterior:part2_surface+=1print(f"{part1_surface=}")print(f"{part2_surface=}")
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Je viens de le finir, et il m'a fallu plusieurs heures aussi.
Ma premiere idee d'optimisation apres la partie 1 c'etait d'utiliser @functools.lru_cache pour gagner du temps au cas ou certains des inputs se repetaient. La suite de 'jets' est tres longue, mais sur une quantite si enorme d'essais j'avais un peu d'espoir.
Le cache aidait, mais pas suffisamment pour avoir une reponse suffisamment rapide. Je voulais voir a quel point le cache etait utilise donc j'ai trouve que lru_cache ajoute une method cache_info() sur la method cachee, qui renvoit les statistiques de cache hit/cache miss.
Et je me suis rendu compte que le cache etait systematiquement utilise apres la 1927e pierre, indiquant la presence d'une boucle.
J'ai aussi perdu du temps avec le fait que le tout premier cycle donnait une hauteur legerement au dessus des suivantes, mais j'ai finalement trouve.
Par contre je cale toujours sur la deuxieme partie du jour 16, je ne me suis pas encore resolu a regarder l'entree de forum d'hier, mais je crois que je vais m'y resoudre.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Posté par Eric P. .
En réponse au message Avent du Code jour 15.
Évalué à 2.
Dernière modification le 15 décembre 2022 à 12:00.
Ma partie 2 prend 1min 30 (sur un PC un peu vieillot).
L'idee de l'optim c'est de ne pas lister toute les valeur ou le beacon ne peut pas etre present pour un sensor mais definir l'intervale par ses limites, et faire l'union des intervales. Car il y a tres peu d'intervales mais ils sont enormes.
C'est quoi ton optim qui donne 19 secondes?
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
Par rapport a la deuxieme partie, pour moi la version bete et mechante ne marchait pas. Le calcul pour chaque point de depart prenait plusieurs minutes, donc il etait obligatoire de 'cacher' les distances a partir de chaque point.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Point terminologique pédant
Posté par Eric P. . En réponse au journal Fuite de données massive chez Autosur. Évalué à 6 (+5/-0).
Faut voir le bon coté des choses!
Imagine quelqu'un garé en double-file devant ta voiture, ou garé devant ton entrée de garage…
Tu cherches la plaque dans la liste fuitée, et ca te donne nom, numero de télephone et email a contacter!
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Réponse d’espressif
Posté par Eric P. . En réponse au journal Une backdoor dans les ESP32 ?. Évalué à 6 (+5/-0). Dernière modification le 18 mars 2025 à 13:34.
Juste pour clarifier: l'hote d'un chip ESP32 ce n'est pas "ton kernel Linux", c'est habituellement l'OS principal d'un objet IoT comme le distributeur de croquettes connecte pour ton chat, un smartlock etc.
L'ESP32 peut etre utilise:
- de facon completement autonome, c'est a dire que c'est le chip principal de l'objet IoT (les gens qui font de la domotique l'utilisent beaucoup comme ca pour des capteurs ou actionneurs, avec leur programme dans la RAM de l'ESP)
- ou juste pour gerer la partie Bluetooth/Wifi, et en cas la ROM de l'ESP va exposer une interface (la fameuse HCI) pour qu'un autre microcontrolleur dans l'objet IoT puisse controller le Bluetooth.
Ici, en l'occurence, grace a ces fonctions non-documentees dans l'interface, l'objet IoT pourrait lancer des attaques bluetooth. Donc le risque serait si l'objet IoT lui-meme est compromis, l'attaque pourrait se propager au chip ESP32 et faire des choses louches au niveau des trames Bluetooth.
Note que c'est un peu dommage que pour une fois qu'un constructeur de microcontrolleur publie le code de la ROM, il se prenne un bad buzz et est accuse de backdoor, alors que ces fonctions non-documentees sont autorisees par le protocol HCI et apparemment relativement frequentes sur les chips Bluetooth (bien que faibles cote securite, et qui auraient du etre retirees en effet).
Que l'objet IoT ait acces complet a sa propre puce Wifi/Bluetooth, ca peut meme sembler logique.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Des lettres de motivation ? En 2024 ?
Posté par Eric P. . En réponse au journal Mon activité rêvée. Évalué à 3.
Dans la boite ou je travaille (en Australie), il n'y a pas besoin de fournir de lettre de motivation (cover letter) pour candidater.
Les RHs font une selection simple: enlevent les personnes qui n'ont pas de visa de travail ou les profils complement a cote de la plaque.
Ensuite ils demandent aux candidats de passer un test de programmation en ligne - je precise je parle du recrutement de devs. Il parait qu'on perd une bonne partie des candidats, je ne sais pas s'ils ont la femme de passer le test en ligne ou ils abandonnent apres quelques questions.
Ensuite les CVs restants vont vers le manager qui recrute, avec le resultat du test en ligne. Les CVs ici font habituellement 2-3 pages, sauf pour les 'graduates' (qui sortent d'universite et n'ont pas encore grand chose a mettre dessus). Le manager selectionne une dizaine de candidats pour entretiens.
Le premier entretien commence avec une discussion, on laisse au candidat l'opportunite de dire ce qu'il aurait dit dans une lettre de motivation, et on continue avec un nouvel exercice de programmation, mais en live et en se focalisant aussi sur la capacite a echanger, trouver des solutions constructives ensemble etc. Ce qui se passe tous les jours dans une equipe de dev.
Ensuite, un autre entretien avec un autre manager+HR, plus classique, mais c'est rare que ca change l'opinion du premier entretien.
En tant que recruteur, ce qui est assez difficile c'est essayer d'eviter les biais, notamment le biais de similitude.
Apres, pas mal d'embauches se font en fin de stage quand on est content du stagiaire (et qu'il est content du boulot qu'on fait).
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: No free lunch
Posté par Eric P. . En réponse au journal Docker aime finalement le libre. Évalué à 5.
Ce qu'ils ont decide est de ne plus couper le Docker Free Team Plan pour les membres actuels, mais il n'est plus possible de s'inscrire au Docker Free Team Plan depuis 2021, d'apres leur FAQ.
Donc la strategie generale ne change pas. Le Docker-sponsored Open Source plan est toujours reserve aux projets Open Source non-commerciaux.
Ca reste problematique pour les projets Open Source qui ont un petit revenu (donc ne qualifient pas pour DSOS) de publier leurs images sur Docker Hub, s'ils n'etaient pas inscrits au Free Team plan depuis 2021.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: le petit bout de la lorgnette
Posté par Eric P. . En réponse au journal si on ne fait rien, Xonotic va disparaitre de wikipedia FR. Évalué à 2. Dernière modification le 01 février 2023 à 14:04.
Tu as des references?
J'ai fait pas mal de traductions d'articles anglais vers le francais (sur des lieux geographiques qui ne portaient pas trop a debat) et a ma connaissance, aucun n'a ete supprime et je n'ai eu aucune remarque.
Cette page d'aide a aussi l'air de dire que la pratique est tout-a-fait possible, voire recommandee.
https://fr.wikipedia.org/wiki/Aide:Traduction
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: J'ai galéré :)
Posté par Eric P. . En réponse au message Avent du code jour 25. Évalué à 2.
Je me doutais qu'il y avait un algorithme assez simple comme ca pour faire la conversion, mais comme Jerome ce n'est pas ma specialite du tout et a cause du fait que les entiers vont de -2 a 2 j'aurais ete incapable de le trouver.
Du coup j'ai fait un algo a ma sauce qui est nettement moins joli (mais au moins je le comprends). Mais j'ai ete plutot vite, environ une heure.
Bravo Yth pour tes algos et pour avoir remporte le leaderboard linuxfr!
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Belle modélisation, rapide, efficace.
Posté par Eric P. . En réponse au message Avent du Code, jour 24. Évalué à 1. Dernière modification le 24 décembre 2022 à 23:36.
J'aime beaucoup ta solution en effet. Joli et super efficace!
Chez moi aussi, c'est le calcul des grilles qui est plus long que la solution. Vu qu'il n'etait execute que moins de 300 fois par trajet, je n'ai pas cherche a l'optimiser. La ou je passe le plus de temps c'est pendant le deepcopy de ma grille avant de commencer la suivante.
Justement j'ai beaucoup ton calcul de grilles. A la place de looper sur les etats et mettre a jour la grille complete, tu calcules chaque blizzard pour chaque etat, et ensuite tu zippes tout ca avec l'unpacking operator.
Le PPCM par contre ne te fait pas gagner tant que ca vu qu'il n'est pas beaucoup plus petit que le nombre complet d'etats a connaitre.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Question naïve aux lutins du Père Noël qui font l'Avent du code
Posté par Eric P. . En réponse au message Avent du Code, jour 21. Évalué à 1.
Quelqu'un a quand meme fait une modelisation 3D de tous les problemes:
https://www.youtube.com/playlist?list=PLkVWdOnWoL8PbyxdR6_Qq46s8T4nMYlol
Ca peut etre sympa a regarder en lisant les enonces sur Advent of Code.
Je n'ose imagine le temps que cette personne a passe pour d'abord resoudre le probleme, et ensuite faire toute la modelisation 3D.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
# Sympa
Posté par Eric P. . En réponse au message Avent du Code, jour 24. Évalué à 4.
Bien joue!
Ma solution prend:
epignet@dell> time bin/pypy 2022/day24.py
trip1=249 trip2=246 trip3=240 (trip1+trip2+trip3)=735
bin/pypy 2022/day24.py 5.65s user 0.07s system 99% cpu 5.748 total
5.65s pour la partie 2.
J'utilise une liste de dictionaires pour ma grille, le dictionnaire etait le nombre de chaque caractere dans la case.
J'utilise un deque pour mon BFS.
Ce que j'ai fait pour optimiser au maximum, c'est:
python -m cProfile 2022\day24.py
qui ma dit que c'etait ma fonction qui retourne les cases libres autour de moi, qui etait la ou je passais le plus de temps. Du coup j'ai precalcule si chaque case etait libre au moment de mettre a jour les blizzards, pour ne pas avoir a le faire pour chaque essai.
Chaque essai consiste juste a est verifier les cases libres autour de soi et ajouter a un deque, ce qui est ultra rapide si les cases libres sont precalculees.
J'ai fait la partie 2 apres le repas de reveillon - eh oui il est 21:46 a Sydney a l'heure ou j'ecris, c'est peut-etre les quelques verres de Champagne qui m'ont fait un peu galerer sur un bug bete (je recalculais la grille une fois de trop apres chaque trajet) mais la partie 2 n'ajoutait pas de difficulte.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Mes conseils...
Posté par Eric P. . En réponse au message Avent du Code, jour 23. Évalué à 1. Dernière modification le 24 décembre 2022 à 01:14.
889 rounds pour moi.
Et mon programme prend moins de 2s.
Il n'est pas tres different des votres, mais je stocke les coordonnees des Elfs dans un dictionary a la place d'un set, car la plupart des acces se font a key connue. Je me suis dit qu'un acces par key serait plus rapide qu'un 'in' sur un set qui parcourerait le set.
Ce qui est en fait faux, d'apres https://wiki.python.org/moin/TimeComplexity
Le set etant implemente comme un hash table, en moyenne un in dans un set est en O(1).
Cela dit mon implementation etant presque instantanee je n'ai rien eu a faire pour la partie 2.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Mode triche on
Posté par Eric P. . En réponse au message Avent du Code, jour 22. Évalué à 3.
Alors la je suis oblige de te demander plus de details sur cette visualisation qui est absolument sublime.
Meme les axes sont super jolis.
Quelle bibliotheque ou outil as-tu utilise pour ca?
Personnellement je n'ai paradoxalement pas trop galere pour ce probleme. A peu pres une heure pour chaque partie. Pour la partie 2 je n'ai meme pas ecrit la fonction de transition de faces pour les donnees de test pour gagner du temps. C'est la premiere fois que je zappe les donnees de test. Les mouvements avaient l'air corrects sur ma visualisation, et une fois n'est pas coutume c'est passe du premier coup.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
# Mode triche on
Posté par Eric P. . En réponse au message Avent du Code, jour 22. Évalué à 4.
Ce coup ci j'ai ete paresseux, et pour la deuxieme partie mon code ne marche pas avec tous les inputs.
J'ai fait le cube correspondant a mon input en papier en inscrivant le numero des faces, pour voir quelle face transitionnait vers quelle face, et j'ai hardcode le passage d'une face a l'autre (methode wrap3D).
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Erreur bete
Posté par Eric P. . En réponse au message Avent du Code, jour 19. Évalué à 1.
En fait j'avais commence par un DFS (en profondeur), et je l'ai reecrit completement en un BFS (en largeur) pour justement pouvoir comparer les chemins et garder les meilleurs.
Au final la partie algo est assez simple et standard, c'est assez simple de convertir un DFS en BFS.
C'est vrai que c'est impossible de savoir quand tu as la meilleure solution.
Pour moi, j'ai commence a 100 000, Advent of code m'a confirme que c'etait le bon resultat, et je suis descendu petit a petit jusqu'a 100. A 50 ca me trouvait moins de geodes.
J'aurais pu faire le contraire, commencer bas, tester dans Advent of Code, puis monter si le resultat etait trop bas.
Comme le dit le commentaire precedent, tout depend des inputs, mais ca depend aussi de la fonction de scoring et si tu as des heuristiques en plus de la fonction de scoring.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: il était vraiment null celui-ci
Posté par Eric P. . En réponse au message Avent du Code, jour 20. Évalué à 3.
Il faut voir le verre a moitie plein, si je regarde le leaderboard plus personne ne peut te rattraper et ta place sur le podium est garantie!
On est encore 8 actifs dans le leaderboard, donc en gros si j'ai bien compris les regles, on peut tu peux gagner au maximum 7 points par jour sur les autres, et il ne reste que 4 jours.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par Eric P. . En réponse au message Avent du Code, jour 21. Évalué à 1.
Personnellement j'ai fait un Tree et j'ai utilise de la recursion pour les deux parties.
1ere partie: node::calculate() renvoie child1.calculate() plus/moins/fois/divise par child2.calculate()
2e partie: node::findUnknown(expectedResult)-> Unknown
D'abord je fait un calculate() de chaque child pour savoir qui a une valeur et qui a l'unknown.
Imaginons que child1 a la valeur et node.operation est *, ma fonction retourne findUnknown(expectedResult / child1.val)
Imaginons que child1 a la valeur et node.operation est +, ma fonction retourne findUnknown(expectedResult - child1.val)
Etc.
Je fais findUnknown recursivement a partir du root et ca me donne la bonne reponse.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Un bug que j'ai résolu sans jamais le trouver.
Posté par Eric P. . En réponse au message Avent du Code, jour 20. Évalué à 2.
Tout-a-fait! C'est plus efficace comme tu le proposes et ca marche pareil.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Un bug que j'ai résolu sans jamais le trouver.
Posté par Eric P. . En réponse au message Avent du Code, jour 20. Évalué à 4.
J'oubliais de dire, sans liste chainee, avec une liste python toute bete, ca prend une demi-seconde avec les donnees reelles.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Un bug que j'ai résolu sans jamais le trouver.
Posté par Eric P. . En réponse au message Avent du Code, jour 20. Évalué à 3.
Pour moi, pas de modelisation en classes aujourd'hui.
Le truc qui m'a pris du temps c'est de realiser qu'il y avait plusieurs fois les memes valeurs dans les donnees reelles. J'ai resolu ca au plus vite en stockant une liste de tuples (valeur, rang d'apparition de cette valeur).
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Erreur bete
Posté par Eric P. . En réponse au message Avent du Code, jour 19. Évalué à 2.
En fait je peux descendre mon top d'options a garder a chaque minute jusqu'a 100 et les resultats sont toujours corrects:
0.26s elapsed pour l'ensemble des deux parties!part1_quality_with_mult=2193 part2_quality_product=7200
pypy3.9-v7.3.10-linux64/bin/pypy day19.py 0.26s user 0.05s system 52% cpu 0.593 total
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
# Erreur bete
Posté par Eric P. . En réponse au message Avent du Code, jour 19. Évalué à 1.
Je suis un peu degoute sur celui-ci, j'ai perdu un temps fou pour une erreur bete.
J'avais du code qui me donnait les bonnes reponses 9 et 12 sur l'exemple, mais beaucoup trop lent.
Du coup je commence a ajouter des heuristiques d'optimisation. J'arrive a faire descendre le temps d'execution dans la minute, je commence a tester et je ne trouve plus que 7 et 10. Je me dis que mes optims sont trop brutales et je perd litteralement des heures a essayer de trouver des optims qui me redonnent le nombre correct… avant de realiser que j'avais introduit un bug et je ne collectais plus les ressources lors de la minute 24…
Bon apres fix de ce probleme, j'ai un algo suffisemment rapide qui me donne les bonnes reponses pour la partie 1, et aussi pour la partie 2.
Je ne garde qu'un nombre fixe d'options a chaque minute, je trie les options par score et je garde le top 200000 (j'aurais pu descendre beaucoup plus bas), donc le temps d'execution est a peu pres lineaire, et la partie 2 ne posait pas de probleme.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Plus cool que les jours précédents
Posté par Eric P. . En réponse au message Avent du Code, jour 18. Évalué à 3.
A peu près pareil pour moi. Mais simple BFS a la place de Dijkstra.
Code non cleané et non optimisé (pas besoin aujourd'hui, phew).
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Tetris style
Posté par Eric P. . En réponse au message Avent du Code, jour 17. Évalué à 3.
Je viens de le finir, et il m'a fallu plusieurs heures aussi.
Ma premiere idee d'optimisation apres la partie 1 c'etait d'utiliser @functools.lru_cache pour gagner du temps au cas ou certains des inputs se repetaient. La suite de 'jets' est tres longue, mais sur une quantite si enorme d'essais j'avais un peu d'espoir.
Le cache aidait, mais pas suffisamment pour avoir une reponse suffisamment rapide. Je voulais voir a quel point le cache etait utilise donc j'ai trouve que lru_cache ajoute une method cache_info() sur la method cachee, qui renvoit les statistiques de cache hit/cache miss.
Et je me suis rendu compte que le cache etait systematiquement utilise apres la 1927e pierre, indiquant la presence d'une boucle.
J'ai aussi perdu du temps avec le fait que le tout premier cycle donnait une hauteur legerement au dessus des suivantes, mais j'ai finalement trouve.
Par contre je cale toujours sur la deuxieme partie du jour 16, je ne me suis pas encore resolu a regarder l'entree de forum d'hier, mais je crois que je vais m'y resoudre.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Force Brute.
Posté par Eric P. . En réponse au message Avent du Code jour 15. Évalué à 2. Dernière modification le 15 décembre 2022 à 12:00.
Ma partie 2 prend 1min 30 (sur un PC un peu vieillot).
L'idee de l'optim c'est de ne pas lister toute les valeur ou le beacon ne peut pas etre present pour un sensor mais definir l'intervale par ses limites, et faire l'union des intervales. Car il y a tres peu d'intervales mais ils sont enormes.
C'est quoi ton optim qui donne 19 secondes?
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: python, vite fait bien fait
Posté par Eric P. . En réponse au message Avent du Code, jour 14. Évalué à 2.
Comment as-tu généré l'image?
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: En Python
Posté par Eric P. . En réponse au message Avent du Code, jour 12. Évalué à 1.
Par rapport a la deuxieme partie, pour moi la version bete et mechante ne marchait pas. Le calcul pour chaque point de depart prenait plusieurs minutes, donc il etait obligatoire de 'cacher' les distances a partir de chaque point.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.