Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/csmith/aoc-2019/common"
  5. "github.com/csmith/aoc-2019/intcode"
  6. )
  7. func copyOf(memory []int) []int {
  8. res := make([]int, len(memory))
  9. copy(res, memory)
  10. return res
  11. }
  12. func runPipeline(program []int, ps []int, feedback bool) int {
  13. // Create a series of VMs for our amplifiers
  14. vms := make([]*intcode.VirtualMachine, len(ps))
  15. for i := 0; i < len(ps); i++ {
  16. vms[i] = intcode.NewVirtualMachine(copyOf(program), true)
  17. }
  18. // Link all the inputs and outputs
  19. for i, vm := range vms {
  20. if i > 0 {
  21. vm.Input = vms[i-1].Output
  22. } else if feedback {
  23. vm.Input = vms[len(vms)-1].Output
  24. }
  25. }
  26. // Seed the phase settings
  27. for i, vm := range vms {
  28. vm.Input <- ps[i]
  29. }
  30. // Background run all but the last VM
  31. for _, vm := range vms[:len(vms)-1] {
  32. go vm.Run()
  33. }
  34. // Kick off the first VM and then wait for the last VM to finish
  35. vms[0].Input <- 0
  36. vms[len(vms)-1].Run()
  37. // Snag the left over value from the last VM's output
  38. return <-vms[len(vms)-1].Output
  39. }
  40. func maxOutput(input []int, ps []int, feedback bool) int {
  41. max := 0
  42. for _, p := range common.Permutations(ps) {
  43. val := runPipeline(input, p, feedback)
  44. if val > max {
  45. max = val
  46. }
  47. }
  48. return max
  49. }
  50. func main() {
  51. input := common.ReadCsvAsInts("07/input.txt")
  52. fmt.Println(maxOutput(input, []int{0, 1, 2, 3, 4}, false))
  53. fmt.Println(maxOutput(input, []int{5, 6, 7, 8, 9}, true))
  54. }