Restyled README and file structure

Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
2020-12-25 23:50:29 +01:00
parent 0ba35ffae1
commit d8db2fcd5d
102 changed files with 7 additions and 32 deletions

101
2018/day_07/input Normal file
View 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
View 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
View 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
View 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)
}