diff --git a/2019/day23-scratch/day23-scratch b/2019/day23-scratch/day23-scratch new file mode 100755 index 0000000..cd63a9f Binary files /dev/null and b/2019/day23-scratch/day23-scratch differ diff --git a/2019/day23-scratch/input b/2019/day23-scratch/input new file mode 100644 index 0000000..c384e82 --- /dev/null +++ b/2019/day23-scratch/input @@ -0,0 +1 @@ +3,62,1001,62,11,10,109,2241,105,1,0,1526,798,2012,1254,1054,1460,953,889,1975,1732,672,1190,2078,1157,2181,604,701,1295,1225,1326,1802,1493,1833,2113,1691,2144,1425,829,1942,1359,2045,1122,767,1567,1394,922,860,1660,990,732,1629,635,1023,1598,1091,2210,1878,1765,1909,571,0,0,0,0,0,0,0,0,0,0,0,0,3,64,1008,64,-1,62,1006,62,88,1006,61,170,1105,1,73,3,65,21002,64,1,1,20102,1,66,2,21101,105,0,0,1105,1,436,1201,1,-1,64,1007,64,0,62,1005,62,73,7,64,67,62,1006,62,73,1002,64,2,133,1,133,68,133,102,1,0,62,1001,133,1,140,8,0,65,63,2,63,62,62,1005,62,73,1002,64,2,161,1,161,68,161,1102,1,1,0,1001,161,1,169,1001,65,0,0,1102,1,1,61,1102,0,1,63,7,63,67,62,1006,62,203,1002,63,2,194,1,68,194,194,1006,0,73,1001,63,1,63,1106,0,178,21101,210,0,0,106,0,69,2101,0,1,70,1102,1,0,63,7,63,71,62,1006,62,250,1002,63,2,234,1,72,234,234,4,0,101,1,234,240,4,0,4,70,1001,63,1,63,1105,1,218,1106,0,73,109,4,21101,0,0,-3,21102,1,0,-2,20207,-2,67,-1,1206,-1,293,1202,-2,2,283,101,1,283,283,1,68,283,283,22001,0,-3,-3,21201,-2,1,-2,1105,1,263,22102,1,-3,-3,109,-4,2106,0,0,109,4,21101,0,1,-3,21102,0,1,-2,20207,-2,67,-1,1206,-1,342,1202,-2,2,332,101,1,332,332,1,68,332,332,22002,0,-3,-3,21201,-2,1,-2,1106,0,312,21202,-3,1,-3,109,-4,2105,1,0,109,1,101,1,68,359,20101,0,0,1,101,3,68,366,21002,0,1,2,21102,1,376,0,1106,0,436,22101,0,1,0,109,-1,2105,1,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,109,8,21202,-6,10,-5,22207,-7,-5,-5,1205,-5,521,21101,0,0,-4,21101,0,0,-3,21102,1,51,-2,21201,-2,-1,-2,1201,-2,385,471,20101,0,0,-1,21202,-3,2,-3,22207,-7,-1,-5,1205,-5,496,21201,-3,1,-3,22102,-1,-1,-5,22201,-7,-5,-7,22207,-3,-6,-5,1205,-5,515,22102,-1,-6,-5,22201,-3,-5,-3,22201,-1,-4,-4,1205,-2,461,1105,1,547,21101,0,-1,-4,21202,-6,-1,-6,21207,-7,0,-5,1205,-5,547,22201,-7,-6,-7,21201,-4,1,-4,1105,1,529,22102,1,-4,-7,109,-8,2106,0,0,109,1,101,1,68,563,21001,0,0,0,109,-1,2105,1,0,1102,87671,1,66,1102,1,2,67,1102,598,1,68,1101,302,0,69,1101,1,0,71,1101,0,602,72,1105,1,73,0,0,0,0,19,59159,1101,59779,0,66,1101,0,1,67,1102,1,631,68,1101,0,556,69,1102,1,1,71,1101,633,0,72,1105,1,73,1,25,30,192358,1102,41491,1,66,1101,0,4,67,1101,0,662,68,1101,253,0,69,1102,1,1,71,1101,0,670,72,1105,1,73,0,0,0,0,0,0,0,0,30,96179,1101,0,77699,66,1102,1,1,67,1101,0,699,68,1101,556,0,69,1102,1,0,71,1102,701,1,72,1105,1,73,1,1177,1101,32299,0,66,1101,0,1,67,1102,1,728,68,1102,1,556,69,1101,1,0,71,1101,730,0,72,1106,0,73,1,1151,25,264644,1102,1,77591,66,1101,1,0,67,1101,759,0,68,1101,0,556,69,1101,0,3,71,1101,0,761,72,1105,1,73,1,2,25,132322,3,115706,3,289265,1101,46451,0,66,1102,1,1,67,1101,0,794,68,1101,0,556,69,1102,1,1,71,1102,1,796,72,1105,1,73,1,7537,26,236679,1101,37951,0,66,1101,0,1,67,1101,0,825,68,1102,556,1,69,1102,1,1,71,1101,827,0,72,1106,0,73,1,997,25,66161,1102,1,17491,66,1102,1,1,67,1101,856,0,68,1102,1,556,69,1102,1,1,71,1101,0,858,72,1105,1,73,1,-67132,24,75773,1101,78989,0,66,1101,0,1,67,1101,0,887,68,1102,1,556,69,1101,0,0,71,1102,889,1,72,1105,1,73,1,1547,1101,25969,0,66,1102,1,1,67,1102,916,1,68,1102,1,556,69,1101,2,0,71,1102,918,1,72,1105,1,73,1,10,47,112276,3,231412,1101,6469,0,66,1102,1,1,67,1101,0,949,68,1102,556,1,69,1101,1,0,71,1101,951,0,72,1105,1,73,1,-19261,24,454638,1102,101873,1,66,1102,1,1,67,1102,980,1,68,1101,556,0,69,1101,4,0,71,1102,1,982,72,1105,1,73,1,1,26,157786,8,164378,25,198483,11,95071,1102,1,48751,66,1102,2,1,67,1101,0,1017,68,1101,0,302,69,1102,1,1,71,1102,1021,1,72,1105,1,73,0,0,0,0,4,268724,1102,1,60383,66,1102,1,1,67,1101,1050,0,68,1102,1,556,69,1102,1,1,71,1102,1052,1,72,1106,0,73,1,121,8,246567,1102,1,67181,66,1101,4,0,67,1102,1081,1,68,1101,253,0,69,1101,1,0,71,1101,1089,0,72,1106,0,73,0,0,0,0,0,0,0,0,5,104479,1101,0,99277,66,1102,1,1,67,1101,0,1118,68,1101,0,556,69,1101,0,1,71,1102,1,1120,72,1106,0,73,1,-75,11,285213,1102,1,76753,66,1102,3,1,67,1101,1149,0,68,1101,0,302,69,1101,1,0,71,1101,0,1155,72,1105,1,73,0,0,0,0,0,0,4,201543,1101,0,79,66,1102,1,1,67,1101,1184,0,68,1102,1,556,69,1101,0,2,71,1101,0,1186,72,1105,1,73,1,125,49,87671,47,28069,1102,95071,1,66,1102,3,1,67,1101,1217,0,68,1102,1,302,69,1102,1,1,71,1101,1223,0,72,1105,1,73,0,0,0,0,0,0,12,6982,1101,0,78889,66,1101,1,0,67,1101,0,1252,68,1101,0,556,69,1102,1,0,71,1102,1,1254,72,1105,1,73,1,1927,1101,0,57853,66,1102,1,6,67,1102,1281,1,68,1102,1,302,69,1102,1,1,71,1102,1293,1,72,1106,0,73,0,0,0,0,0,0,0,0,0,0,0,0,5,208958,1101,16363,0,66,1101,0,1,67,1102,1,1322,68,1102,1,556,69,1102,1,1,71,1101,1324,0,72,1105,1,73,1,50656,24,303092,1102,59159,1,66,1102,1,2,67,1102,1,1353,68,1102,1,302,69,1102,1,1,71,1101,1357,0,72,1105,1,73,0,0,0,0,2,81758,1102,43853,1,66,1101,3,0,67,1102,1386,1,68,1102,302,1,69,1102,1,1,71,1102,1,1392,72,1106,0,73,0,0,0,0,0,0,4,134362,1102,67061,1,66,1102,1,1,67,1102,1,1421,68,1102,1,556,69,1102,1,1,71,1102,1423,1,72,1105,1,73,1,11,8,328756,1102,1,78893,66,1101,0,3,67,1102,1,1452,68,1101,302,0,69,1102,1,1,71,1102,1,1458,72,1106,0,73,0,0,0,0,0,0,41,124473,1102,1,104479,66,1101,2,0,67,1101,0,1487,68,1101,351,0,69,1101,1,0,71,1102,1491,1,72,1105,1,73,0,0,0,0,255,99571,1101,87587,0,66,1102,1,1,67,1102,1,1520,68,1101,0,556,69,1102,1,2,71,1102,1522,1,72,1106,0,73,1,509,29,87706,11,190142,1102,1,99571,66,1102,1,1,67,1102,1,1553,68,1101,0,556,69,1102,1,6,71,1102,1555,1,72,1106,0,73,1,21486,38,48751,12,3491,12,10473,31,76753,31,153506,31,230259,1102,1,85159,66,1101,1,0,67,1102,1594,1,68,1102,556,1,69,1102,1,1,71,1102,1,1596,72,1106,0,73,1,439,24,378865,1102,9187,1,66,1102,1,1,67,1101,1625,0,68,1101,556,0,69,1101,0,1,71,1101,0,1627,72,1106,0,73,1,67,8,82189,1101,49363,0,66,1102,1,1,67,1102,1656,1,68,1102,556,1,69,1101,0,1,71,1101,0,1658,72,1105,1,73,1,14,26,78893,1101,17291,0,66,1102,1,1,67,1102,1687,1,68,1102,1,556,69,1101,1,0,71,1101,0,1689,72,1105,1,73,1,-2,48,141374,1102,75773,1,66,1102,1,6,67,1102,1718,1,68,1102,1,253,69,1102,1,1,71,1102,1,1730,72,1106,0,73,0,0,0,0,0,0,0,0,0,0,0,0,49,175342,1102,13159,1,66,1102,2,1,67,1102,1759,1,68,1101,302,0,69,1101,0,1,71,1101,0,1763,72,1106,0,73,0,0,0,0,38,97502,1102,28069,1,66,1102,4,1,67,1101,0,1792,68,1101,0,302,69,1101,0,1,71,1102,1,1800,72,1105,1,73,0,0,0,0,0,0,0,0,3,57853,1101,40853,0,66,1102,1,1,67,1102,1,1829,68,1101,0,556,69,1102,1,1,71,1101,0,1831,72,1106,0,73,1,327322,24,227319,1102,1,53089,66,1101,1,0,67,1102,1860,1,68,1101,556,0,69,1101,0,8,71,1101,1862,0,72,1106,0,73,1,5,19,118318,2,40879,29,43853,28,65963,9,13159,47,56138,47,84207,3,173559,1102,1,44777,66,1102,1,1,67,1101,0,1905,68,1101,556,0,69,1102,1,1,71,1101,0,1907,72,1105,1,73,1,-71105,24,151546,1101,0,70687,66,1102,2,1,67,1102,1,1936,68,1102,302,1,69,1102,1,1,71,1102,1,1940,72,1106,0,73,0,0,0,0,41,82982,1102,1,65963,66,1102,1,2,67,1102,1,1969,68,1101,302,0,69,1102,1,1,71,1102,1,1973,72,1105,1,73,0,0,0,0,9,26318,1101,82189,0,66,1102,1,4,67,1101,0,2002,68,1101,0,302,69,1102,1,1,71,1101,0,2010,72,1106,0,73,0,0,0,0,0,0,0,0,41,41491,1101,0,40879,66,1101,0,2,67,1101,2039,0,68,1102,1,302,69,1102,1,1,71,1101,0,2043,72,1106,0,73,0,0,0,0,29,131559,1102,1,96179,66,1102,2,1,67,1102,1,2072,68,1101,0,302,69,1102,1,1,71,1102,1,2076,72,1106,0,73,0,0,0,0,28,131926,1101,3491,0,66,1102,3,1,67,1101,0,2105,68,1102,302,1,69,1102,1,1,71,1102,1,2111,72,1106,0,73,0,0,0,0,0,0,4,67181,1101,65551,0,66,1101,0,1,67,1102,1,2140,68,1102,1,556,69,1101,0,1,71,1102,1,2142,72,1105,1,73,1,296273,48,70687,1101,66161,0,66,1102,4,1,67,1101,2171,0,68,1102,302,1,69,1101,0,1,71,1101,2179,0,72,1106,0,73,0,0,0,0,0,0,0,0,41,165964,1101,0,81181,66,1101,0,1,67,1102,1,2208,68,1102,556,1,69,1102,0,1,71,1101,2210,0,72,1106,0,73,1,1141,1101,0,74093,66,1101,0,1,67,1102,2237,1,68,1102,1,556,69,1101,1,0,71,1102,1,2239,72,1106,0,73,1,160,3,347118 diff --git a/2019/day23-scratch/main.go b/2019/day23-scratch/main.go new file mode 100644 index 0000000..7c0d8cb --- /dev/null +++ b/2019/day23-scratch/main.go @@ -0,0 +1,123 @@ +package main + +import ( + "fmt" + "io/ioutil" + "strconv" + "strings" +) + +func main() { + input, _ := ioutil.ReadFile("input") + + // Build the memory + mem := map[int]int{} + for i, s := range strings.Split(strings.TrimSpace(string(input)), ",") { + mem[i], _ = strconv.Atoi(s) + } + + // Mesage Buffers + in, out := make([]chan int, 50), make([]chan int, 50) + for i := 0; i < 50; i++ { + in[i], out[i] = make(chan int), make(chan int) + go run(mem, in[i], out[i]) + // Send address to each computer first + in[i] <- i + in[i] <- -1 + } + + idle := 0 + var old, nat [2]int + + for i := 0; ; i = (i + 1) % 50 { + select { + case addr := <-out[i]: + if addr == 255 { + new := [2]int{<-out[i], <-out[i]} + if nat == [2]int{} { + fmt.Println(new[1]) + } + nat = new + } else { + in[addr] <- <-out[i] + in[addr] <- <-out[i] + } + idle = 0 + case in[i] <- -1: + idle++ + } + + if idle >= 50 { + if nat[1] == old[1] { + fmt.Println(nat[1]) + return + } + in[0] <- nat[0] + in[0] <- nat[1] + old = nat + idle = 0 + } + } +} + +func run(init map[int]int, in <-chan int, out chan<- int) { + ip, rb := 0, 0 + mem := map[int]int{} + for i, v := range init { + mem[i] = v + } + + for { + ins := fmt.Sprintf("%05d", mem[ip]) + op, _ := strconv.Atoi(ins[3:]) + par := func(i int) int { + switch ins[3-i] { + case '1': + return ip + i + case '2': + return rb + mem[ip+i] + default: + return mem[ip+i] + } + } + + switch op { + case 1: + mem[par(3)] = mem[par(1)] + mem[par(2)] + case 2: + mem[par(3)] = mem[par(1)] * mem[par(2)] + case 3: + mem[par(1)] = <-in + case 4: + out <- mem[par(1)] + case 5: + if mem[par(1)] != 0 { + ip = mem[par(2)] + continue + } + case 6: + if mem[par(1)] == 0 { + ip = mem[par(2)] + continue + } + case 7: + if mem[par(1)] < mem[par(2)] { + mem[par(3)] = 1 + } else { + mem[par(3)] = 0 + } + case 8: + if mem[par(1)] == mem[par(2)] { + mem[par(3)] = 1 + } else { + mem[par(3)] = 0 + } + case 9: + rb += mem[par(1)] + case 99: + return + } + + ip += []int{1, 4, 4, 2, 2, 3, 3, 4, 4, 2}[op] + } +} diff --git a/2019/day23/main.go b/2019/day23/main.go index f7409c2..6c814b4 100644 --- a/2019/day23/main.go +++ b/2019/day23/main.go @@ -1,78 +1,54 @@ package main import ( - "time" + "fmt" - intcode "git.bullercodeworks.com/brian/adventofcode/2019/intcode-processor" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { - //pt := helpers.GetArgNumber(1) - prog := intcode.ReadIntCodeFile("input") - //if pt == "1" { - part1(prog) - //} else { - // part2(prog) - //} -} - -func part1(prog []int) { - p := intcode.NewProgram(prog) - n := StartNetwork(*p) - for !n.CrashOverride { - time.Sleep(1) + pt := h.GetArgNumber(1) + if pt != "2" { + part1() + } else { + part2() } } -/* -func part1o(prog []int) { - var network []*intcode.Program - msgQueue := make([][]int, 255) - for k := 0; k < 50; k++ { - p := intcode.NewProgram(prog) - //p.EnableDebug() - network = append(network, p) - msgQueue = append(msgQueue, []int{}) - go func(addr int) { - for !network[addr].NeedsInput() { - time.Sleep(1) +func part1() { + devices, queue := NewNetwork() + for { + //fmt.Print(h.CLEAR_SCREEN) + for i, dev := range devices { + var packet h.Coordinate + if len(queue[i]) > 0 { + packet = queue[i][0] + } else { + packet = h.Coordinate{X: -1, Y: -1} } - network[addr].Input(addr) - for { - if !network[addr].NeedsOutput() && !network[addr].NeedsInput() { - time.Sleep(1) - } else if network[addr].NeedsOutput() { - msgD := network[addr].Output() - msgQueue[msgD] = append(msgQueue[msgD], network[addr].Output()) - msgQueue[msgD] = append(msgQueue[msgD], network[addr].Output()) - fmt.Println(addr, "->", msgD, msgQueue[msgD]) - } else if network[addr].NeedsInput() { - if len(msgQueue[addr]) > 0 { - var v int - v, msgQueue[addr] = msgQueue[addr][0], msgQueue[addr][1:] - fmt.Println(addr, "<-", v) - network[addr].Input(v) - } else { - network[addr].Input(-1) - } + select { + case dest := <-dev.Channel: + x := <-dev.Channel + y := <-dev.Channel + //fmt.Printf("%s: [%d] -> [%d]: {%d, %d}\n", time.Now().Format(time.Stamp), i, dest, x, y) + if dest == 255 { + fmt.Println(y) + return + } + queue[dest] = append(queue[dest], h.Coordinate{X: x, Y: y}) + case dev.Channel <- packet.X: + //if packet.X != -1 && packet.Y != -1 { + // fmt.Printf("%s: [%d] <-: {%d, %d}\n", time.Now().Format(time.Stamp), i, packet.X, packet.Y) + //} + if packet.X != -1 { + dev.Channel <- packet.Y + queue[i] = queue[i][1:] } } - }(k) - go network[k].Run() + //fmt.Println(dev) + } } - for len(msgQueue[255]) < 2 { - time.Sleep(1) - } - fmt.Println(msgQueue[255]) -} -*/ - -func part2(prog []int) { } -func getOutput(p *intcode.Program) int { - for !p.NeedsOutput() { - time.Sleep(1) - } - return p.Output() +func part2() { } diff --git a/2019/day23/network.go b/2019/day23/network.go index 20af9c1..157f8a9 100644 --- a/2019/day23/network.go +++ b/2019/day23/network.go @@ -1,121 +1,163 @@ package main import ( - "errors" "fmt" - "time" + "io/ioutil" + "strconv" + "strings" - intcode "git.bullercodeworks.com/brian/adventofcode/2019/intcode-processor" h "git.bullercodeworks.com/brian/adventofcode/helpers" ) -type System struct { - intcode.Program - Running bool - Address int - IncomingQueue []h.Coordinate - Network *Network +var incache []int + +type Computer struct { + Address int + Program []int + Position int + Offset int + Channel chan int } -func NewSystem(program intcode.Program, addr int, network *Network) *System { - s := System{ - Program: program, - Address: addr, - Network: network, +func (c Computer) String() string { + status := "○" + if c.Position%2 == 0 { + status = "●" } - go func() { - fmt.Println("Booting", s.Address, "...") - for !s.Program.NeedsInput() { - time.Sleep(1) + return fmt.Sprintf("[%2d] %s {%d}", c.Address, status, c.Offset) +} + +func (c *Computer) parseInstruction() (int, []int) { + inst := c.read(c.Position) + opcode := inst % 100 + modes := make([]int, 4) + inst /= 100 + for i := 0; inst > 0; i++ { + modes[i] = inst % 10 + inst /= 10 + } + return opcode, modes +} + +func (c *Computer) parseParameters(modes []int, num int) []int { + params := make([]int, num) + for i := 0; i < num; i++ { + if i >= len(modes) || modes[i] == 0 { + params[i] = c.read(c.read(c.Position + i + 1)) + } else if modes[i] == 1 { + params[i] = c.read(c.Position + i + 1) + } else { + params[i] = c.read(c.read(c.Position+i+1) + c.Offset) } - s.Program.Input(s.Address) - fmt.Println(s.Address, "booted") - // System should just continue to run now - for { - if s.NeedsOutput() { - // There should be 3 outputs, an address and a coordinate - addr, x, y := s.Output(), s.Output(), s.Output() - coord := h.Coordinate{ - X: x, - Y: y, - } - s.Network.Queue(addr, coord) - } else if s.NeedsInput() { - v, err := s.Network.Retrieve(s.Address) - if err != nil { - s.Input(v.X) - for !s.NeedsInput() { - time.Sleep(1) - } - s.Input(v.Y) - } else { - s.Input(-1) - } + } + return params +} + +func (c *Computer) read(pos int) int { + if pos >= len(c.Program) { + return 0 + } + return c.Program[pos] +} + +func (c *Computer) write(pos, val, mode int) { + if mode == 2 { + pos += c.Offset + } + if pos >= len(c.Program) { + prog := make([]int, pos*2) + copy(prog, c.Program) + c.Program = prog + } + c.Program[pos] = val +} + +func (c *Computer) run() { + for c.read(c.Position) != 99 { + inst, modes := c.parseInstruction() + switch inst { + case 1: + params := c.parseParameters(modes, 2) + c.write(c.read(c.Position+3), params[0]+params[1], modes[2]) + c.Position += 4 + case 2: + params := c.parseParameters(modes, 2) + c.write(c.read(c.Position+3), params[0]*params[1], modes[2]) + c.Position += 4 + case 3: + c.write(c.read(c.Position+1), <-c.Channel, modes[0]) + c.Position += 2 + case 4: + params := c.parseParameters(modes, 1) + c.Channel <- params[0] + c.Position += 2 + case 5: + params := c.parseParameters(modes, 2) + if params[0] != 0 { + c.Position = params[1] + } else { + c.Position += 3 } + case 6: + params := c.parseParameters(modes, 2) + if params[0] == 0 { + c.Position = params[1] + } else { + c.Position += 3 + } + case 7: + params := c.parseParameters(modes, 2) + if params[0] < params[1] { + c.write(c.read(c.Position+3), 1, modes[2]) + } else { + c.write(c.read(c.Position+3), 0, modes[2]) + } + c.Position += 4 + case 8: + params := c.parseParameters(modes, 2) + if params[0] == params[1] { + c.write(c.read(c.Position+3), 1, modes[2]) + } else { + c.write(c.read(c.Position+3), 0, modes[2]) + } + c.Position += 4 + case 9: + params := c.parseParameters(modes, 1) + c.Offset += params[0] + c.Position += 2 } - }() - go s.Program.Run() - return &s + } + close(c.Channel) } -func (s System) String() string { - status := "." - if s.Program.NeedsInput() { - status = "<" - } else if s.Program.NeedsOutput() { - status = ">" - } - return fmt.Sprintf("[%d] %s\n", s.Address, status) -} - -type Network struct { - Systems []*System - Messages map[int][]h.Coordinate - CrashOverride bool -} - -func StartNetwork(nic intcode.Program) *Network { - n := Network{ - Messages: make(map[int][]h.Coordinate), - } - for i := 0; i < 50; i++ { - n.Systems = append(n.Systems, NewSystem(nic, i, &n)) - } - return &n -} - -func (n *Network) Queue(addr int, coord h.Coordinate) { - fmt.Println("Network Queue", addr, coord, len(n.Messages)) - if addr == 255 { - fmt.Printf("First packet to 255: {X: %d, Y: %d}\n", coord.X, coord.Y) - n.CrashOverride = true - } - if n.CrashOverride { - return - } - fmt.Printf("Queuing Packet for %d: {X: %d, Y: %d}\n", addr, coord.X, coord.Y) - n.Messages[addr] = append(n.Messages[addr], coord) -} - -func (n *Network) Retrieve(addr int) (h.Coordinate, error) { - fmt.Println("Network Retrieve", addr, len(n.Messages)) - if n.CrashOverride { - return h.Coordinate{}, errors.New("Network is down") - } - var ret h.Coordinate - if len(n.Messages[addr]) > 0 { - ret, n.Messages[addr] = n.Messages[addr][0], n.Messages[addr][1:] - fmt.Printf("%d Retriving Packet: {X: %d, Y: %d}\n", addr, ret.X, ret.Y) - return ret, nil +func NewComputer() Computer { + var ints []int + if incache == nil { + input, _ := ioutil.ReadFile("input") + ints = make([]int, 0) + for _, v := range strings.Split(string(input), ",") { + i, _ := strconv.Atoi(v) + ints = append(ints, i) + } + incache = make([]int, len(ints)) + copy(incache, ints) } else { - return h.Coordinate{}, errors.New("No message") + ints = make([]int, len(incache)) + copy(ints, incache) } + c := Computer{Program: ints, Channel: make(chan int)} + go c.run() + return c } -func (n Network) String() string { - ret := fmt.Sprintf("Messages: %d\n", len(n.Messages)) - for v := range n.Systems { - ret = ret + n.Systems[v].String() +func NewNetwork() ([]Computer, [][]h.Coordinate) { + devices := make([]Computer, 50) + queue := make([][]h.Coordinate, len(devices)) + for i := 0; i < len(devices); i++ { + devices[i] = NewComputer() + devices[i].Address = i + devices[i].Channel <- i + queue[i] = make([]h.Coordinate, 0) } - return ret + return devices, queue }