Skip to content

Commit a6da24f

Browse files
committed
add day2
1 parent 4217423 commit a6da24f

File tree

4 files changed

+124
-1
lines changed

4 files changed

+124
-1
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
inputs.txt
2+
day?
3+
day??

day2/day2.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"github.com/fxnn/adventofcode2024/util"
7+
"os"
8+
"strconv"
9+
"strings"
10+
)
11+
12+
func levels(report string) []int {
13+
strVals := strings.Split(report, " ")
14+
levels := make([]int, len(strVals))
15+
for i := range strVals {
16+
var err error
17+
levels[i], err = strconv.Atoi(strVals[i])
18+
if err != nil {
19+
fmt.Fprintf(os.Stderr, "Error in Atoi: %s\n", err)
20+
os.Exit(1)
21+
}
22+
}
23+
return levels
24+
}
25+
26+
func isSafe(levels []int, index int) bool {
27+
firstDiff := levels[0] - levels[1]
28+
diff := levels[index-1] - levels[index]
29+
if diff == 0 || util.Abs(diff) > 3 {
30+
fmt.Printf(" unsafe diff (%d) at index %d\n", diff, index)
31+
return false
32+
}
33+
if util.Sign(diff) != util.Sign(firstDiff) {
34+
fmt.Printf(" unsafe sign (%d,%d) at index %d\n", util.Sign(diff), util.Sign(firstDiff), index)
35+
return false
36+
}
37+
return true
38+
}
39+
40+
func firstUnsafeIndex(levels []int) int {
41+
for i := range levels {
42+
if i > 0 {
43+
if !isSafe(levels, i) {
44+
return i
45+
}
46+
}
47+
}
48+
return -1
49+
}
50+
51+
func main() {
52+
scanner := bufio.NewScanner(os.Stdin)
53+
54+
safeReports := 0
55+
dampenedSafeReports := 0
56+
for scanner.Scan() {
57+
report := scanner.Text()
58+
levels := levels(report)
59+
fmt.Printf("report %v\n", report)
60+
61+
index := firstUnsafeIndex(levels)
62+
if index == -1 {
63+
safeReports++
64+
dampenedSafeReports++
65+
fmt.Printf(" safe\n")
66+
} else {
67+
var err error
68+
levels, err = util.RemoveElement(levels, index)
69+
fmt.Printf(" dampened %v\n", levels)
70+
if err != nil {
71+
fmt.Fprintf(os.Stderr, "Error in RemoveElement: %s\n", err)
72+
os.Exit(1)
73+
}
74+
if firstUnsafeIndex(levels) == -1 {
75+
dampenedSafeReports++
76+
fmt.Printf(" safe with dampener\n")
77+
}
78+
}
79+
}
80+
if err := scanner.Err(); err != nil {
81+
fmt.Fprintf(os.Stderr, "Error: %s\n", err)
82+
os.Exit(1)
83+
}
84+
fmt.Printf("safe reports: %d\n", safeReports)
85+
fmt.Printf("dampened safe reports: %d\n", dampenedSafeReports)
86+
}

day2/example.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
7 6 4 2 1
2+
1 2 7 8 9
3+
9 7 6 2 1
4+
1 3 2 4 5
5+
8 6 4 4 1
6+
1 3 6 7 9

util/util.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
package util
22

3+
import "fmt"
4+
35
// Abs calculates the absolute value of an integer
46
func Abs(x int) int {
5-
if x > 0 {
7+
if x < 0 {
68
return -x
79
}
810
return x
911
}
12+
13+
// Sign returns -1, 0 or 1 depending on the sign of the given integer
14+
func Sign(x int) int {
15+
if x > 0 {
16+
return 1
17+
}
18+
if x == 0 {
19+
return 0
20+
}
21+
return -1
22+
}
23+
24+
// RemoveElement removes element with given index from slice
25+
func RemoveElement(slice []int, index int) ([]int, error) {
26+
if index < 0 || index >= len(slice) {
27+
return nil, fmt.Errorf("index out of range")
28+
}
29+
30+
// Create a new slice and copy the elements before the index
31+
newSlice := make([]int, 0, len(slice)-1)
32+
newSlice = append(newSlice, slice[:index]...)
33+
34+
// Append the elements after the index
35+
newSlice = append(newSlice, slice[index+1:]...)
36+
37+
return newSlice, nil
38+
}

0 commit comments

Comments
 (0)