Combine AoC Repos
This commit is contained in:
157
2015/day13/main.go
Normal file
157
2015/day13/main.go
Normal file
@@ -0,0 +1,157 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var people map[string]person
|
||||
|
||||
func main() {
|
||||
var pplSlice []string
|
||||
people = make(map[string]person)
|
||||
var input []string
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
input = append(input, scanner.Text())
|
||||
}
|
||||
|
||||
for i := range input {
|
||||
p := parseLine(input[i])
|
||||
people[p.name] = p
|
||||
}
|
||||
for i := range people {
|
||||
pplSlice = append(pplSlice, people[i].name)
|
||||
}
|
||||
// Output all preferences
|
||||
/*
|
||||
for k, v := range people {
|
||||
fmt.Println(k)
|
||||
fmt.Println(" High: " + v.highName + " :: " + strconv.Itoa(v.highVal))
|
||||
for pk, pv := range v.prefs {
|
||||
fmt.Println(" " + pk + ": " + strconv.Itoa(pv))
|
||||
}
|
||||
}
|
||||
*/
|
||||
//getPerms(pplSlice)
|
||||
first := pplSlice[0]
|
||||
res := getPerms(pplSlice[1:])
|
||||
var high int
|
||||
var arrangement []string
|
||||
for i := range res {
|
||||
tstArr := append([]string{first}, res[i]...)
|
||||
tst := happinessFromStrings(tstArr)
|
||||
if tst > high {
|
||||
high = tst
|
||||
arrangement = tstArr
|
||||
}
|
||||
}
|
||||
fmt.Println("Highest: " + strconv.Itoa(high))
|
||||
fmt.Println(arrangement)
|
||||
}
|
||||
|
||||
func getPerms(ppl []string) [][]string {
|
||||
var ret [][]string
|
||||
if len(ppl) == 1 {
|
||||
return append(ret, ppl)
|
||||
}
|
||||
|
||||
for j := range ppl {
|
||||
var bld []string
|
||||
for i := range ppl {
|
||||
if i != j {
|
||||
bld = append(bld, ppl[i])
|
||||
}
|
||||
}
|
||||
perms := getPerms(bld)
|
||||
for i := range perms {
|
||||
perms[i] = append([]string{ppl[j]}, perms[i]...)
|
||||
ret = append(ret, perms[i])
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func happinessFromStrings(pS []string) int {
|
||||
var ppl []person
|
||||
for i := range pS {
|
||||
ppl = append(ppl, people[pS[i]])
|
||||
}
|
||||
return happinessValue(ppl)
|
||||
}
|
||||
|
||||
func happinessValue(ppl []person) int {
|
||||
var ret int
|
||||
for i := range ppl {
|
||||
p1, p2 := getNeighbors(ppl[i], ppl)
|
||||
ret += ppl[i].prefs[p1.name]
|
||||
ret += ppl[i].prefs[p2.name]
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func getNeighbors(p person, ppl []person) (person, person) {
|
||||
var p1, p2 person
|
||||
for idx := range ppl {
|
||||
if ppl[idx].name == p.name {
|
||||
if idx == 0 {
|
||||
p1 = ppl[len(ppl)-1]
|
||||
p2 = ppl[idx+1]
|
||||
} else if idx == len(ppl)-1 {
|
||||
p1 = ppl[idx-1]
|
||||
p2 = ppl[0]
|
||||
} else {
|
||||
p1 = ppl[idx-1]
|
||||
p2 = ppl[idx+1]
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
return p1, p2
|
||||
}
|
||||
|
||||
type person struct {
|
||||
name string
|
||||
prefs map[string]int
|
||||
highName string
|
||||
highVal int
|
||||
lowName string
|
||||
lowVal int
|
||||
}
|
||||
|
||||
func parseLine(s string) person {
|
||||
parts := strings.Split(s, " ")
|
||||
who := parts[0]
|
||||
direction := parts[2]
|
||||
amount := mustAtoi(parts[3])
|
||||
nextTo := parts[10][:len(parts[10])-1]
|
||||
if direction == "lose" {
|
||||
amount = amount * -1
|
||||
}
|
||||
var ret person
|
||||
var ok bool
|
||||
if ret, ok = people[who]; !ok {
|
||||
ret = person{name: who}
|
||||
ret.prefs = make(map[string]int)
|
||||
}
|
||||
ret.prefs[nextTo] = amount
|
||||
if ret.highVal < amount || ret.highName == "" {
|
||||
ret.highVal, ret.highName = amount, nextTo
|
||||
}
|
||||
if ret.lowVal > amount || ret.lowName == "" {
|
||||
ret.lowVal, ret.lowName = amount, nextTo
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func mustAtoi(s string) int {
|
||||
var i int
|
||||
var err error
|
||||
if i, err = strconv.Atoi(s); err != nil {
|
||||
fmt.Println("Tried to atoi " + s)
|
||||
}
|
||||
return i
|
||||
}
|
||||
Reference in New Issue
Block a user