This commit is contained in:
2024-12-09 01:33:33 +01:00
parent 022a451f7a
commit 2cda847908
6 changed files with 2314 additions and 0 deletions

170
Day01/.gitignore vendored Normal file
View File

@@ -0,0 +1,170 @@
# Created by https://www.toptal.com/developers/gitignore/api/go,goland+all,jetbrains+all
# Edit at https://www.toptal.com/developers/gitignore?templates=go,goland+all,jetbrains+all
### Go ###
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work
### GoLand+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### GoLand+all Patch ###
# Ignore everything but code style settings and run configurations
# that are supposed to be shared within teams.
.idea/*
!.idea/codeStyles
!.idea/runConfigurations
### JetBrains+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
# AWS User-specific
# Generated files
# Sensitive or high-churn files
# Gradle
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
# Mongo Explorer plugin
# File-based project format
# IntelliJ
# mpeltonen/sbt-idea plugin
# JIRA plugin
# Cursive Clojure plugin
# SonarLint plugin
# Crashlytics plugin (for Android Studio and IntelliJ)
# Editor-based Rest Client
# Android studio 3.1+ serialized cache file
### JetBrains+all Patch ###
# Ignore everything but code style settings and run configurations
# that are supposed to be shared within teams.
# End of https://www.toptal.com/developers/gitignore/api/go,goland+all,jetbrains+all

3
Day01/go.mod Normal file
View File

@@ -0,0 +1,3 @@
module Day01
go 1.23

2006
Day01/input.json Normal file

File diff suppressed because it is too large Load Diff

18
Day01/main.go Normal file
View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
)
const DAY int = 01
func main() {
fmt.Println("||++++++++++++++++++++++++++++||")
fmt.Printf("|| AdventOfCode 2024 - Day %02d ||\n", DAY)
fmt.Println("||++++++++++++++++++++++++++++||\n")
fmt.Println("Original Code")
original()
fmt.Println("\nOptimized Code by ChatGPT")
optimized()
}

59
Day01/optimized.go Normal file
View File

@@ -0,0 +1,59 @@
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"sort"
)
func optimized() {
// Read the file in one step
content, err := os.ReadFile("./input.json")
if err != nil {
log.Fatalf("Error when opening input.json: %v", err)
}
// Parse the JSON
var payload struct {
ListA []int `json:"list_a"`
ListB []int `json:"list_b"`
}
if err := json.Unmarshal(content, &payload); err != nil {
log.Fatalf("Error when unmarshalling input.json: %v", err)
}
// Part 1: Calculate the sum of absolute differences between sorted lists
sort.Ints(payload.ListA)
sort.Ints(payload.ListB)
sumPart1 := 0
for i := range payload.ListA {
sumPart1 += abs(payload.ListA[i] - payload.ListB[i])
}
fmt.Printf("Sum of Part 1: %d\n", sumPart1)
// Part 2: Calculate weighted sum of common elements
sumPart2 := 0
countMap := make(map[int]int)
for _, v := range payload.ListB {
countMap[v]++
}
for _, v := range payload.ListA {
if countMap[v] > 0 {
sumPart2 += v * countMap[v]
countMap[v] = 0 // Avoid double-counting
}
}
fmt.Printf("Sum of Part 2: %d\n", sumPart2)
}
// Helper function for absolute value
func abs(x int) int {
if x < 0 {
return -x
}
return x
}

58
Day01/original.go Normal file
View File

@@ -0,0 +1,58 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"sort"
)
func original() {
content, err := ioutil.ReadFile("./input.json")
if err != nil {
log.Fatal("Error when opening input.json: ", err)
}
var payload map[string][]int
err = json.Unmarshal(content, &payload)
if err != nil {
log.Fatal("Error when unmarshalling input.json: ", err)
}
// Part 1
listA := payload["list_a"]
listB := payload["list_b"]
sort.Ints(listA)
sort.Ints(listB)
sumPart1 := 0
for i := 0; i < len(listA); i++ {
if listA[i] > listB[i] {
sumPart1 += listA[i] - listB[i]
} else {
sumPart1 += listB[i] - listA[i]
}
}
fmt.Println("Sum of Part 1: ", sumPart1)
// Part 2
listA = payload["list_a"]
listB = payload["list_b"]
sumPart2 := 0
for _, v1 := range listA {
counter := 0
for _, v2 := range listB {
if v1 == v2 {
counter++
}
}
sumPart2 += counter * v1
}
fmt.Println("Sum of Part 2: ", sumPart2)
}