Files
advent-of-code-go/2015/day25/main.go
T

62 lines
1.5 KiB
Go

package main
import (
"flag"
"fmt"
"regexp"
"strings"
"github.com/alexchao26/advent-of-code-go/cast"
"github.com/alexchao26/advent-of-code-go/util"
)
func main() {
var part int
flag.IntVar(&part, "part", 1, "part 1 or 2")
flag.Parse()
fmt.Println("Running part", part)
ans := letItSnow(util.ReadFile("./input.txt"))
fmt.Println("Output:", ans)
}
func letItSnow(input string) int {
var row, col int
input = strings.ReplaceAll(input, ",", "")
input = strings.ReplaceAll(input, ".", "")
for _, part := range strings.Split(input, " ") {
if regexp.MustCompile("[0-9]").MatchString(part) {
if row == 0 { // jeez i am getting lazy
row = cast.ToInt(part)
} else {
col = cast.ToInt(part)
}
}
}
// the number of iterations to run can be calculated by:
// - finding the number of cells that in the triangle that is formed by each
// diagonal prior to the incomplete one that the target cell is on
// This triangle is generated from adding 1+2+3+4...+(row+col) 0-indexed
// - then the number of iterations for the incomplete diagonal, is equal to
// the current column number (1-indexed)
var triangleBefore int
for i := 1; i <= row+col-2; i++ {
triangleBefore += i
}
numberOnThisDiagonal := col
// subtract one for starting cell
iterations := triangleBefore + numberOnThisDiagonal - 1
// and thankfully this runs quickly
code := 20151125
for i := 0; i < iterations; i++ {
code *= 252533
code %= 33554393
}
return code
}