4 changed files with 1506 additions and 0 deletions
			
			
		| @ -0,0 +1,99 @@ | |||
| package adventoc2024 | |||
| 
 | |||
| import ( | |||
| 	"bufio" | |||
| 	"io" | |||
| 	"slices" | |||
| 	"sort" | |||
| 	"strings" | |||
| ) | |||
| 
 | |||
| type Day5 struct{} | |||
| 
 | |||
| func (d Day5) Part1(r io.Reader) string { | |||
| 	s := bufio.NewScanner(r) | |||
| 	before := make(map[int][]int, 100) | |||
| 	var sum int | |||
| 
 | |||
| 	var updates bool | |||
| Scan: | |||
| 	for s.Scan() { | |||
| 		updates = updates || s.Text() == "" | |||
| 
 | |||
| 		if !updates { | |||
| 			s1, s2, _ := strings.Cut(s.Text(), "|") | |||
| 			i, j := atoi(s1), atoi(s2) | |||
| 			before[j] = append(before[j], i) | |||
| 		} else if s.Text() != "" { | |||
| 			pages := strings.Split(s.Text(), ",") | |||
| 			var v1, v2 int | |||
| 			for i := range pages { | |||
| 				v1 = atoi(pages[i]) | |||
| 
 | |||
| 				for j := range pages[i+1:] { | |||
| 					v2 = atoi(pages[i+j+1]) | |||
| 					for _, mustbefore := range before[v1] { | |||
| 						if mustbefore == v2 { | |||
| 							continue Scan | |||
| 						} | |||
| 					} | |||
| 				} | |||
| 			} | |||
| 			sum += atoi(pages[(len(pages)-1)/2]) | |||
| 		} | |||
| 	} | |||
| 
 | |||
| 	return printi(sum) | |||
| } | |||
| 
 | |||
| func (d Day5) Part2(r io.Reader) string { | |||
| 	s := bufio.NewScanner(r) | |||
| 	before := make(map[int][]int, 100) | |||
| 	var sum int | |||
| 
 | |||
| 	var updates bool | |||
| 	for s.Scan() { | |||
| 		updates = updates || s.Text() == "" | |||
| 
 | |||
| 		if !updates { | |||
| 			s1, s2, _ := strings.Cut(s.Text(), "|") | |||
| 			i, j := atoi(s1), atoi(s2) | |||
| 			before[j] = append(before[j], i) | |||
| 		} else if s.Text() != "" { | |||
| 			pages := strings.Split(s.Text(), ",") | |||
| 			pageNums := make([]int, len(pages)) | |||
| 			pageCopy := make([]int, len(pages)) | |||
| 
 | |||
| 			for i := range pages { | |||
| 				pageNums[i], pageCopy[i] = atoi(pages[i]), atoi(pages[i]) | |||
| 			} | |||
| 
 | |||
| 			sortPages(pageNums, before) | |||
| 			if !slices.Equal(pageNums, pageCopy) { | |||
| 				sum += middlePage(pageNums) | |||
| 			} | |||
| 		} | |||
| 	} | |||
| 
 | |||
| 	return printi(sum) | |||
| } | |||
| 
 | |||
| func sortPages(update []int, before map[int][]int) { | |||
| 	sort.Slice(update, func(i, j int) bool { | |||
| 		v1 := update[i] | |||
| 		v2 := update[j] | |||
| 
 | |||
| 		search := before[v1] | |||
| 		for k := range search { | |||
| 			if search[k] == v2 { | |||
| 				return false | |||
| 			} | |||
| 		} | |||
| 
 | |||
| 		return true | |||
| 	}) | |||
| } | |||
| 
 | |||
| func middlePage(pages []int) int { | |||
| 	return pages[(len(pages)-1)/2] | |||
| } | |||
								
									
										File diff suppressed because it is too large
									
								
							
						
					
					Loading…
					
					
				
		Reference in new issue