8000 feat: solution for wait for it: part One · christianotieno/adventofcode@416253f · GitHub
[go: up one dir, main page]

Skip to content

Commit 416253f

Browse files
feat: solution for wait for it: part One
1 parent 1b1ab70 commit 416253f

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

day6/waitForIt.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package day6
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"os"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
func WaitForIt(filePath string) int {
12+
file, err := os.Open(filePath)
13+
if err != nil {
14+
_ = fmt.Errorf("error opening file: %v", err)
15+
}
16+
defer func(file *os.File) {
17+
err := file.Close()
18+
if err != nil {
19+
return
20+
}
21+
}(file)
22+
23+
scanner := bufio.NewScanner(file)
24+
25+
var times, dist []int
26+
27+
for scanner.Scan() {
28+
line := scanner.Text()
29+
fields := strings.Fields(line)
30+
if len(fields) > 1 {
31+
values := convertToIntSlice(fields[1:])
32+
switch strings.ToLower(fields[0]) {
33+
case "time:":
34+
times = values
35+
case "distance:":
36+
dist = values
37+
}
38+
}
39+
}
40+
41+
if err := scanner.Err(); err != nil {
42+
_ = fmt.Errorf("error reading file: %v", err)
43+
}
44+
45+
ans := 1
46+
for i := 0; i < len(times); i++ {
47+
ans *= countValidDistances(times[i], dist[i])
48+
}
49+
50+ 10000
return ans
51+
}
52+
53+
func convertToIntSlice(strSlice []string) []int {
54+
intSlice := make([]int, len(strSlice))
55+
for i, v := range strSlice {
56+
num, err := strconv.Atoi(v)
57+
if err != nil {
58+
_ = fmt.Errorf("error converting string to int: %v", err)
59+
}
60+
intSlice[i] = num
61+
}
62+
return intSlice
63+
}
64+
65+
func convertToInt(values []int) int {
66+
result, multiplier := 0, 1
67+
for i := len(values) - 1; i >= 0; i-- {
68+
result += values[i] * multiplier
69+
multiplier *= 10
70+
}
71+
return result
72+
}
73+
74+
func countValidDistances(time, distance int) int {
75+
validDistances := 0
76+
for x := 0; x <= time; x++ {
77+
dx := x * (time - x)
78+
if dx >= distance {
79+
validDistances++
80+
}
81+
}
82+
return validDistances
83+
}

day6/waitForIt.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Time: 49 87 78 95
2+
Distance: 356 1378 1502 1882

day6/waitForItTestFile.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Time: 7 15 30
2+
Distance: 9 40 200

day6/waitForIt_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package day6
2+
3+
import "testing"
4+
5+
func TestWaitForIt(t *testing.T) {
6+
got := WaitForIt("waitForItTestFile.txt")
7+
expected := 352
8+
9+
if expected != got {
10+
t.Errorf("Expected: %d, got: %d", expected, got)
11+
}
12+
}

0 commit comments

Comments
 (0)
0