aoc2024/day-22/internal/randomiser/randomiser.go

44 lines
615 B
Go
Raw Permalink Normal View History

2024-12-22 16:54:03 +00:00
package randomiser
type Randomiser struct {
secret int
}
func New(secret int) *Randomiser {
return &Randomiser{secret: secret}
}
func (r *Randomiser) multiplyBy(n int) int {
return r.secret * n
}
func (r *Randomiser) divideBy(n int) int {
return r.secret / n
}
func (r *Randomiser) mix(a int) {
r.secret ^= a
}
func (r *Randomiser) prune() {
r.secret %= 16777216
}
func (r *Randomiser) Randomise() {
res := r.multiplyBy(64)
r.mix(res)
r.prune()
res = r.divideBy(32)
r.mix(res)
r.prune()
res = r.multiplyBy(2048)
r.mix(res)
r.prune()
}
func (r *Randomiser) Secret() int {
return r.secret
}