diff --git a/2019/day23-scratch/day23-scratch b/2019/day23-scratch/day23-scratch deleted file mode 100755 index cd63a9f..0000000 Binary files a/2019/day23-scratch/day23-scratch and /dev/null differ diff --git a/2019/day23-scratch/input b/2019/day23-scratch/input deleted file mode 100644 index c384e82..0000000 --- a/2019/day23-scratch/input +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 7c0d8cb..0000000 --- a/2019/day23-scratch/main.go +++ /dev/null @@ -1,123 +0,0 @@ -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 6c814b4..7c0d8cb 100644 --- a/2019/day23/main.go +++ b/2019/day23/main.go @@ -2,53 +2,122 @@ package main import ( "fmt" - - h "git.bullercodeworks.com/brian/adventofcode/helpers" + "io/ioutil" + "strconv" + "strings" ) func main() { - pt := h.GetArgNumber(1) - if pt != "2" { - part1() - } else { - part2() - } -} + input, _ := ioutil.ReadFile("input") -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] + // 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 { - packet = h.Coordinate{X: -1, Y: -1} + in[addr] <- <-out[i] + in[addr] <- <-out[i] } - 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:] - } + idle = 0 + case in[i] <- -1: + idle++ + } + + if idle >= 50 { + if nat[1] == old[1] { + fmt.Println(nat[1]) + return } - //fmt.Println(dev) + in[0] <- nat[0] + in[0] <- nat[1] + old = nat + idle = 0 } } } -func part2() { +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/network.go b/2019/day23/network.go deleted file mode 100644 index 157f8a9..0000000 --- a/2019/day23/network.go +++ /dev/null @@ -1,163 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "strconv" - "strings" - - h "git.bullercodeworks.com/brian/adventofcode/helpers" -) - -var incache []int - -type Computer struct { - Address int - Program []int - Position int - Offset int - Channel chan int -} - -func (c Computer) String() string { - status := "○" - if c.Position%2 == 0 { - status = "●" - } - 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) - } - } - 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 - } - } - close(c.Channel) -} - -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 { - ints = make([]int, len(incache)) - copy(ints, incache) - } - c := Computer{Program: ints, Channel: make(chan int)} - go c.run() - return c -} - -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 devices, queue -}