AOC-2024/02/main.go
2024-12-02 18:55:02 +01:00

115 lines
2 KiB
Go

package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
const FILE_PATH = "./input.txt"
//const FILE_PATH = "./sample.txt"
func LoadInput(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return nil, err
}
return lines, nil
}
func TransformInput(lines []string) [][]int {
var result [][]int
var temp []int
var numb int
for _, line := range lines {
var numbs = strings.Split(line, " ")
temp = make([]int, len(numbs))
for i := 0; i < len(numbs); i++ {
numb, _ = strconv.Atoi(numbs[i])
temp[i] = numb
}
result = append(result, temp)
}
return result
}
func IsLineSafe(input []int) bool {
var decreasing = input[0] > input[1]
var dif = 0
for i := 0; i < len(input)-1; i++ {
if input[i] > input[i+1] && !decreasing || input[i] < input[i+1] && decreasing {
return false
}
dif = int(math.Abs(float64(input[i] - input[i+1])))
if dif < 1 || dif > 3 {
return false
}
}
return true
}
func Part1(input [][]int) int {
var result = 0
for _, line := range input {
if IsLineSafe(line) {
result++
}
}
return result
}
func Part2(input [][]int) int {
var result = 0
var temp []int
for _, line := range input {
if IsLineSafe(line) {
result++
continue
}
for i := 0; i < len(line); i++ {
temp = make([]int, 0)
temp = append(temp, line[:i]...)
temp = append(temp, line[i+1:]...)
if IsLineSafe(temp) {
result++
break
}
}
}
return result
}
func main() {
input, err := LoadInput(FILE_PATH)
if err != nil {
fmt.Println("Error loading input:", err)
return
}
structuredInput := TransformInput(input)
fmt.Println("Structured Input:", structuredInput)
fmt.Println("Solution Part 1: ", Part1(structuredInput))
fmt.Println("Solution Part 2: ", Part2(structuredInput))
}