Browse Source

Less embarrassing solution

Piotr Czajkowski 3 years ago
parent
commit
0217177063
1 changed files with 22 additions and 14 deletions
  1. 22 14
      day16/day16.go

+ 22 - 14
day16/day16.go

@@ -122,7 +122,7 @@ func checkRuleOnField(currentRule rule, field int) bool {
 type fieldRules struct {
 	id    int
 	size  int
-	rules []rule
+	rules []string
 }
 
 type bySize []fieldRules
@@ -133,7 +133,7 @@ func (a bySize) Less(i, j int) bool { return a[i].size < a[j].size }
 
 type fieldRule struct {
 	id         int
-	mappedRule rule
+	mappedRule string
 }
 
 var mapping []fieldRule
@@ -142,7 +142,7 @@ func notTaken(item fieldRules) {
 	for _, currentRule := range item.rules {
 		new := true
 		for _, takenRule := range mapping {
-			if currentRule.name == takenRule.mappedRule.name {
+			if currentRule == takenRule.mappedRule {
 				new = false
 				break
 			}
@@ -158,21 +158,29 @@ func notTaken(item fieldRules) {
 
 func establishOrder() {
 	numberOfFields := len(rules)
+	numberOfValidTickets := len(validTickets)
 	var rulesByField []fieldRules
 
-	for i := 0; i < numberOfFields; i++ {
-		current := fieldRules{id: i, size: 0}
-		for _, currentRule := range rules {
-			ruleValid := true
-			for _, item := range validTickets {
-				if !checkRuleOnField(currentRule, item[i]) {
-					ruleValid = false
-					break
+	validForField := make([]map[string]int, numberOfFields)
+	for i, _ := range validForField {
+		validForField[i] = make(map[string]int)
+	}
+
+	for _, item := range validTickets {
+		for i := 0; i < numberOfFields; i++ {
+			for _, currentRule := range rules {
+				if checkRuleOnField(currentRule, item[i]) {
+					validForField[i][currentRule.name]++
 				}
 			}
+		}
+	}
 
-			if ruleValid {
-				current.rules = append(current.rules, currentRule)
+	for i, item := range validForField {
+		current := fieldRules{id: i, size: 0}
+		for key, value := range item {
+			if value == numberOfValidTickets {
+				current.rules = append(current.rules, key)
 				current.size++
 			}
 		}
@@ -190,7 +198,7 @@ func checkMyTicket() int {
 
 	result := 1
 	for _, currentRule := range mapping {
-		if !strings.Contains(currentRule.mappedRule.name, "departure") {
+		if !strings.Contains(currentRule.mappedRule, "departure") {
 			continue
 		}