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