2017 Day 18 Complete!
This commit is contained in:
parent
2a79811b20
commit
2a4227f39b
150
2017/day18/day18.go
Normal file
150
2017/day18/day18.go
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"strconv"
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
//"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var sendCount [2]int
|
||||||
|
var chanCount [2]int
|
||||||
|
func main() {
|
||||||
|
inp := StdinToStrings()
|
||||||
|
// Part 2
|
||||||
|
progAChan := make(chan int, 100000)
|
||||||
|
progBChan := make(chan int, 100000)
|
||||||
|
go run(inp, 0, progAChan, progBChan)
|
||||||
|
run(inp, 1, progBChan, progAChan)
|
||||||
|
// Part 1
|
||||||
|
//runPart1(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
var reg [2]map[string]int
|
||||||
|
|
||||||
|
func run(inp []string, pId int, input, output chan int) {
|
||||||
|
reg[pId] = make(map[string]int)
|
||||||
|
// Default register p to the process id
|
||||||
|
reg[pId]["p"] = pId
|
||||||
|
|
||||||
|
for i := 0; i >= 0 && i < len(inp); i++ {
|
||||||
|
fmt.Println(pId, ":", inp[i])
|
||||||
|
pts := strings.Split(inp[i], " ")
|
||||||
|
switch(pts[0]) {
|
||||||
|
case "snd": send(pId, pts[1], output)
|
||||||
|
case "set": setReg(pId, pts[1], pts[2])
|
||||||
|
case "add": addReg(pId, pts[1], pts[2])
|
||||||
|
case "mul": mulReg(pId, pts[1], pts[2])
|
||||||
|
case "mod": modReg(pId, pts[1], pts[2])
|
||||||
|
case "rcv": receive(pId, pts[1], input)
|
||||||
|
case "jgz": i += jumpIfPos(pId, pts[1], pts[2])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(output)
|
||||||
|
}
|
||||||
|
|
||||||
|
func send(pId int, key string, out chan int) {
|
||||||
|
sendCount[pId]++
|
||||||
|
if pId == 0 {
|
||||||
|
chanCount[1]++
|
||||||
|
} else {
|
||||||
|
chanCount[0]++
|
||||||
|
}
|
||||||
|
out <- getValue(pId, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func receive(pId int, key string, in chan int) {
|
||||||
|
fmt.Println("SENDS:",sendCount)
|
||||||
|
reg[pId][key] = <-in
|
||||||
|
chanCount[pId]--
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Part 1 Specifics */
|
||||||
|
var lastSound int
|
||||||
|
func runPart1(inp []string) {
|
||||||
|
reg[0] = make(map[string]int)
|
||||||
|
printRegisters(0)
|
||||||
|
for i := 0; i >= 0 && i < len(inp); i++ {
|
||||||
|
pts := strings.Split(inp[i], " ")
|
||||||
|
switch(pts[0]) {
|
||||||
|
case "snd": playSound(0, pts[1])
|
||||||
|
case "set": setReg(0, pts[1], pts[2])
|
||||||
|
case "add": addReg(0, pts[1], pts[2])
|
||||||
|
case "mul": mulReg(0, pts[1], pts[2])
|
||||||
|
case "mod": modReg(0, pts[1], pts[2])
|
||||||
|
case "rcv": recoverSound(0, pts[1])
|
||||||
|
case "jgz": i += jumpIfPos(0, pts[1], pts[2])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func playSound(pId int, freq string) {
|
||||||
|
lastSound = getValue(pId, freq)
|
||||||
|
fmt.Println("*BEEP* (",lastSound,")")
|
||||||
|
}
|
||||||
|
|
||||||
|
func recoverSound(pId int, test string) {
|
||||||
|
if getValue(pId, test) != 0 {
|
||||||
|
playSound(pId, fmt.Sprint(lastSound))
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setReg(pId int, key string, val string) {
|
||||||
|
reg[pId][key] = getValue(pId, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addReg(pId int, key string, val string) {
|
||||||
|
reg[pId][key] = getValue(pId, key) + getValue(pId, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mulReg(pId int, key string, val string) {
|
||||||
|
reg[pId][key] = getValue(pId, key) * getValue(pId, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func modReg(pId int, key string, val string) {
|
||||||
|
reg[pId][key] = getValue(pId, key) % getValue(pId, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func jumpIfPos(pId int, test string, jump string) int {
|
||||||
|
var ret int
|
||||||
|
if getValue(pId, test) > 0 {
|
||||||
|
ret = getValue(pId, jump) - 1
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func getValue(pId int, key string) int {
|
||||||
|
var ret int
|
||||||
|
var ok bool
|
||||||
|
var err error
|
||||||
|
if ret, err = strconv.Atoi(key); err != nil {
|
||||||
|
// It's not a number
|
||||||
|
if ret, ok = reg[pId][key]; !ok {
|
||||||
|
// The register is empty
|
||||||
|
reg[pId][key] = 0
|
||||||
|
ret = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func printRegisters(pId int) {
|
||||||
|
fmt.Print(pId,": [ ")
|
||||||
|
for i := 0; i < 26; i++ {
|
||||||
|
getReg := string('a'+i)
|
||||||
|
fmt.Printf("%s:%d ", getReg, getValue(pId, getReg))
|
||||||
|
}
|
||||||
|
fmt.Print("]\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func StdinToStrings() []string {
|
||||||
|
var input []string
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
for scanner.Scan() {
|
||||||
|
input = append(input, scanner.Text())
|
||||||
|
}
|
||||||
|
return input
|
||||||
|
}
|
41
2017/day18/input
Normal file
41
2017/day18/input
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
set i 31
|
||||||
|
set a 1
|
||||||
|
mul p 17
|
||||||
|
jgz p p
|
||||||
|
mul a 2
|
||||||
|
add i -1
|
||||||
|
jgz i -2
|
||||||
|
add a -1
|
||||||
|
set i 127
|
||||||
|
set p 464
|
||||||
|
mul p 8505
|
||||||
|
mod p a
|
||||||
|
mul p 129749
|
||||||
|
add p 12345
|
||||||
|
mod p a
|
||||||
|
set b p
|
||||||
|
mod b 10000
|
||||||
|
snd b
|
||||||
|
add i -1
|
||||||
|
jgz i -9
|
||||||
|
jgz a 3
|
||||||
|
rcv b
|
||||||
|
jgz b -1
|
||||||
|
set f 0
|
||||||
|
set i 126
|
||||||
|
rcv a
|
||||||
|
rcv b
|
||||||
|
set p a
|
||||||
|
mul p -1
|
||||||
|
add p b
|
||||||
|
jgz p 4
|
||||||
|
snd a
|
||||||
|
set a b
|
||||||
|
jgz 1 3
|
||||||
|
snd b
|
||||||
|
set f 1
|
||||||
|
add i -1
|
||||||
|
jgz i -11
|
||||||
|
snd a
|
||||||
|
jgz f -16
|
||||||
|
jgz a -19
|
10
2017/day18/testinput
Normal file
10
2017/day18/testinput
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
set a 1
|
||||||
|
add a 2
|
||||||
|
mul a a
|
||||||
|
mod a 5
|
||||||
|
snd a
|
||||||
|
set a 0
|
||||||
|
rcv a
|
||||||
|
jgz a -1
|
||||||
|
set a 1
|
||||||
|
jgz a -2
|
7
2017/day18/testinput2
Normal file
7
2017/day18/testinput2
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
snd 1
|
||||||
|
snd 2
|
||||||
|
snd p
|
||||||
|
rcv a
|
||||||
|
rcv b
|
||||||
|
rcv c
|
||||||
|
rcv d
|
Loading…
Reference in New Issue
Block a user