2018 day 19 complete
This commit is contained in:
parent
9e2be89e23
commit
ba9d79b98f
@ -12,19 +12,19 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
input := stdinToStringSlice()
|
input := stdinToStringSlice()
|
||||||
part1(input)
|
//part1(input)
|
||||||
|
part2(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
func part1(input []string) {
|
func part1(input []string) {
|
||||||
vpc := NewState()
|
vpc := NewState()
|
||||||
vpc.reg[0] = 1
|
|
||||||
if strings.HasPrefix(input[0], "#ip") {
|
if strings.HasPrefix(input[0], "#ip") {
|
||||||
// Binding the ip to a register...
|
// Binding the ip to a register...
|
||||||
pts := strings.Split(input[0], " ")
|
pts := strings.Split(input[0], " ")
|
||||||
vpc.ipReg = Atoi(pts[1])
|
vpc.ipReg = Atoi(pts[1])
|
||||||
input = input[1:]
|
input = input[1:]
|
||||||
}
|
}
|
||||||
for i := 0; i < 1000000; i++ {
|
for i := 0; i < 200; i++ {
|
||||||
if vpc.ip >= len(input) {
|
if vpc.ip >= len(input) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -33,7 +33,9 @@ func part1(input []string) {
|
|||||||
if vpc.ipReg > -1 {
|
if vpc.ipReg > -1 {
|
||||||
vpc.reg[vpc.ipReg] = vpc.ip
|
vpc.reg[vpc.ipReg] = vpc.ip
|
||||||
}
|
}
|
||||||
|
fmt.Print(vpc.string(), " -> ", op, " ", cmd, " -> ")
|
||||||
vpc.run(op, cmd)
|
vpc.run(op, cmd)
|
||||||
|
fmt.Println(vpc.string())
|
||||||
vpc.ip = vpc.reg[vpc.ipReg]
|
vpc.ip = vpc.reg[vpc.ipReg]
|
||||||
}
|
}
|
||||||
vpc.ip++
|
vpc.ip++
|
||||||
@ -41,6 +43,44 @@ func part1(input []string) {
|
|||||||
fmt.Println(vpc.string())
|
fmt.Println(vpc.string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func part2(input []string) {
|
||||||
|
vpc := NewState()
|
||||||
|
vpc.reg[0] = 1
|
||||||
|
if strings.HasPrefix(input[0], "#ip") {
|
||||||
|
// Binding the ip to a register...
|
||||||
|
pts := strings.Split(input[0], " ")
|
||||||
|
vpc.ipReg = Atoi(pts[1])
|
||||||
|
input = input[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
if vpc.ip >= len(input) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if vpc.ip == 3 {
|
||||||
|
// When ip == 3, we kick off the loop.
|
||||||
|
// Looks like it's just summing the divisors of the value in register 2
|
||||||
|
divisors := getDivisors(vpc.reg[2])
|
||||||
|
fmt.Println(divisors)
|
||||||
|
fmt.Println(sum(divisors))
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
// Normal Execution
|
||||||
|
inp := input[vpc.ip]
|
||||||
|
if op, cmd, err := vpc.parseCommand(inp); err == nil {
|
||||||
|
if vpc.ipReg > -1 {
|
||||||
|
vpc.reg[vpc.ipReg] = vpc.ip
|
||||||
|
}
|
||||||
|
fmt.Print(vpc.string(), " -> ", op, " ", cmd, " -> ")
|
||||||
|
vpc.run(op, cmd)
|
||||||
|
fmt.Println(vpc.string())
|
||||||
|
vpc.ip = vpc.reg[vpc.ipReg]
|
||||||
|
}
|
||||||
|
vpc.ip++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type State struct {
|
type State struct {
|
||||||
ip, ipReg int
|
ip, ipReg int
|
||||||
reg [6]int
|
reg [6]int
|
||||||
@ -178,6 +218,25 @@ func boolToInt(v bool) int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDivisors(n int) []int {
|
||||||
|
ret := []int{n}
|
||||||
|
for i := 1; i < (n / 2); i++ {
|
||||||
|
if n%i == 0 {
|
||||||
|
ret = append(ret, i)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func sum(vals []int) int {
|
||||||
|
var ret int
|
||||||
|
for _, v := range vals {
|
||||||
|
ret += v
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
func stdinToStringSlice() []string {
|
func stdinToStringSlice() []string {
|
||||||
var input []string
|
var input []string
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
Loading…
Reference in New Issue
Block a user