69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package day11
|
|
|
|
import (
|
|
"fmt"
|
|
"tools"
|
|
)
|
|
|
|
func incrementPassword(password []byte) {
|
|
allFine := false
|
|
index := len(password) - 1
|
|
for !allFine {
|
|
password[index]++
|
|
if password[index] > 122 {
|
|
password[index] = 'a'
|
|
index--
|
|
} else {
|
|
allFine = true
|
|
}
|
|
}
|
|
}
|
|
|
|
func checkPasswordValid(password []byte) bool {
|
|
ascendingTripple := false
|
|
firstDouble := 0
|
|
doubleDouble := false
|
|
for i := 0; i < len(password); i++ {
|
|
if password[i] == 'i' || password[i] == 'o' || password[i] == 'l' {
|
|
return false
|
|
}
|
|
if !ascendingTripple && i < len(password)-3 {
|
|
if password[i] == password[i+1]-1 && password[i+1] == password[i+2]-1 {
|
|
ascendingTripple = true
|
|
}
|
|
}
|
|
if !doubleDouble && i > 0 {
|
|
if password[i] == password[i-1] {
|
|
if firstDouble > 0 && firstDouble+2 < i {
|
|
doubleDouble = true
|
|
} else {
|
|
firstDouble = i
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return ascendingTripple && doubleDouble
|
|
}
|
|
|
|
func Part1(puzzle tools.AoCPuzzle) interface{} {
|
|
currentPassword := []byte(puzzle.GetInputArray()[0])
|
|
|
|
for !checkPasswordValid(currentPassword) {
|
|
incrementPassword(currentPassword)
|
|
}
|
|
|
|
return fmt.Sprintf("%s", string(currentPassword))
|
|
}
|
|
|
|
func Part2(puzzle tools.AoCPuzzle) interface{} {
|
|
currentPassword := []byte(Part1(puzzle).(string))
|
|
|
|
incrementPassword(currentPassword)
|
|
for !checkPasswordValid(currentPassword) {
|
|
incrementPassword(currentPassword)
|
|
}
|
|
|
|
return fmt.Sprintf("%s", string(currentPassword))
|
|
}
|