mirror of
https://github.com/Noettore/AdventOfCode.git
synced 2025-10-15 03:36:39 +02:00
Previous years crap.
Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
101
2018/day_07/input
Normal file
101
2018/day_07/input
Normal file
@@ -0,0 +1,101 @@
|
||||
Step Q must be finished before step I can begin.
|
||||
Step B must be finished before step M can begin.
|
||||
Step R must be finished before step F can begin.
|
||||
Step G must be finished before step S can begin.
|
||||
Step M must be finished before step A can begin.
|
||||
Step Z must be finished before step W can begin.
|
||||
Step J must be finished before step C can begin.
|
||||
Step K must be finished before step O can begin.
|
||||
Step C must be finished before step I can begin.
|
||||
Step Y must be finished before step L can begin.
|
||||
Step N must be finished before step P can begin.
|
||||
Step S must be finished before step X can begin.
|
||||
Step E must be finished before step U can begin.
|
||||
Step U must be finished before step V can begin.
|
||||
Step D must be finished before step F can begin.
|
||||
Step W must be finished before step H can begin.
|
||||
Step T must be finished before step I can begin.
|
||||
Step H must be finished before step V can begin.
|
||||
Step L must be finished before step O can begin.
|
||||
Step P must be finished before step A can begin.
|
||||
Step A must be finished before step I can begin.
|
||||
Step F must be finished before step O can begin.
|
||||
Step V must be finished before step X can begin.
|
||||
Step I must be finished before step O can begin.
|
||||
Step X must be finished before step O can begin.
|
||||
Step F must be finished before step V can begin.
|
||||
Step L must be finished before step P can begin.
|
||||
Step Y must be finished before step P can begin.
|
||||
Step Y must be finished before step X can begin.
|
||||
Step Y must be finished before step O can begin.
|
||||
Step D must be finished before step A can begin.
|
||||
Step T must be finished before step F can begin.
|
||||
Step W must be finished before step X can begin.
|
||||
Step R must be finished before step A can begin.
|
||||
Step E must be finished before step F can begin.
|
||||
Step H must be finished before step I can begin.
|
||||
Step K must be finished before step Y can begin.
|
||||
Step W must be finished before step P can begin.
|
||||
Step V must be finished before step O can begin.
|
||||
Step N must be finished before step E can begin.
|
||||
Step L must be finished before step I can begin.
|
||||
Step B must be finished before step G can begin.
|
||||
Step D must be finished before step T can begin.
|
||||
Step J must be finished before step L can begin.
|
||||
Step M must be finished before step Y can begin.
|
||||
Step T must be finished before step A can begin.
|
||||
Step K must be finished before step D can begin.
|
||||
Step H must be finished before step P can begin.
|
||||
Step P must be finished before step I can begin.
|
||||
Step T must be finished before step L can begin.
|
||||
Step J must be finished before step N can begin.
|
||||
Step U must be finished before step F can begin.
|
||||
Step U must be finished before step I can begin.
|
||||
Step A must be finished before step F can begin.
|
||||
Step U must be finished before step P can begin.
|
||||
Step R must be finished before step H can begin.
|
||||
Step G must be finished before step V can begin.
|
||||
Step P must be finished before step F can begin.
|
||||
Step B must be finished before step D can begin.
|
||||
Step U must be finished before step X can begin.
|
||||
Step K must be finished before step A can begin.
|
||||
Step G must be finished before step D can begin.
|
||||
Step N must be finished before step U can begin.
|
||||
Step U must be finished before step L can begin.
|
||||
Step M must be finished before step J can begin.
|
||||
Step I must be finished before step X can begin.
|
||||
Step H must be finished before step L can begin.
|
||||
Step M must be finished before step S can begin.
|
||||
Step E must be finished before step O can begin.
|
||||
Step Q must be finished before step F can begin.
|
||||
Step A must be finished before step O can begin.
|
||||
Step T must be finished before step P can begin.
|
||||
Step F must be finished before step X can begin.
|
||||
Step D must be finished before step P can begin.
|
||||
Step A must be finished before step X can begin.
|
||||
Step G must be finished before step Z can begin.
|
||||
Step W must be finished before step F can begin.
|
||||
Step Q must be finished before step X can begin.
|
||||
Step C must be finished before step V can begin.
|
||||
Step L must be finished before step V can begin.
|
||||
Step E must be finished before step L can begin.
|
||||
Step B must be finished before step X can begin.
|
||||
Step M must be finished before step V can begin.
|
||||
Step F must be finished before step I can begin.
|
||||
Step P must be finished before step X can begin.
|
||||
Step C must be finished before step A can begin.
|
||||
Step Z must be finished before step H can begin.
|
||||
Step Q must be finished before step S can begin.
|
||||
Step G must be finished before step X can begin.
|
||||
Step T must be finished before step O can begin.
|
||||
Step P must be finished before step O can begin.
|
||||
Step T must be finished before step V can begin.
|
||||
Step N must be finished before step V can begin.
|
||||
Step Z must be finished before step X can begin.
|
||||
Step L must be finished before step X can begin.
|
||||
Step Z must be finished before step Y can begin.
|
||||
Step N must be finished before step T can begin.
|
||||
Step S must be finished before step T can begin.
|
||||
Step G must be finished before step K can begin.
|
||||
Step T must be finished before step X can begin.
|
||||
Step R must be finished before step X can begin.
|
7
2018/day_07/input_less
Normal file
7
2018/day_07/input_less
Normal file
@@ -0,0 +1,7 @@
|
||||
Step C must be finished before step A can begin.
|
||||
Step C must be finished before step F can begin.
|
||||
Step A must be finished before step B can begin.
|
||||
Step A must be finished before step D can begin.
|
||||
Step B must be finished before step E can begin.
|
||||
Step D must be finished before step E can begin.
|
||||
Step F must be finished before step E can begin.
|
176
2018/day_07/main.go
Normal file
176
2018/day_07/main.go
Normal file
@@ -0,0 +1,176 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type step struct {
|
||||
ID string
|
||||
time int
|
||||
next []*step
|
||||
prev []*step
|
||||
}
|
||||
|
||||
func alreadyExecuted(executed []string, steps []*step) bool {
|
||||
for _, s := range steps {
|
||||
found := false
|
||||
for _, e := range executed {
|
||||
if e == s.ID {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func alreadyInQueue(queue []string, s *step) bool {
|
||||
for _, q := range queue {
|
||||
if s.ID == q {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func main() {
|
||||
var queue []string
|
||||
var executionOrder []string
|
||||
stepAddr := make(map[string]*step)
|
||||
|
||||
file, err := os.Open("./input_less")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scan := bufio.NewScanner(file)
|
||||
for scan.Scan() {
|
||||
line := scan.Text()
|
||||
|
||||
splittedLine := strings.Split(line, " ")
|
||||
currentID := splittedLine[1]
|
||||
nextID := splittedLine[7]
|
||||
|
||||
currentStep, csExists := stepAddr[currentID]
|
||||
nextStep, nsExists := stepAddr[nextID]
|
||||
|
||||
if !csExists {
|
||||
cs := step{ID: currentID, time: int(currentID[0]) - 64}
|
||||
stepAddr[currentID] = &cs
|
||||
currentStep = &cs
|
||||
}
|
||||
if !nsExists {
|
||||
ns := step{ID: nextID, time: int(nextID[0]) - 64}
|
||||
stepAddr[nextID] = &ns
|
||||
nextStep = &ns
|
||||
}
|
||||
|
||||
currentStep.next = append(currentStep.next, nextStep)
|
||||
nextStep.prev = append(nextStep.prev, currentStep)
|
||||
}
|
||||
|
||||
for _, s := range stepAddr {
|
||||
if len(s.prev) == 0 {
|
||||
queue = append(queue, s.ID)
|
||||
}
|
||||
}
|
||||
sort.Strings(queue)
|
||||
i := 0
|
||||
for i < len(queue) {
|
||||
sPrev := stepAddr[queue[i]].prev
|
||||
if len(sPrev) == 0 || alreadyExecuted(executionOrder, sPrev) {
|
||||
executionOrder = append(executionOrder, queue[i])
|
||||
for _, n := range stepAddr[queue[i]].next {
|
||||
if !alreadyInQueue(queue, n) {
|
||||
queue = append(queue, n.ID)
|
||||
}
|
||||
}
|
||||
|
||||
queue = append(queue[:i], queue[i+1:]...)
|
||||
|
||||
sort.Strings(queue)
|
||||
i = 0
|
||||
} else {
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("Part One: %v\n", strings.Join(executionOrder, ""))
|
||||
|
||||
for _, s := range stepAddr {
|
||||
if len(s.prev) == 0 {
|
||||
queue = append(queue, s.ID)
|
||||
fmt.Printf("Added in queue: %v\n", s.ID)
|
||||
}
|
||||
}
|
||||
sort.Strings(queue)
|
||||
|
||||
currentTime := 0
|
||||
var times [2]int
|
||||
var workers [2]string
|
||||
var availableSteps []*step
|
||||
working := false
|
||||
executionOrder = make([]string, 0)
|
||||
for len(queue) > 0 || len(availableSteps) > 0 || working {
|
||||
if len(queue) > 0 {
|
||||
for i := 0; i < len(queue); i++ {
|
||||
fmt.Printf("Analyzing from queue step %v\t i:%v\n", queue[i], i)
|
||||
sPrev := stepAddr[queue[i]].prev
|
||||
if len(sPrev) == 0 || alreadyExecuted(executionOrder, sPrev) {
|
||||
availableSteps = append(availableSteps, stepAddr[queue[i]])
|
||||
for _, n := range stepAddr[queue[i]].next {
|
||||
if !alreadyInQueue(queue, n) {
|
||||
queue = append(queue, n.ID)
|
||||
fmt.Printf("Added in queue: %v\n", n.ID)
|
||||
}
|
||||
}
|
||||
fmt.Printf("Added to availableSteps: %v\n", queue[i])
|
||||
fmt.Printf("Removed from queue: %v\n", queue[i])
|
||||
queue = append(queue[:i], queue[i+1:]...)
|
||||
i = -1
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Slice(availableSteps, func(i, j int) bool {
|
||||
return availableSteps[i].ID < availableSteps[j].ID
|
||||
})
|
||||
if len(availableSteps) > 0 || working {
|
||||
for w := 0; w < len(workers); w++ {
|
||||
if workers[w] == "" && len(availableSteps) > 0 {
|
||||
workers[w] = availableSteps[0].ID
|
||||
times[w] = availableSteps[0].time
|
||||
working = true
|
||||
fmt.Printf("Assigned to worker %v step %v\n", w, availableSteps[0].ID)
|
||||
fmt.Printf("Removed from availableSteps: %v\n", availableSteps[0].ID)
|
||||
availableSteps = availableSteps[1:]
|
||||
} else if workers[w] != "" {
|
||||
times[w]--
|
||||
fmt.Printf("Decreased time of worker %v to %v\n", w, times[w])
|
||||
if times[w] == 0 {
|
||||
executionOrder = append(executionOrder, workers[w])
|
||||
fmt.Printf("Worker %v has completed step %v\n", w, workers[w])
|
||||
workers[w] = ""
|
||||
times[w] = 0
|
||||
//if times[0]+times[1]+times[2]+times[3]+times[4] == 0 {
|
||||
if times[0]+times[1] == 0 {
|
||||
working = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if working {
|
||||
currentTime++
|
||||
fmt.Printf("Increaset currentTime to %v\n", currentTime)
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Printf("Part Two: %v\t%v\n", currentTime, executionOrder)
|
||||
}
|
170
2018/day_07/prova.go
Normal file
170
2018/day_07/prova.go
Normal file
@@ -0,0 +1,170 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"sort"
|
||||
)
|
||||
|
||||
type graph map[string][]string
|
||||
|
||||
type task struct {
|
||||
time int
|
||||
task string
|
||||
}
|
||||
|
||||
func popMinimumTask(tasks []task) (int, string, []task) {
|
||||
var minTime = 2147483647
|
||||
var minTasks = make([]task, 0)
|
||||
for _, t := range tasks {
|
||||
if t.time < minTime {
|
||||
minTasks = []task{t}
|
||||
minTime = t.time
|
||||
} else if t.time == minTime {
|
||||
minTasks = append(minTasks, t)
|
||||
}
|
||||
}
|
||||
|
||||
var minTask task
|
||||
var minID = string("Z")
|
||||
|
||||
for _, t := range minTasks {
|
||||
if t.task <= minID {
|
||||
minID = t.task
|
||||
minTask = t
|
||||
}
|
||||
}
|
||||
|
||||
var removed = make([]task, 0)
|
||||
for _, val := range tasks {
|
||||
if !(val.task == minTask.task && val.time == minTask.time) {
|
||||
removed = append(removed, val)
|
||||
}
|
||||
}
|
||||
|
||||
return minTask.time, minTask.task, removed
|
||||
}
|
||||
|
||||
func popMinimumString(strs []string) (string, []string) {
|
||||
if len(strs) == 0 {
|
||||
return "", nil
|
||||
}
|
||||
min := strs[0]
|
||||
for _, str := range strs {
|
||||
if str < min {
|
||||
min = str
|
||||
}
|
||||
}
|
||||
var removed = make([]string, 0)
|
||||
for _, str := range strs {
|
||||
if str != min {
|
||||
removed = append(removed, str)
|
||||
}
|
||||
}
|
||||
return min, removed
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
var gr = make(graph)
|
||||
var incoming = make(map[string]int)
|
||||
var incomingSaved = make(map[string]int) // for Part 2
|
||||
|
||||
file, err := os.Open("input")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
var start, end string
|
||||
fmt.Sscanf(line, "Step %s must be finished before step %s can begin.", &start, &end)
|
||||
|
||||
if _, ok := gr[start]; ok {
|
||||
gr[start] = append(gr[start], end)
|
||||
} else {
|
||||
gr[start] = []string{end}
|
||||
}
|
||||
|
||||
if _, ok := incoming[end]; ok {
|
||||
incoming[end]++
|
||||
incomingSaved[end]++
|
||||
} else {
|
||||
incoming[end] = 1
|
||||
incomingSaved[end] = 1
|
||||
}
|
||||
}
|
||||
|
||||
var queue, taskQueue = make([]string, 0), make([]string, 0)
|
||||
|
||||
for key, value := range gr {
|
||||
sort.Strings(value)
|
||||
gr[key] = value
|
||||
if incoming[key] == 0 {
|
||||
queue = append(queue, key)
|
||||
}
|
||||
}
|
||||
|
||||
taskQueue = append(taskQueue, queue...)
|
||||
|
||||
var result string
|
||||
for len(queue) != 0 {
|
||||
sort.Strings(queue)
|
||||
init := queue[0]
|
||||
var temp []string
|
||||
for _, v := range queue {
|
||||
if v != init {
|
||||
temp = append(temp, v)
|
||||
}
|
||||
}
|
||||
queue = temp
|
||||
result += init
|
||||
for _, key := range gr[init] {
|
||||
incoming[key]--
|
||||
if incoming[key] == 0 {
|
||||
queue = append(queue, key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("Part 1: %s\n", result)
|
||||
|
||||
// Part 2
|
||||
var currentTime int
|
||||
var currentTask string
|
||||
var tasks = make([]task, 0)
|
||||
|
||||
for len(tasks) < 5 && len(taskQueue) > 0 {
|
||||
var next string
|
||||
if nxt, q := popMinimumString(taskQueue); q != nil {
|
||||
next = nxt
|
||||
taskQueue = q
|
||||
tasks = append(tasks, task{time: currentTime + int([]byte(next)[0]) - 4, task: next})
|
||||
}
|
||||
}
|
||||
|
||||
for len(tasks) > 0 || len(taskQueue) > 0 {
|
||||
currentTime, currentTask, tasks = popMinimumTask(tasks)
|
||||
for _, key := range gr[currentTask] {
|
||||
incomingSaved[key]--
|
||||
if incomingSaved[key] == 0 {
|
||||
taskQueue = append(taskQueue, key)
|
||||
}
|
||||
}
|
||||
for len(tasks) < 5 && len(taskQueue) > 0 {
|
||||
var next string
|
||||
if nxt, q := popMinimumString(taskQueue); q != nil {
|
||||
next = nxt
|
||||
taskQueue = q
|
||||
tasks = append(tasks, task{time: currentTime + int([]byte(next)[0]) - 4, task: next})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("Part 2: %v\n", currentTime)
|
||||
}
|
Reference in New Issue
Block a user