Compare commits
No commits in common. "61a5da832e716af5437c2ce1ab51086ad84740e6" and "b713c68be999a516c2c84b6f05007838f3988fdb" have entirely different histories.
61a5da832e
...
b713c68be9
@ -1 +0,0 @@
|
|||||||
../inputs
|
|
||||||
126
day06/race.go
126
day06/race.go
@ -1,126 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
// "strings"
|
|
||||||
"bufio"
|
|
||||||
// "math"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"regexp"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Race struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
total int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Race) WeRaceBoys(time, distance int, wg *sync.WaitGroup) {
|
|
||||||
// As we just need to find the minimum necessary and then subtract it from
|
|
||||||
// the maximum, probably a good idea starting form the middle
|
|
||||||
tempTime := 0
|
|
||||||
for i := int(time/2); i > 0; i-- {
|
|
||||||
tempDist := i * (time - i)
|
|
||||||
if tempDist <= distance {
|
|
||||||
tempTime = i + 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the minimum is tempTime, then the maximum is time - tempTime
|
|
||||||
// time - 2*tempTime is the number of possible victories
|
|
||||||
r.mu.Lock()
|
|
||||||
r.total *= (time - (2 * tempTime - 1))
|
|
||||||
r.mu.Unlock()
|
|
||||||
wg.Done()
|
|
||||||
}
|
|
||||||
|
|
||||||
func MultRaceDist(time, dist []string) ([]int, []int){
|
|
||||||
tempT, tempD := make([]int, 0), make([]int, 0)
|
|
||||||
for i := range time {
|
|
||||||
num, _ := strconv.Atoi(time[i])
|
|
||||||
tempT = append(tempT, num)
|
|
||||||
num, _ = strconv.Atoi(dist[i])
|
|
||||||
tempD = append(tempD, num)
|
|
||||||
}
|
|
||||||
return tempT, tempD
|
|
||||||
}
|
|
||||||
|
|
||||||
func SingleRaceDist(time, dist []string) (int, int) {
|
|
||||||
strT, strD := "", ""
|
|
||||||
numT, numD := 0, 0
|
|
||||||
// Create two big strings
|
|
||||||
for i := range time {
|
|
||||||
strT += time[i]
|
|
||||||
strD += dist[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
numT, _ = strconv.Atoi(strT)
|
|
||||||
numD, _ = strconv.Atoi(strD)
|
|
||||||
|
|
||||||
return numT, numD
|
|
||||||
}
|
|
||||||
|
|
||||||
func check(e error) {
|
|
||||||
if e != nil {
|
|
||||||
panic(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func PrintAndWait(x ...any) {
|
|
||||||
fmt.Print(x...)
|
|
||||||
fmt.Scanln()
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
|
|
||||||
file, err := os.Open("./inputs/day06_input")
|
|
||||||
check(err)
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
// Struct for multiple races
|
|
||||||
rMult := Race{
|
|
||||||
total: 1,
|
|
||||||
}
|
|
||||||
// Struct for a single race
|
|
||||||
rSing := Race{
|
|
||||||
total: 1,
|
|
||||||
}
|
|
||||||
_ = &rSing
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
|
|
||||||
// Regex that finds the numbers in a row
|
|
||||||
renum := regexp.MustCompile("[0-9]+")
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(file)
|
|
||||||
time, distance := make([]int, 0), make([]int, 0)
|
|
||||||
tempStrings := make([]string, 0)
|
|
||||||
// Generic, would work for more rows
|
|
||||||
for scanner.Scan() {
|
|
||||||
tempStrings = append(tempStrings, scanner.Text())
|
|
||||||
}
|
|
||||||
// Now populate time and distance
|
|
||||||
timeStr := renum.FindAllString(tempStrings[0], - 1)
|
|
||||||
distStr := renum.FindAllString(tempStrings[1], - 1)
|
|
||||||
|
|
||||||
time, distance = MultRaceDist(timeStr, distStr)
|
|
||||||
|
|
||||||
// E.g.: if I hold the button for 1ms and then release it, it will travel at
|
|
||||||
// 1mm/ms fo the remaining amount of seconds.
|
|
||||||
// We can skip the holding down 0 and tMAX ms.
|
|
||||||
// Once we find the MIN amount of ms necessary to win, the limit is
|
|
||||||
// MAX - MIN
|
|
||||||
wg.Add(len(time))
|
|
||||||
for i := 0; i < len(time); i++ {
|
|
||||||
go rMult.WeRaceBoys(time[i], distance[i], &wg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Silly implementation of the single race
|
|
||||||
singT, singD := SingleRaceDist(timeStr, distStr)
|
|
||||||
wg.Add(1)
|
|
||||||
go rSing.WeRaceBoys(singT, singD, &wg)
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
fmt.Printf("Multiple races result: %d.\n", rMult.total)
|
|
||||||
fmt.Printf("Single race result: %d.\n", rSing.total)
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
Time: 59 79 65 75
|
|
||||||
Distance: 597 1234 1032 1328
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
Time: 7 15 30
|
|
||||||
Distance: 9 40 200
|
|
||||||
Loading…
x
Reference in New Issue
Block a user