From e50989bbbfcc51b183fe0fbd6f35eab8c63f4169 Mon Sep 17 00:00:00 2001 From: 808BiTT Date: Tue, 3 Dec 2024 08:00:04 -0500 Subject: [PATCH] day 2 done --- day2/main.go | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ day2/run | 4 ++ 2 files changed, 181 insertions(+) create mode 100644 day2/main.go create mode 100755 day2/run diff --git a/day2/main.go b/day2/main.go new file mode 100644 index 0000000..0051e00 --- /dev/null +++ b/day2/main.go @@ -0,0 +1,177 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func main() { + if len(os.Args) < 2 { + panic("Provide input file") + } + inputFile := os.Args[1] + + part1 := part1(inputFile) + fmt.Printf("(%s) Part 1: %d\n", inputFile, part1) + + part2 := part2(inputFile) + fmt.Printf("(%s) Part 2: %d\n", inputFile, part2) +} + +func part2(inputFile string) int { + input, err := os.Open(inputFile) + if err != nil { + panic(err) + } + defer input.Close() + + var rawReports []string + + scanner := bufio.NewScanner(input) + for scanner.Scan() { + rawReports = append(rawReports, scanner.Text()) + } + + safeReports := 0 + for _, report := range rawReports { + if safe2(report) { + safeReports++ + } + } + + return safeReports +} + +func safe2(line string) bool { + var safe bool + + levels := strings.Split(line, " ") + levelInts := make([]int, len(levels)) + for i, level := range levels { + fmt.Sscanf(level, "%d", &levelInts[i]) + } + + // now we can remove any one level and check if it passes the 1-3 increasing or decreasing check + dampener := -1 + combinations := len(levelInts) + 1 + + for i := 0; i < combinations; i++ { + testArray := make([]int, 0) + if dampener > -1 { // we can try skipping a level + for j := 0; j < len(levelInts); j++ { + if j != dampener { + testArray = append(testArray, levelInts[j]) + } + } + } else { // try the original levels no skipping + for j := 0; j < len(levelInts); j++ { + testArray = append(testArray, levelInts[j]) + } + } + + var increasing bool + if testArray[1] > testArray[0] { + increasing = true + } else { + increasing = false + } + + for i := 1; i < len(testArray); i++ { + if increasing { + if testArray[i]-testArray[i-1] > 3 || testArray[i]-testArray[i-1] < 1 { + safe = false + break + } + if testArray[i] < testArray[i-1] { + safe = false + break + } + safe = true + } else { + if testArray[i-1]-testArray[i] > 3 || testArray[i-1]-testArray[i] < 1 { + safe = false + break + } + if testArray[i-1] < testArray[i] { + safe = false + break + } + safe = true + } + } + + if safe { // if we find a safe report we can return + return safe + } else { // if not we can try skipping levels using the dampener + dampener++ + } + } + + return safe +} + +func part1(inputFile string) int { + input, err := os.Open(inputFile) + if err != nil { + panic(err) + } + defer input.Close() + + var rawReports []string + + scanner := bufio.NewScanner(input) + for scanner.Scan() { + rawReports = append(rawReports, scanner.Text()) + } + + safeReports := 0 + for _, report := range rawReports { + if safe(report) { + safeReports++ + } + } + + return safeReports +} + +func safe(line string) bool { + // safe if all adjacent numbers differ by 1-3 (inclusive) + + levels := strings.Split(line, " ") + levelInts := make([]int, len(levels)) + for i, level := range levels { + fmt.Sscanf(level, "%d", &levelInts[i]) + } + + var increasing bool + if levelInts[1] > levelInts[0] { + increasing = true + } else { + increasing = false + } + + if increasing { + for i := 1; i < len(levelInts); i++ { + if levelInts[i]-levelInts[i-1] > 3 || levelInts[i]-levelInts[i-1] < 1 { + return false + } + + if levelInts[i] < levelInts[i-1] { + return false + } + } + return true + } else { + for i := 1; i < len(levelInts); i++ { + if levelInts[i-1]-levelInts[i] > 3 || levelInts[i-1]-levelInts[i] < 1 { + return false + } + if levelInts[i-1] < levelInts[i] { + return false + } + } + return true + } +} diff --git a/day2/run b/day2/run new file mode 100755 index 0000000..2ea19e2 --- /dev/null +++ b/day2/run @@ -0,0 +1,4 @@ +#!/bin/bash + +go build -o ./bin/solution ./main.go +./bin/solution "$1"