Day 6: reallocate
11137
This commit is contained in:
parent
d7ff9586ef
commit
e112db3506
1
06dec/input_test
Normal file
1
06dec/input_test
Normal file
@ -0,0 +1 @@
|
||||
0 2 7 0
|
104
06dec/main.go
Normal file
104
06dec/main.go
Normal file
@ -0,0 +1,104 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var (
|
||||
mem []*int
|
||||
ref [][]int
|
||||
)
|
||||
|
||||
func main() {
|
||||
parseInput()
|
||||
fmt.Println("\n", reallocatRecursive(0))
|
||||
}
|
||||
|
||||
func printMem() {
|
||||
for _, m := range mem {
|
||||
fmt.Print(*m, " ")
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
func parseInput() {
|
||||
mem = []*int{}
|
||||
ref = append([][]int{}, []int{})
|
||||
sc := bufio.NewScanner(os.Stdin)
|
||||
sc.Split(bufio.ScanWords)
|
||||
for sc.Scan() {
|
||||
i, err := strconv.Atoi(sc.Text())
|
||||
// fmt.Println(i)
|
||||
if err != nil {
|
||||
log.Fatalln("Invalid input", sc.Text())
|
||||
}
|
||||
mem = append(mem, &i)
|
||||
ref[0] = append(ref[0], i)
|
||||
}
|
||||
}
|
||||
|
||||
func isRef() bool {
|
||||
//fmt.Println("Ref size", len(ref))
|
||||
for _, r := range ref {
|
||||
//fmt.Println(r)
|
||||
if len(mem) == len(r) {
|
||||
match := true
|
||||
for i, m := range mem {
|
||||
if r[i] != *m {
|
||||
match = false
|
||||
}
|
||||
}
|
||||
if match {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func reallocatRecursive(incr int) int {
|
||||
//printMem()
|
||||
reallocate()
|
||||
if isRef() {
|
||||
return incr + 1
|
||||
}
|
||||
appendRef()
|
||||
return reallocatRecursive(incr + 1)
|
||||
}
|
||||
|
||||
func appendRef() {
|
||||
r := []int{}
|
||||
for _, m := range mem {
|
||||
r = append(r, *m)
|
||||
}
|
||||
ref = append(ref, r)
|
||||
}
|
||||
|
||||
func reallocate() {
|
||||
//fmt.Println("mem size", len(mem))
|
||||
block := findBlock()
|
||||
//fmt.Println("reallocate", block)
|
||||
blocks := *mem[block]
|
||||
//fmt.Println(blocks)
|
||||
*mem[block] -= blocks // RAZ
|
||||
for i := 0; i < blocks; i++ {
|
||||
block = (block + 1) % len(mem)
|
||||
*mem[block]++
|
||||
}
|
||||
}
|
||||
|
||||
func findBlock() int {
|
||||
max := 0
|
||||
maxPos := 0
|
||||
for i, m := range mem {
|
||||
if *m > max {
|
||||
max = *m
|
||||
maxPos = i
|
||||
}
|
||||
}
|
||||
return maxPos
|
||||
}
|
Loading…
Reference in New Issue
Block a user