Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2019
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.08 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "errors"
  5.     "fmt"
  6.     "io/ioutil"
  7.     "strconv"
  8.     "strings"
  9. )
  10.  
  11. const (
  12.     expected = 19690720
  13.     tryRange = 1000
  14. )
  15.  
  16. func inputToInt(fileName string) ([]int64, error) {
  17.     allInput, err := ioutil.ReadFile(fileName)
  18.  
  19.     if err != nil {
  20.         return nil, err
  21.     }
  22.  
  23.     intList := make([]int64, 0)
  24.  
  25.     for _, v := range strings.Split(string(allInput), ",") {
  26.         intVal, err := strconv.ParseInt(v, 10, 64)
  27.  
  28.         if err != nil {
  29.             return nil, err
  30.         }
  31.  
  32.         intList = append(intList, intVal)
  33.     }
  34.  
  35.     return intList, nil
  36. }
  37.  
  38. type intCode struct {
  39.     opCode  int64
  40.     srcPos1 int64
  41.     srcPos2 int64
  42.     destPos int64
  43. }
  44.  
  45. func loadOps(data []int64, pos int) intCode {
  46.     if pos+4 >= len(data) {
  47.         return intCode{opCode: data[pos]}
  48.     }
  49.  
  50.     return intCode{data[pos], data[pos+1], data[pos+2], data[pos+3]}
  51. }
  52.  
  53. func doMultOp(data []int64, srcpos1 int64, srcpos2 int64, dstpos int64) {
  54.     data[dstpos] = data[srcpos1] * data[srcpos2]
  55. }
  56.  
  57. func doAddOp(data []int64, srcpos1 int64, srcpos2 int64, dstpos int64) {
  58.     data[dstpos] = data[srcpos1] + data[srcpos2]
  59. }
  60.  
  61. func performOps(data []int64) error {
  62.     for i := 0; i < len(data); i += 4 {
  63.         op := loadOps(data, i)
  64.  
  65.         dLen := int64(len(data))
  66.  
  67.         if op.srcPos1 >= dLen || op.srcPos2 >= dLen || op.destPos >= dLen {
  68.             return errors.New("Out of bounds")
  69.         }
  70.  
  71.         if op.opCode == 1 {
  72.             doAddOp(data, op.srcPos1, op.srcPos2, op.destPos)
  73.         }
  74.  
  75.         if op.opCode == 2 {
  76.             doMultOp(data, op.srcPos1, op.srcPos2, op.destPos)
  77.         }
  78.  
  79.         if op.opCode == 99 {
  80.             return nil
  81.         }
  82.     }
  83.  
  84.     return nil
  85. }
  86.  
  87. func main() {
  88.     saved, err := inputToInt("input.txt")
  89.  
  90.     if err != nil {
  91.         fmt.Println("Wimp wimp")
  92.     }
  93.  
  94.     for noun := 0; noun < tryRange; noun++ {
  95.         for verb := 0; verb < tryRange; verb++ {
  96.             runData := make([]int64, len(saved))
  97.             copy(runData, saved)
  98.  
  99.             runData[1] = int64(noun)
  100.             runData[2] = int64(verb)
  101.  
  102.             err = performOps(runData)
  103.  
  104.             if err != nil {
  105.                 continue
  106.             }
  107.  
  108.             if runData[0] == expected {
  109.                 fmt.Println("Found solution (verb, noun) =", verb, noun, ". (100 * noun + verb)=", 100*noun+verb)
  110.                 return
  111.             }
  112.         }
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement