Ci-dessous ma soluce en Java pour la partie 2. Elle met 403ms une fois Java lancé (c'est comme un bon diesel Java). Et encore, j'ai une vilaine boucle qui compte jusqu'à avant le milliard.
J'optimise en utilisant des objets mutable & un bon vieux cache basé sur un Record.
packageaoc2023;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassAoc2023s14v2{enumType{SPHERE,ROCK;}publicstaticclassPoint{intx;inty;Typetype;publicPoint(intx,inty,Typetype){this.x=x;this.y=y;this.type=type;}}publicstaticclassWorld{intwidth;intheight;Point[][]map;List<Point>spheres=newArrayList<>();publicWorld(List<String>rows){map=newPoint[rows.size()][rows.get(0).length()];for(inty=0;y<rows.size();y++){addRow(rows.get(y),y);}this.height=rows.size();}publicvoidaddRow(Stringrow,inty){this.width=row.length();for(intx=0;x<row.length();x++){Pointp=null;if(row.charAt(x)=='O'){p=newPoint(x,y,Type.SPHERE);spheres.add(p);}elseif(row.charAt(x)=='#'){p=newPoint(x,y,Type.ROCK);}map[y][x]=p;}}publicbooleanisFree(intx,inty){if(x<0||x>=width||y<0||y>=height){returnfalse;}returnthis.map[y][x]==null;}publicPointfind(intx,inty){if(x<0||x>=width||y<0||y>=height){returnnull;}returnthis.map[y][x];}publicvoidmove(intdx,intdy){booleanchange=false;do{change=false;for(Pointp:spheres){if(isFree(p.x+dx,p.y+dy)){map[p.y][p.x]=null;p.x+=dx;p.y+=dy;map[p.y][p.x]=p;change=true;}}}while(change);}publicintcomputeWeight(){intsum=0;for(Pointsphere:spheres){sum+=(height-sphere.y);}returnsum;}publicList<String>toRows(){List<String>rows=newArrayList<>();StringBuildersb=newStringBuilder();for(inty=0;y<height;y++){sb.setLength(0);for(intx=0;x<width;x++){Pointp=find(x,y);if(p==null){sb.append('.');}elseif(p.type==Type.ROCK){sb.append('#');}else{sb.append('O');}}rows.add(sb.toString());}returnrows;}}publicstaticvoidmain(String[]args){longstartMs=System.currentTimeMillis();try(Scannerin=newScanner(Aoc2023s14v2.class.getResourceAsStream("res/t14.txt"))){List<String>rows=newArrayList<>();while(in.hasNext()){rows.add(in.nextLine());}IntegerstartCycle=null;IntegercycleCount=null;Worldworld=null;finallongLOOPS=1_000_000_000L;for(longx=0;x<LOOPS;x++){CacheKeycurrent=newCacheKey(rows);if(keys[current.cacheIndex()]!=null&&keys[current.cacheIndex()].equals(current)){if(startCycle==null){startCycle=current.cacheIndex();cycleCount=0;}elseif(startCycle==current.cacheIndex()){System.out.println("Make cycle: "+cycleCount);// Could be more elegant :)while(x<(LOOPS-cycleCount)){x+=(cycleCount+1);}}else{cycleCount++;}world=cache_worlds[current.cacheIndex()];}else{world=computeWorld(rows);keys[current.cacheIndex()]=current;cache_worlds[current.cacheIndex()]=world;System.out.println("miss "+x);startCycle=null;cycleCount=null;}rows=world.toRows();}System.out.println(world.computeWeight());}System.out.println((System.currentTimeMillis()-startMs)+"ms");}privatestaticWorldcomputeWorld(List<String>rows){Worldworld;world=newWorld(rows);world.move(0,-1);world.move(-1,0);world.move(0,1);world.move(1,0);returnworld;}publicstaticrecordCacheKey(List<String>rows){publicintcacheIndex(){returnMath.abs(this.hashCode())%CACHE_SIZE;}}publicstaticfinalintCACHE_SIZE=1_000_000;publicstaticCacheKey[]keys=newCacheKey[CACHE_SIZE];publicstaticWorld[]cache_worlds=newWorld[CACHE_SIZE];}
Pour la deuxième partie, j'ai opté pour une solution où je remplace les tuiles de base par des tuiles de 3x3
Je remplie ensuite en faisant les cellules en bordure de la map.
Note: Ce code doit être utilisée --Xms2G pour avoir une stack plus grande que celle par défaut.
publicenumPipe{V('|',Arrays.asList(Direction.N,Direction.S),newint[][]{newint[]{0,1,0},newint[]{0,1,0},newint[]{0,1,0}}),// is a vertical pipe connecting north and south.H('-',Arrays.asList(Direction.E,Direction.W),newint[][]{newint[]{0,0,0},newint[]{1,1,1},newint[]{0,0,0}}),// is a horizontal pipe connecting east and west.L('L',Arrays.asList(Direction.N,Direction.E),newint[][]{newint[]{0,1,0},newint[]{0,1,1},newint[]{0,0,0}}),// , is a 90-degree bend connecting north and east.J('J',Arrays.asList(Direction.N,Direction.W),newint[][]{newint[]{0,1,0},newint[]{1,1,0},newint[]{0,0,0}}),// is a 90-degree bend connecting north and west._7('7',Arrays.asList(Direction.S,Direction.W),newint[][]{newint[]{0,0,0},newint[]{1,1,0},newint[]{0,1,0}}),// is a 90-degree bend connecting south and west.F('F',Arrays.asList(Direction.S,Direction.E),newint[][]{newint[]{0,0,0},newint[]{0,1,1},newint[]{0,1,0}}),// is a 90-degree bend connecting south and east.D('.',Collections.emptyList(),newint[][]{newint[]{0,0,0},newint[]{0,0,0},newint[]{0,0,0}}),// is ground; there is no pipe in this tile.S('S',Arrays.asList(Direction.N,Direction.S,Direction.E,Direction.W),newint[][]{newint[]{0,1,0},newint[]{1,1,1},newint[]{0,1,0}}),// is the starting position of the// animal; there is a pipe on this// tile, but your sketch doesn't// show what shape the pipe has.;charc;List<Direction>directions;int[][]matrix;Pipe(charc,List<Direction>directions,int[][]matrix){this.c=c;this.directions=directions;this.matrix=matrix;}booleanacceptFrom(Directiond){returndirections.contains(d);}}
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)
Alors pour moi, une bonne raclette:
- Bcp de fromages
- Des Tomates
- De l'oignon coupé finement.
- Un gouse d'ail cuite en même que les patates
- Un peu de patates (pas plus d'une pour moi)
- Un peu de jambon fumé et du bacon
Et sinon pour la problématique de l'appareil à Raclette , il y a ceux de GIFI qui se branche les un les autres. Donc tout le monde peut venir avec ses appareils à raclette.
Si, c'est comme dans l'article, c'est à dire:
- le navigateur récupère une black list du gouvernement , çà me va.
Par contre, si le système est du type. Quand on consulte un site, on vient demander au site du gouvernement si on a le droit d'y accéder, c'est plus ennuyeux.
Pour 3 raisons:
- le gouvernement connaitra ton historique de navigation
- ça risque de tuer les perf de navigation
- une ddos sur site , on ne navigue plus
Après, c'est le genre de feature qui pourra se désactiver. Vu qu'elle ne sera pas appliquable dans tous les pays.
Après pour l histoiriques de navigation, les antivirus, google, ils ont déjà cette historique avec l antiphishing d activés donc c est plutôt le risque 2 et 3 qui gène
Par contre, ce qui me gène, c'est que je n'y connais rien Ruby & que pour utiliser ce genre de service.
il faut que je sois sur que cela soit Safe. il faut donc que je l'audit.
Il faudrait le même service dans un code qui tient en quelques fichiers facilement auditable sans dépendance tiers.
- 1 fichier sources serveur
- 1 form HTML
- 1 JS
- 1 form CSS
- 1 Dockerfile
Posté par syj .
En réponse au message Avent du code jour 25.
Évalué à 2.
Dernière modification le 25 décembre 2022 à 11:52.
Environ 2h40 pour faire ce fichu dernier problème. Je genre d'éxercice, ce n'est vraiment pas mon truc.
J'y suis allé à la méthode ajustement test unitaire.
Le parsing est assez simple à réaliser. En gros, c'est comme une conversion d'une base 5 avec des -1 , et -2 :)
Le problème, c'est l'opération inverse. Mon algo est tellement tordu que je n'arrive pas à l'expliquer :)
Je n'ai même pas l'excuse de l'alcool car je suis sous antibiotique. Résultat, c'est mon premier noël sans une goutte d'alcool.
On est dans le cas typique d'un parcours en largeur d'un arbre des possibles.
A chaque round, on regarde l'ensemble des actions possibles et on calcule les états suivants en fonction de ses possibilités
il y a des branches qui s'élimine d'elle-même car il n'y a plus d'action possible pour le joueur.
il y aussi des branches qui se rejoingne car il y a plusieurs chemin pour arriver à un même état.
J'utilise le hashCode/equals de mon State pour les dédupliquer sinon çà explose grave.
Au total,j'ai mis 1h50 pour debug les différentes conneries que j'ai fait à mon réveille.
Je mets 40s pour calculer la solution de la 2ème étoiles
Maintenant, je vais aller braver les magasins car j'ai plein de cadeau à acheter :-).
Joyeux Noël à tous.
Dans l'ensemble, ils sont tous beaucoup plus simple que l'an dernier.
Environ 1h40 après 12h de voiture + ma crève qui ne me lâche pas, on va dire que çà aurait pu être pire.
Dans l'ensemble , il n'y a rien de compliqué aujourd'hui. Il faut juste conserver à l'esprit toutes les petites règles qui ne sont pas flag en gras dans la description.
Résultat, j'ai perdu 30min à comprendre que quand il n'y a pas d'Elf autour. Il ne bouge pas.
La deuxième partie, elle ne rajoute rien de dur, je m'attendais à une règle genre distance, ou un truc qui faisait exploser la volumétrie.
Mais non rien, j'ai juste lancé mon programme pas du tout optimisé en me disant il va falloir que je trouve une opti.
Je n'ai pas eu le temps de finir d'écrire la première opti que j'avais déjà la solution.
Environ 4h-4h30 effectif dessus.
La première partie est fastidieuse, mais çà se code bien (~2h)
La deuxième partie est encore plus fastidieuse.
J'ai opté pour une classe "Arrete" agrégeant 2 segments caractérisés par une direction.
Si on est dans un de ces 2 segments en matchant la direction de ce dernier, j'applique la transformation de changement d’arête.
J'ai donc pris le temps d'identifier manuellement les arêtes du jeu de test pour valider mon algo. Je me suis aidé d'un petit découpage papier
pour faciliter l'opération.
Puis, j'ai fait pareil pour mon jeu de données. C'est le plus long.
Par exemple pour le Jeu de test, elle donne ceci.
9,9->9,12L 8,8->5,8D
5,5->8,5U 9,1->9,4L
13,9->16,9U 12,8->12,5R
1,5->4,5U 12,1->9,1U
4,8->1,8D 9,12->12,12D
13,12->16,12D 1,8->1,5L
12,4->12,1R 16,9->16,12R
Posté par syj .
En réponse au message Avent du Code, jour 21.
Évalué à 2.
Dernière modification le 21 décembre 2022 à 23:56.
J'ai mis grosso modo 1h15.
Pour faire l'éval, j'ai utilisé un parser JEXL. Le problème est qu'il travaille en double & qu'il m'a fallut passer en BigDecimal pour éviter les pertes de précisions du au double.
Résultat, j'ai été obligé de transformer les expression pour utiliser des BigDecimal.
çà m'a permit de trouver rapidement la première étoile.
La deuxième étoile.
J'ai déjà commencé par réduire l'arbre d'évaluation, en gros tout ce qui ne dépend pas de humn.
Puis, j'ai rapidement vu que la fonction décroissé. J'aurai pu tenter une recherche dichotomique dans l'espace d'entier.
Mais j'étais trop fatigué pour coder un truc intelligent.
Résultat, j'ai monté une boucle qui permet de suivre l'évolution, j'ai joué manuellement sur les paramétres pour trouver la valeur
C'est tellement sale que je partage mon code pour une fois :-p
J'ai pris le problème du mauvais sens, il m'a fallut plus de 3h pour comprendre qu'il ne fallait pas appliquer la transformation 3000 fois pour avoir la réponse.
J'ai réecris 3 ou 4 fois mon code. J'ai commencé par un tableau avec des modulos au final, j'ai terminé par une liste doublement chainés comme quasiment tout le monde.
J'ai remis une bonne 1h30 pour caler le modulo pour éviter d'appliquer les millions de déplacement.
Bref, un très mauvaise journée. En plus, vous êtes plein à y être arrivé avant moins résultat.
Je n'ai plus aucun espoir de rafler la seconde place.
Petite amélioration, je descends à 6s en modifiant mon DFS
L'idée est de ne pas aller jusqu'au bout si on sait déjà qu'on sera en-dessous du meilleur temps.
```
public static void executeDFS(State state) {
int leftTurn = NB_TURN_32- state.index;
int expGeode = state.geode+(NB_TURN_32-state.index) * (state.geodeRobot) + (leftTurn+1) * (leftTurn + 0) / 2;
Gg, Perso, j'y ai passé 2h ce matin et je bloque sur le fait que je ne trouve pas comment arriver à 12 sur le 2ème du test unit.
Je dois avoir un bug qui m'echape.
Malheureusement, j'ai 2 truc urgent qui sont tombé aujourd'hui. Pas sur que je puisse y rebosser aujourd'hui.
et la fin de semaine risque d'être compliqué, je suis en vacances jeudi soir.
La première étape stockés les cubes dans un HashSet puis compter les faces non adjacente à une autre en checkant la présence dans le HashSet.
Pour la deuxième, j'ai monté un dijkstra en partant d'un espace à l'extérieur à la structure de cube. Au final, je check si le côté du cube est adjacent à une zone accessible depuis l'air.
# Solution en Java 403ms
Posté par syj . En réponse au message Advent of Code, jour 14. Évalué à 1.
Ci-dessous ma soluce en Java pour la partie 2. Elle met 403ms une fois Java lancé (c'est comme un bon diesel Java). Et encore, j'ai une vilaine boucle qui compte jusqu'à avant le milliard.
J'optimise en utilisant des objets mutable & un bon vieux cache basé sur un Record.
# J'en ai bavé.
Posté par syj . En réponse au message Advent of Code 2023, jour 12. Évalué à 1.
6h au total ! J'ai commencé par prendre le problème de travers.
J'ai fait substitution récursive des '?' ,c'était mon erreur.
C'est après que j'ai compris qu'il fallait distribuer les espaces restant entre les groupes.
çà permet d'exprimer le problème avec une fonction recursive pour lequel on peut mettre en place un cache des valeurs par rapport au reste à évaluer.
Environ 414ms sur ma machine (après avoir commenté les println)
# Ma solution
Posté par syj . En réponse au message Advent of Code 2023 : Jour 10. Évalué à 1.
Pour la deuxième partie, j'ai opté pour une solution où je remplace les tuiles de base par des tuiles de 3x3
Je remplie ensuite en faisant les cellules en bordure de la map.
Note: Ce code doit être utilisée --Xms2G pour avoir une stack plus grande que celle par défaut.
# Je me lance ma soluce en Java
Posté par syj . En réponse au message Advent of Code 2023 : Day 3. É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)
[^] # Re: Plusieurs leaderboards privés ?
Posté par syj . En réponse au journal Advent of code 2023. Évalué à 3.
Je confirme. On a un leadboard interne à ma boite. Plus celui-ci.
[^] # Re: J'y retourne !
Posté par syj . En réponse au journal Advent of code 2023. Évalué à 4.
J'aurai du te laisser faire la news :-p
# Personnellement, je préfère les tomates aux pattates
Posté par syj . En réponse au journal Il est temps que la communauté internationale fasse un choix. Évalué à 2.
Alors pour moi, une bonne raclette:
- Bcp de fromages
- Des Tomates
- De l'oignon coupé finement.
- Un gouse d'ail cuite en même que les patates
- Un peu de patates (pas plus d'une pour moi)
- Un peu de jambon fumé et du bacon
Et sinon pour la problématique de l'appareil à Raclette , il y a ceux de GIFI qui se branche les un les autres. Donc tout le monde peut venir avec ses appareils à raclette.
# J'adore
Posté par syj . En réponse au journal Grandbrothers. Évalué à 2.
J'adore :) Merci pour cette belle découverte.
# Ça dépend
Posté par syj . En réponse à la dépêche Pétition de Mozilla pour protéger Firefox. Évalué à 1.
Si, c'est comme dans l'article, c'est à dire:
- le navigateur récupère une black list du gouvernement , çà me va.
Par contre, si le système est du type. Quand on consulte un site, on vient demander au site du gouvernement si on a le droit d'y accéder, c'est plus ennuyeux.
Pour 3 raisons:
- le gouvernement connaitra ton historique de navigation
- ça risque de tuer les perf de navigation
- une ddos sur site , on ne navigue plus
Après, c'est le genre de feature qui pourra se désactiver. Vu qu'elle ne sera pas appliquable dans tous les pays.
Après pour l histoiriques de navigation, les antivirus, google, ils ont déjà cette historique avec l antiphishing d activés donc c est plutôt le risque 2 et 3 qui gène
# embrace - extend - extinguish
Posté par syj . En réponse au journal Wayland dans windows 10 et 11. Évalué à 2.
J'ai découvert moi aussi WSL 2 sur Windows. çà me permet de faire tourner un Linux & plein d'instance docker pour mes dev.
Je n'ai pas encore essayé de faire tourner des apps graphique mais je ne suis pas surpris que çà marche.
Ce qui me terrifie, c'est la stratégie historique de Microsoft: Embrace - Extend - Extinguish.
Avec, ils ont réussi à bouffer : OS/2 , Netscape, …
[^] # Re: Mailcow ?
Posté par syj . En réponse au message Serveur smtp/map. Évalué à 1.
Merci pour l'info.
Au final, je pense que je vais partir avec une image docker de postfix maison ou de sendmail maison.
[^] # Re: Mailcow ?
Posté par syj . En réponse au message Serveur smtp/map. Évalué à 1.
Merci pour le lien.
J'aurai préféré un témoignage genre çà marche chez moi :)
çà a l'air de faire trop de truc pour moi. Mon besoin est beaucoup plus simple.
# Perso, j'y connais rien Ruby mais ...
Posté par syj . En réponse au lien OneTimeSecret. Évalué à 0.
Je trouve que l'idée est bonne.
Par contre, ce qui me gène, c'est que je n'y connais rien Ruby & que pour utiliser ce genre de service.
il faut que je sois sur que cela soit Safe. il faut donc que je l'audit.
Il faudrait le même service dans un code qui tient en quelques fichiers facilement auditable sans dépendance tiers.
- 1 fichier sources serveur
- 1 form HTML
- 1 JS
- 1 form CSS
- 1 Dockerfile
[^] # Re: J'ai galéré :)
Posté par syj . En réponse au message Avent du code jour 25. Évalué à 2.
Yes bien joué Yth
Bien joué tt le monde.
Je trouve qu il etait vraiment plus simple que l'an dernier.
Le prochain challenge sympa dans ce genre, c est ctf de l Ansi en mai.
# J'ai galéré :)
Posté par syj . En réponse au message Avent du code jour 25. Évalué à 2. Dernière modification le 25 décembre 2022 à 11:52.
Environ 2h40 pour faire ce fichu dernier problème. Je genre d'éxercice, ce n'est vraiment pas mon truc.
J'y suis allé à la méthode ajustement test unitaire.
Le parsing est assez simple à réaliser. En gros, c'est comme une conversion d'une base 5 avec des -1 , et -2 :)
Le problème, c'est l'opération inverse. Mon algo est tellement tordu que je n'arrive pas à l'expliquer :)
Je n'ai même pas l'excuse de l'alcool car je suis sous antibiotique. Résultat, c'est mon premier noël sans une goutte d'alcool.
Joyeux noël à tous.
# Parcours en largeur.
Posté par syj . En réponse au message Avent du Code, jour 24. Évalué à 5.
On est dans le cas typique d'un parcours en largeur d'un arbre des possibles.
A chaque round, on regarde l'ensemble des actions possibles et on calcule les états suivants en fonction de ses possibilités
il y a des branches qui s'élimine d'elle-même car il n'y a plus d'action possible pour le joueur.
il y aussi des branches qui se rejoingne car il y a plusieurs chemin pour arriver à un même état.
J'utilise le hashCode/equals de mon State pour les dédupliquer sinon çà explose grave.
Au total,j'ai mis 1h50 pour debug les différentes conneries que j'ai fait à mon réveille.
Je mets 40s pour calculer la solution de la 2ème étoiles
Maintenant, je vais aller braver les magasins car j'ai plein de cadeau à acheter :-).
Joyeux Noël à tous.
# Dans l'ensemble, c'est plus simple que l'an dernier
Posté par syj . En réponse au message Avent du Code, jour 23. Évalué à 2.
Dans l'ensemble, ils sont tous beaucoup plus simple que l'an dernier.
Environ 1h40 après 12h de voiture + ma crève qui ne me lâche pas, on va dire que çà aurait pu être pire.
Dans l'ensemble , il n'y a rien de compliqué aujourd'hui. Il faut juste conserver à l'esprit toutes les petites règles qui ne sont pas flag en gras dans la description.
Résultat, j'ai perdu 30min à comprendre que quand il n'y a pas d'Elf autour. Il ne bouge pas.
La deuxième partie, elle ne rajoute rien de dur, je m'attendais à une règle genre distance, ou un truc qui faisait exploser la volumétrie.
Mais non rien, j'ai juste lancé mon programme pas du tout optimisé en me disant il va falloir que je trouve une opti.
Je n'ai pas eu le temps de finir d'écrire la première opti que j'avais déjà la solution.
1min20 pour 1014 round
# Il était vraiment sympa celui-ci :-)
Posté par syj . En réponse au message Avent du Code, jour 22. Évalué à 1.
Environ 4h-4h30 effectif dessus.
La première partie est fastidieuse, mais çà se code bien (~2h)
La deuxième partie est encore plus fastidieuse.
J'ai opté pour une classe "Arrete" agrégeant 2 segments caractérisés par une direction.
Si on est dans un de ces 2 segments en matchant la direction de ce dernier, j'applique la transformation de changement d’arête.
J'ai donc pris le temps d'identifier manuellement les arêtes du jeu de test pour valider mon algo. Je me suis aidé d'un petit découpage papier
pour faciliter l'opération.
Puis, j'ai fait pareil pour mon jeu de données. C'est le plus long.
Par exemple pour le Jeu de test, elle donne ceci.
9,9->9,12L 8,8->5,8D
5,5->8,5U 9,1->9,4L
13,9->16,9U 12,8->12,5R
1,5->4,5U 12,1->9,1U
4,8->1,8D 9,12->12,12D
13,12->16,12D 1,8->1,5L
12,4->12,1R 16,9->16,12R
# Aujourd'hui, on fait dans le sale.
Posté par syj . En réponse au message Avent du Code, jour 21. Évalué à 2. Dernière modification le 21 décembre 2022 à 23:56.
J'ai mis grosso modo 1h15.
Pour faire l'éval, j'ai utilisé un parser JEXL. Le problème est qu'il travaille en double & qu'il m'a fallut passer en BigDecimal pour éviter les pertes de précisions du au double.
Résultat, j'ai été obligé de transformer les expression pour utiliser des BigDecimal.
çà m'a permit de trouver rapidement la première étoile.
La deuxième étoile.
J'ai déjà commencé par réduire l'arbre d'évaluation, en gros tout ce qui ne dépend pas de humn.
Puis, j'ai rapidement vu que la fonction décroissé. J'aurai pu tenter une recherche dichotomique dans l'espace d'entier.
Mais j'étais trop fatigué pour coder un truc intelligent.
Résultat, j'ai monté une boucle qui permet de suivre l'évolution, j'ai joué manuellement sur les paramétres pour trouver la valeur
C'est tellement sale que je partage mon code pour une fois :-p
# il était vraiment null celui-ci
Posté par syj . En réponse au message Avent du Code, jour 20. Évalué à 2.
J'ai pris le problème du mauvais sens, il m'a fallut plus de 3h pour comprendre qu'il ne fallait pas appliquer la transformation 3000 fois pour avoir la réponse.
J'ai réecris 3 ou 4 fois mon code. J'ai commencé par un tableau avec des modulos au final, j'ai terminé par une liste doublement chainés comme quasiment tout le monde.
J'ai remis une bonne 1h30 pour caler le modulo pour éviter d'appliquer les millions de déplacement.
Bref, un très mauvaise journée. En plus, vous êtes plein à y être arrivé avant moins résultat.
Je n'ai plus aucun espoir de rafler la seconde place.
[^] # Re: Modélisation trop longue à débugger
Posté par syj . En réponse au message Avent du Code, jour 19. Évalué à 1.
Petite amélioration, je descends à 6s en modifiant mon DFS
L'idée est de ne pas aller jusqu'au bout si on sait déjà qu'on sera en-dessous du meilleur temps.
```
public static void executeDFS(State state) {
int leftTurn = NB_TURN_32- state.index;
int expGeode = state.geode+(NB_TURN_32-state.index) * (state.geodeRobot) + (leftTurn+1) * (leftTurn + 0) / 2;
if(bestMap.get(state.bp) != null && expGeode < bestMap.get(state.bp)) {
return;
}
}
```
[^] # Re: Modélisation trop longue à débugger
Posté par syj . En réponse au message Avent du Code, jour 19. Évalué à 2. Dernière modification le 19 décembre 2022 à 21:01.
Au final, J'aurai mis 35min de plus.
Le problème venait que j'avais mis une règle qui réduisait le nombre d'action possible pendant mon parcours en profondeur
Il met 1min3s pour calculer le 2ème.
Pour une fois , mon code n'est pas trop moche :)
[^] # Re: Modélisation trop longue à débugger
Posté par syj . En réponse au message Avent du Code, jour 19. Évalué à 1.
Est ce qu'on peut construire plusieurs robots en un tour ?
C'est probablement çà mon erreur ?
[^] # Re: Modélisation trop longue à débugger
Posté par syj . En réponse au message Avent du Code, jour 19. Évalué à 1.
Gg, Perso, j'y ai passé 2h ce matin et je bloque sur le fait que je ne trouve pas comment arriver à 12 sur le 2ème du test unit.
Je dois avoir un bug qui m'echape.
Malheureusement, j'ai 2 truc urgent qui sont tombé aujourd'hui. Pas sur que je puisse y rebosser aujourd'hui.
et la fin de semaine risque d'être compliqué, je suis en vacances jeudi soir.
# Plus cool que les jours précédents
Posté par syj . En réponse au message Avent du Code, jour 18. Évalué à 2.
J'ai mis 45min pour les 2 étoiles.
La première étape stockés les cubes dans un HashSet puis compter les faces non adjacente à une autre en checkant la présence dans le HashSet.
Pour la deuxième, j'ai monté un dijkstra en partant d'un espace à l'extérieur à la structure de cube. Au final, je check si le côté du cube est adjacent à une zone accessible depuis l'air.