Posté par syj .
En réponse au message Advent of Code 2023, jour 21.
Évalué à 1.
Dernière modification le 23 décembre 2023 à 02:37.
J'ai implémenté la méthode avec séquence quadratique de Guillaume B.
Je suis un peu décu de ne pas avoir trouvé par moi-même
Mais je suis très heureux d'avoir découvert ce point des maths que je ne connaissais pas.
packageaoc2023;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Scanner;importjava.util.Set;publicclassAoc2023s21s3{publicstaticPoint[]DIRECTIONS=newPoint[]{newPoint(1,0),newPoint(-1,0),newPoint(0,-1),newPoint(0,1)};publicrecordPoint(intx,inty){}publicstaticclassState{Set<Point>current=newHashSet<>();;Set<Point>next=newHashSet<>();;char[][]map;intwidth;intheight;List<Long>quadraticsSeries=newArrayList<>();publicvoidpropagate(Pointp){for(Pointmove:DIRECTIONS){intdx=p.x+move.x;intdy=p.y+move.y;intrx=dx%width;if(rx<0){rx+=width;}intry=dy%height;if(ry<0){ry+=height;}Pointnp=newPoint(dx,dy);if(map[ry][rx]=='.'){next.add(np);}}}publiclongpropagate(Worldworld,intstep){map=world.map;width=world.width;height=world.height;// gridSize d'une taille arbitaire suffisant propage au moins une grille complète (à priori)intgridSize=width*2;// étape pour lesquels on va récupérer les valeurs de u(n) pour la séquence quadratique.intsame=(step-1)%gridSize;intend=same+gridSize*2+1;// Boucle de propagation (très inefficace) System.out.println("Propagation maximum à calculer :"+end);for(inti=0;i<end;i++){next.clear();current.forEach(p->propagate(p));// switchSet<Point>tmp=next;next=current;current=tmp;if(i>=0&&(i%(gridSize))==same){System.out.println("u("+current.size()+") = "+current.size());quadraticsSeries.add((long)current.size());}}longd1=quadraticsSeries.get(1)-quadraticsSeries.get(0);longd2=quadraticsSeries.get(2)-quadraticsSeries.get(1);//long d3 = quadraticsSeries.get(3) - quadraticsSeries.get(2);System.out.println("dp:"+(d2-d1));//System.out.println("dp:" + (d3-d2)); // si la séquence est quadratique d2-d1 == d3-d2 == d4-d3 ...longa=(d2-d1)/2;longc=quadraticsSeries.get(0);// a n^2 + b n + c = u(n) // b = (u(n) - a n^2 - c)/nintn=2;doubleb=(quadraticsSeries.get(n)-a*n*n-c)/n;System.out.println(quadraticsSeries);System.out.println(a+","+b+","+c);/* // Vérifie via la propagation jusqu'à u(3) que la formule u(n) = a*x^2 + bx+c est bien paramétré. n = 3; long control3 = (long)(a * n * n + n * b + c); System.out.println("Control3:" + control3); if(control3 != quadraticsSeries.get(3)) { throw new RuntimeException("Failed to compute u(n) = a*x^2 + bx+c "); }*/n=((step)/gridSize);return(long)(a*n*n+n*b+c);}publicbooleanmatch(intx,inty){returncurrent.contains(newPoint(x,y));}}publicstaticclassWorld{finalintwidth;finalintheight;char[][]map;Statestate=newState();publicWorld(List<String>rows){height=rows.size();width=rows.get(0).length();map=newchar[height][width];for(inty=0;y<height;y++){Stringrow=rows.get(y);for(intx=0;x<width;x++){if(row.charAt(x)=='S'){state.current.add(newPoint(x,y));map[y][x]='.';}else{map[y][x]=row.charAt(x);}}}}}publicstaticvoidmain(String[]args){try(Scannerin=newScanner(Aoc2023s21s3.class.getResourceAsStream("res/t21.txt"))){List<String>rows=newArrayList<>();while(in.hasNext()){rows.add(in.nextLine());}Worldworld=newWorld(rows);System.out.println(world.state.propagate(world,26501365));}}}
# Méthode de Guillaume
Posté par syj . En réponse au message Advent of Code 2023, jour 21. Évalué à 1. Dernière modification le 23 décembre 2023 à 02:37.
J'ai implémenté la méthode avec séquence quadratique de Guillaume B.
Je suis un peu décu de ne pas avoir trouvé par moi-même
Mais je suis très heureux d'avoir découvert ce point des maths que je ne connaissais pas.