mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-06-07 12:45:10 +02:00
might be making a mistake starting 2018...
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
Only change from part1 is adding a decorator to the digit slices to shrink large
|
||||
groups (more than 2 digits) into a single digit. Then pass that into the same
|
||||
checks for a duplicate & all decreasing
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
start, end := 138307, 654504
|
||||
possibleCombinations := 0
|
||||
|
||||
for i := start; i <= end; i++ {
|
||||
digits := shrinkLargeGroups(makeDigitsSlice(i))
|
||||
if isIncreasing(digits) && hasDuplicate(digits) {
|
||||
possibleCombinations++
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println(possibleCombinations)
|
||||
}
|
||||
|
||||
func makeDigitsSlice(num int) []int {
|
||||
result := make([]int, 6)
|
||||
for i := 5; num > 0; i-- {
|
||||
result[i] = num % 10
|
||||
num -= num % 10
|
||||
num /= 10
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/*
|
||||
shrinkLargeGroups will return a new slice with any groups larger than 2 shrinked
|
||||
down to 1. e.g. 111223 -> 1223
|
||||
*/
|
||||
func shrinkLargeGroups(digits []int) []int {
|
||||
// from start of number & ensure i+2 is within bounds of the digits slice
|
||||
for i := 0; i+2 < len(digits); i++ {
|
||||
if digits[i] == digits[i+1] && digits[i] == digits[i+2] {
|
||||
// figure out how many items to remove
|
||||
removeUpTo := i + 1
|
||||
for removeUpTo < len(digits) && digits[i] == digits[removeUpTo] {
|
||||
removeUpTo++
|
||||
}
|
||||
|
||||
// copy the values into a new slice
|
||||
newSli := make([]int, 0)
|
||||
for j := 0; j <= i; j++ {
|
||||
newSli = append(newSli, digits[j])
|
||||
}
|
||||
for removeUpTo < len(digits) {
|
||||
newSli = append(newSli, digits[removeUpTo])
|
||||
removeUpTo++
|
||||
}
|
||||
digits = newSli
|
||||
}
|
||||
}
|
||||
return digits
|
||||
}
|
||||
|
||||
func isIncreasing(digits []int) bool {
|
||||
for i := 1; i < len(digits); i++ {
|
||||
if digits[i] < digits[i-1] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func hasDuplicate(digits []int) bool {
|
||||
for i := 1; i < len(digits); i++ {
|
||||
if digits[i-1] == digits[i] {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user