chore: add day 19 pt 1 #15
							
								
								
									
										122
									
								
								day19/main.go
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								day19/main.go
									
									
									
									
									
								
							@ -15,7 +15,7 @@ func main() { aoc.MustResult(aoc.Runner(run)) }
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type result struct {
 | 
					type result struct {
 | 
				
			||||||
	valuePT1 int
 | 
						valuePT1 int
 | 
				
			||||||
	valuePT2 int
 | 
						valuePT2 uint
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r result) String() string { return fmt.Sprintf("%#v", r) }
 | 
					func (r result) String() string { return fmt.Sprintf("%#v", r) }
 | 
				
			||||||
@ -44,6 +44,7 @@ func run(scan *bufio.Scanner) (*result, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var result result
 | 
						var result result
 | 
				
			||||||
	result.valuePT1 = solveWorkflow(parts, workflows)
 | 
						result.valuePT1 = solveWorkflow(parts, workflows)
 | 
				
			||||||
 | 
						result.valuePT2 = solveRanges(workflows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &result, nil
 | 
						return &result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -143,7 +144,7 @@ func (r rule) Match(p part) bool {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func solveWorkflow(parts []part, workflows map[string][]rule) int {
 | 
					func solveWorkflow(parts []part, workflows map[string][]rule) int {
 | 
				
			||||||
	var rejected []part
 | 
						// var rejected []part
 | 
				
			||||||
	var accepted []part
 | 
						var accepted []part
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, p := range parts {
 | 
						for _, p := range parts {
 | 
				
			||||||
@ -163,7 +164,7 @@ func solveWorkflow(parts []part, workflows map[string][]rule) int {
 | 
				
			|||||||
					break nextStep
 | 
										break nextStep
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if workflow == "R" {
 | 
									if workflow == "R" {
 | 
				
			||||||
					rejected = append(rejected, p)
 | 
										// rejected = append(rejected, p)
 | 
				
			||||||
					workflow = ""
 | 
										workflow = ""
 | 
				
			||||||
					break nextStep
 | 
										break nextStep
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@ -173,9 +174,6 @@ func solveWorkflow(parts []part, workflows map[string][]rule) int {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Println("accepted", accepted)
 | 
					 | 
				
			||||||
	fmt.Println("rejected", rejected)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sum := 0
 | 
						sum := 0
 | 
				
			||||||
	for _, p := range accepted {
 | 
						for _, p := range accepted {
 | 
				
			||||||
		sum += p.x
 | 
							sum += p.x
 | 
				
			||||||
@ -186,70 +184,72 @@ func solveWorkflow(parts []part, workflows map[string][]rule) int {
 | 
				
			|||||||
	return sum
 | 
						return sum
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					func solveRanges(workflows map[string][]rule) uint {
 | 
				
			||||||
in{s<1351:px, s>=1351:qqz}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
--> px{a<2006&&(x<1416||x>2662):A, a<2006&&x>=1416&&x<=2662:R, m>2090:A, a>=2006&&m<=2090&&s<537:R||x>2440:R, a>=2006&&m<=2090&&s<537&x<=2440:A}
 | 
						pq := aoc.PriorityQueue(func(a, b queue) bool { return false })
 | 
				
			||||||
 | 
						pq.Enqueue(queue{
 | 
				
			||||||
 | 
							"in",
 | 
				
			||||||
 | 
							block{
 | 
				
			||||||
 | 
								ranger{1, 4000},
 | 
				
			||||||
 | 
								ranger{1, 4000},
 | 
				
			||||||
 | 
								ranger{1, 4000},
 | 
				
			||||||
 | 
								ranger{1, 4000},
 | 
				
			||||||
 | 
							}})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--> qqz{s>2770:A, m<1801&&m>838:A, m<1801&&a>1716:R, m<1801&&a<=1716:A, s<=2770&&m>=1801:R}
 | 
						var accepted []block
 | 
				
			||||||
 | 
						// var rejected []block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for !pq.IsEmpty() {
 | 
				
			||||||
 | 
							current, _ := pq.Dequeue()
 | 
				
			||||||
 | 
							for _, rule := range workflows[current.name] {
 | 
				
			||||||
 | 
								next := queue{name: rule.queue, block: current.block}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch rule.match {
 | 
				
			||||||
 | 
								case "x":
 | 
				
			||||||
 | 
									current.x, next.x = split(current.x, rule.value, rule.op == ">")
 | 
				
			||||||
 | 
								case "m":
 | 
				
			||||||
 | 
									current.m, next.m = split(current.m, rule.value, rule.op == ">")
 | 
				
			||||||
 | 
								case "a":
 | 
				
			||||||
 | 
									current.a, next.a = split(current.a, rule.value, rule.op == ">")
 | 
				
			||||||
 | 
								case "s":
 | 
				
			||||||
 | 
									current.s, next.s = split(current.s, rule.value, rule.op == ">")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch next.name {
 | 
				
			||||||
 | 
								case "R":
 | 
				
			||||||
 | 
									// rejected = append(rejected, next.block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								case "A":
 | 
				
			||||||
 | 
									accepted = append(accepted, next.block)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									pq.Enqueue(next)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var sum uint
 | 
				
			||||||
 | 
						for _, a := range accepted {
 | 
				
			||||||
 | 
							sum += uint((a.x[1]-a.x[0]+1) * (a.m[1]-a.m[0]+1) * (a.a[1]-a.a[0]+1) * (a.s[1]-a.s[0]+1))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
in [/]
 | 
						return sum
 | 
				
			||||||
--
 | 
					}
 | 
				
			||||||
s<1351 -> px
 | 
					 | 
				
			||||||
s>=1351 -> qqz
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
px [/]
 | 
					type ranger [2]int
 | 
				
			||||||
--
 | 
					type block struct {
 | 
				
			||||||
s<1351 -> px
 | 
						x, m, a, s ranger
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					type queue struct {
 | 
				
			||||||
 | 
						name string
 | 
				
			||||||
 | 
						block
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
a< 2006  -> qkq
 | 
					func split(a ranger, n int, gt bool) (current ranger, next ranger) {
 | 
				
			||||||
m> 2090  -> A
 | 
						if gt { // x > N => [0,N] [N++,inf]
 | 
				
			||||||
a>=2006 -> ...
 | 
							return ranger{a[0], n}, ranger{n + 1, a[1]}
 | 
				
			||||||
m<=2090 -> rfg
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qqz [ ]
 | 
						// x < N => [N,inf] [0,N--]
 | 
				
			||||||
--
 | 
						return ranger{n, a[1]}, ranger{a[0], n - 1}
 | 
				
			||||||
s>=1351 -> qqz
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
s> 2770 -> qs
 | 
					 | 
				
			||||||
m< 1801 -> hdj
 | 
					 | 
				
			||||||
 -> R
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
qkq [ ]
 | 
					 | 
				
			||||||
--
 | 
					 | 
				
			||||||
s< 1351 ->
 | 
					 | 
				
			||||||
a< 2006 ->
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
x< 1416 -> A
 | 
					 | 
				
			||||||
x>=1416 -> crn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rfg [ ]
 | 
					 | 
				
			||||||
--
 | 
					 | 
				
			||||||
s< 1351 -> px
 | 
					 | 
				
			||||||
a>=2006 ->...
 | 
					 | 
				
			||||||
m<=2090 -> rfg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
s<  537 -> gd
 | 
					 | 
				
			||||||
x> 2440 -> R
 | 
					 | 
				
			||||||
s>= 537 ->...
 | 
					 | 
				
			||||||
x<=2440 -> A
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
crn [ ]
 | 
					 | 
				
			||||||
--
 | 
					 | 
				
			||||||
s< 1351 -> px
 | 
					 | 
				
			||||||
a< 2006 -> qkq
 | 
					 | 
				
			||||||
x>=1416 -> crn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
x> 2662 -> A
 | 
					 | 
				
			||||||
x<=2662 -> R
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
A
 | 
					 | 
				
			||||||
--
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@ func TestExample(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	t.Log(result)
 | 
						t.Log(result)
 | 
				
			||||||
	is.Equal(result.valuePT1, 19114)
 | 
						is.Equal(result.valuePT1, 19114)
 | 
				
			||||||
	is.Equal(result.valuePT2, 0)
 | 
						is.Equal(result.valuePT2, uint(167409079868000))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSolution(t *testing.T) {
 | 
					func TestSolution(t *testing.T) {
 | 
				
			||||||
@ -37,5 +37,5 @@ func TestSolution(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	t.Log(result)
 | 
						t.Log(result)
 | 
				
			||||||
	is.Equal(result.valuePT1, 377025)
 | 
						is.Equal(result.valuePT1, 377025)
 | 
				
			||||||
	is.Equal(result.valuePT2, 0)
 | 
						is.Equal(result.valuePT2, uint(135506683246673))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user