| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package main
- import (
- "bufio"
- "fmt"
- "os"
- )
- type coord struct {
- x,y,nb_neighbors int
-
- }
- func update_neighbors_insertion(positions* []*coord, i,j int) int{
- nbn := 0
- for _, paper_roll := range *positions {
- switch(paper_roll.x){
- case i:
- switch(paper_roll.y){
- case j-1, j+1:
- nbn++
- paper_roll.nb_neighbors++
- }
- case i-1, i+1:
- switch(paper_roll.y){
- case j-1,j,j+1:
- nbn++
- paper_roll.nb_neighbors++
- }
- }
- }
- return nbn
- }
- func continue_removing(positions* []*coord){
- for i:=0; i < len(*positions); {
- paper_roll := (*positions)[i]
- if paper_roll.nb_neighbors < 4 {
- (*positions)[i] = (*positions)[len(*positions)-1]
- (*positions)[len(*positions)-1] = nil
- *positions = (*positions)[:len(*positions)-1]
- } else {
- i++
- }
- }
- }
- func main() {
- fmt.Println("Advent of Code 2025 - Day 4 - Part 2")
- f,_ := os.Open("4/input")
- defer f.Close()
- var positions []*coord
- scanner := bufio.NewScanner(f)
- line_num := 0
- for scanner.Scan() {
- line := scanner.Text()
- for i:= 0; i < len(line); i++{
- if line[i] == '@'{
- nbn := update_neighbors_insertion(&positions,line_num,i)
- positions = append(positions, &coord{line_num,i,nbn})
- }
- }
- line_num++
- }
-
- paper_rolls_pre := len(positions)
-
- for {
- loop_entry_paper_rolls := len(positions)
- // remove paper_rolls with less than 4 neighbors
- continue_removing(&positions)
- update_neighbors_after_removal(&positions)
- // if nothing was removed break from loop
- if loop_entry_paper_rolls == len(positions) {
- break
- }
- }
- fmt.Println(paper_rolls_pre - len(positions))
- }
- func update_neighbors_after_removal(positions* []*coord){
- // reset nb_neighbors
- for _, paper_roll := range *positions{
- paper_roll.nb_neighbors = 0
- }
-
- // update nb_neighbors
- for _, paper_roll := range *positions{
- x,y := paper_roll.x, paper_roll.y
- for _, npar := range *positions {
- if &npar != &paper_roll{
- switch(npar.x){
- case x+1, x-1:
- switch(npar.y){
- case y, y+1, y-1:
- paper_roll.nb_neighbors++
- }
- case x:
- switch(npar.y){
- case y+1, y-1:
- paper_roll.nb_neighbors++
- }
- }
- }
- }
- }
- }
|