|
@@ -109,6 +109,68 @@ func sumBad() int {
|
|
|
return sum
|
|
|
}
|
|
|
|
|
|
+func checkRuleOnField(currentRule rule, field int) bool {
|
|
|
+ if (field >= currentRule.firstSegment[0] && field <= currentRule.firstSegment[1]) || (field >= currentRule.secondSegment[0] && field <= currentRule.secondSegment[1]) {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+var fieldsAndRules []int
|
|
|
+
|
|
|
+func ruleTaken(ruleID int) bool {
|
|
|
+ for _, item := range fieldsAndRules {
|
|
|
+ if item == ruleID {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+func establishOrder() {
|
|
|
+ numberOfFields := len(validTickets[0])
|
|
|
+ numberOfRules := len(rules)
|
|
|
+
|
|
|
+ for i := 0; i < numberOfFields; i++ {
|
|
|
+ j := 0
|
|
|
+ for ; j < numberOfRules; j++ {
|
|
|
+ if ruleTaken(j) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ ruleValid := true
|
|
|
+ for _, item := range validTickets {
|
|
|
+ if !checkRuleOnField(rules[j], item[i]) {
|
|
|
+ ruleValid = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ruleValid {
|
|
|
+ fieldsAndRules = append(fieldsAndRules, j)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func checkMyTicket() int {
|
|
|
+ myTicket := tickets[0]
|
|
|
+
|
|
|
+ result := 1
|
|
|
+ for i, ruleID := range fieldsAndRules {
|
|
|
+ if !strings.Contains(rules[ruleID].name, "departure") {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ result *= myTicket[i]
|
|
|
+ }
|
|
|
+
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
func main() {
|
|
|
if len(os.Args) < 2 {
|
|
|
log.Fatal("You need to specify a file!")
|
|
@@ -127,5 +189,7 @@ func main() {
|
|
|
}
|
|
|
|
|
|
fmt.Println("Part1:", sumBad())
|
|
|
- fmt.Println(validTickets)
|
|
|
+
|
|
|
+ establishOrder()
|
|
|
+ fmt.Println("Part2:", checkMyTicket())
|
|
|
}
|