diff options
-rw-r--r-- | LICENSE | 22 | ||||
-rw-r--r-- | two.go | 66 |
2 files changed, 88 insertions, 0 deletions
@@ -0,0 +1,22 @@ +MIT License + +Copyright (C) 2020 j-james <https://j-james.me> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + @@ -0,0 +1,66 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os" + "strconv" +) + +func main() { + var slice []int + start, size := 0, 0 + if len(os.Args) < 2 { + panic("runtime error: missing operand") + } + file, err := ioutil.ReadFile(os.Args[1]) + if err != nil { + panic(err) + } + for i := 0; i < len(file); i++ { + if file[i] == ',' || file[i] == '\n' { + arg, err := strconv.Atoi(string(file[start:i])) // i-1?? + if err != nil { + panic(err) + } + slice = append(slice, arg) + start = i + 1 + size++ + } + } + noun, verb := edocpo(slice, 19690720) + slice[1] = 12 + slice[2] = 2 + fmt.Println(opcode(slice)[0]) + fmt.Println(100*noun + verb) +} + +func opcode(slice []int) []int { + for i := 0; i < len(slice); i += 4 { + if slice[i] == 1 { + slice[slice[i+3]] = slice[slice[i+1]] + slice[slice[i+2]] + } else if slice[i] == 2 { + slice[slice[i+3]] = slice[slice[i+1]] * slice[slice[i+2]] + } else if slice[i] == 99 { + return slice + } else { + fmt.Println("Unsupported code", slice[i], "at", i) + os.Exit(0) + } + } + return slice +} + +func edocpo(slice []int, output int) (int, int) { + var ecils []int + for i := 0; i < len(slice); i++ { + for j := 0; j < len(slice); j++ { + ecils = append([]int(nil), slice...) // reset ecils to slice + ecils[1], ecils[2] = i, j + if opcode(ecils)[0] == output { + return i, j + } + } + } + return -1, -1 +} |