:work: Part 2 of day 7 still not working

This commit is contained in:
Alphyron 2019-12-08 16:14:17 +01:00
parent 194981f938
commit da97805203

View File

@ -3,8 +3,8 @@ package main
import ( import (
"bufio" "bufio"
"errors" "errors"
"fmt"
"log" "log"
"math"
"os" "os"
"strconv" "strconv"
"strings" "strings"
@ -34,21 +34,123 @@ func main() {
t2 = append(t2, j) t2 = append(t2, j)
} }
wip := make([]int, len(t2)) wip := make([]int, len(t2))
wip2 := make([]int, len(t2))
// ========= Finish now, we can solve the task ====== // ========= Finish now, we can solve the task ======
copy(wip, t2) copy(wip, t2)
err = ParseArray(wip) SolvePuzzle1(wip)
if err != nil { copy(wip2, t2)
log.Println(err) SolvePuzzle2(wip2)
}
} }
func ParseArray(list []int) error { func SolvePuzzle1(list []int) {
rawr := []int{0, 1, 2, 3, 4}
combinations := permutations(rawr)
highestOutput := math.MinInt32
//highestInput := ""
for _, combi := range combinations {
output := RunAmplification(list, []int{int(combi[0]), int(combi[1]), int(combi[2]), int(combi[3]), int(combi[4])})
if output > highestOutput {
//highestInput = combi
highestOutput = output
}
}
log.Println("Part1: " + strconv.Itoa(highestOutput))
}
func SolvePuzzle2(list []int) {
rawr := []int{9, 8, 7, 6, 5}
combinations := permutations(rawr)
highestOutput := math.MinInt32
//highestInput := ""
for _, combi := range combinations {
output := RunRecursiveAmplification(list, []int{combi[0], combi[1], combi[2], combi[3], combi[4]})
if output > highestOutput {
//highestInput = combi
highestOutput = output
}
}
log.Println("Part2: " + strconv.Itoa(highestOutput))
}
func RunAmplification(list []int, phases []int) int {
signal := []string{"0"}
for i := 0; i < 5; i++ {
wip := make([]int, len(list))
copy(wip, list)
inputs := make([]int, 0)
inputs = append(inputs, phases[i])
for j := 0; j < len(signal); j++ {
inputStr, _ := strconv.Atoi(signal[j])
inputs = append(inputs, inputStr)
}
output, err, _ := ParseArray(wip, inputs)
if err != nil {
log.Printf("Problem at Amplification: %d", i+1)
log.Fatal(err)
}
signal = output
}
sigInt, _ := strconv.Atoi(signal[0])
return sigInt
}
func RunRecursiveAmplification(list []int, phases []int) int {
signal := []string{"0"}
i := 0
for true {
wip := make([]int, len(list))
copy(wip, list)
inputs := make([]int, 0)
inputs = append(inputs, phases[i])
for j := 0; j < len(signal); j++ {
inputStr, _ := strconv.Atoi(signal[j])
inputs = append(inputs, inputStr)
}
output, err, cmdSuccess := ParseArray(wip, inputs)
if err != nil {
log.Printf("Problem at Amplification: %d", i+1)
log.Fatal(err)
}
signal = output
if cmdSuccess && i == 4 {
break
}
if i == 4 {
i = -1
}
i++
}
sigInt, _ := strconv.Atoi(signal[len(signal)-1])
return sigInt
}
func ParseArray(list []int, inputs []int) (output []string, err error, cmdEnd bool) {
inputIndex := 0
output = make([]string, 0)
for i := 0; i < len(list); i += 4 { for i := 0; i < len(list); i += 4 {
//log.Println(strconv.Itoa(i) + " -> " + strconv.Itoa(list[i])) //log.Println(strconv.Itoa(i) + " -> " + strconv.Itoa(list[i]))
cmd := list[i] cmd := list[i]
if cmd == 99 { if cmd == 99 {
return nil return output, nil, true
} }
sum := 0 sum := 0
@ -105,15 +207,24 @@ func ParseArray(list []int) error {
sum = num1 * num2 sum = num1 * num2
list[list[i+3]] = sum list[list[i+3]] = sum
} else if cmd == 3 { } else if cmd == 3 {
var input int //log.Println(i)
fmt.Scanf("%d", &input)
if len(inputs) > inputIndex {
input := inputs[inputIndex]
inputIndex++
list[list[i+1]] = input list[list[i+1]] = input
} else {
input := output[0]
output = output[1:]
inputInt, _ := strconv.Atoi(input)
list[list[i+1]] = inputInt
}
i = i - 2 i = i - 2
} else if cmd == 4 { } else if cmd == 4 {
if mode1 == 1 { if mode1 == 1 {
fmt.Print(list[i+1]) output = append(output, strconv.Itoa(list[i+1]))
} else { } else {
fmt.Print(list[list[i+1]]) output = append(output, strconv.Itoa(list[list[i+1]]))
} }
i = i - 2 i = i - 2
} else if cmd == 5 { } else if cmd == 5 {
@ -189,10 +300,10 @@ func ParseArray(list []int) error {
list[list[i+3]] = 0 list[list[i+3]] = 0
} }
} else { } else {
return errors.New("Wrong Command (" + strconv.Itoa(list[i]) + ") at position " + strconv.Itoa(i)) return output, errors.New("Wrong Command (" + strconv.Itoa(list[i]) + ") at position " + strconv.Itoa(i)), false
} }
} }
return nil return output, nil, false
} }
func CountDigits(i int) int { func CountDigits(i int) int {
@ -203,3 +314,31 @@ func CountDigits(i int) int {
} }
return count return count
} }
func permutations(arr []int) [][]int {
var helper func([]int, int)
res := [][]int{}
helper = func(arr []int, n int) {
if n == 1 {
tmp := make([]int, len(arr))
copy(tmp, arr)
res = append(res, tmp)
} else {
for i := 0; i < n; i++ {
helper(arr, n-1)
if n%2 == 1 {
tmp := arr[i]
arr[i] = arr[n-1]
arr[n-1] = tmp
} else {
tmp := arr[0]
arr[0] = arr[n-1]
arr[n-1] = tmp
}
}
}
}
helper(arr, len(arr))
return res
}