DEV Community

Cover image for DAY 12 - Advent of Code 2020 w/ GoLang
Edvin
Edvin

Posted on

1

DAY 12 - Advent of Code 2020 w/ GoLang

DAY12:
Hey! Finished part 2 with a few 🍻 on this rainy Georgia saturday.

So part one was pretty straightforward. It just wanted you to walk the grid while tracking the x and y points and find the manhattan distance traveled.

Part two was slightly trickier, but it was boiled down to rotating one point around another. At least that was the main difference from part one. I used the same code structure from part one's main worker function and just modified it to take into account the rotation.

After struggling pretty hard on Day11, this was a nice problem to work through 😌

NOTE: Yeah, this is a bit verbose and much of the code was duplicated. I'm not pushing myself to get the perfect solution, but rather just getting the solution for fun. If you have questions, ask them in the comments!

package days

import (
    "fmt"
    "strconv"
    "strings"

    inputs "../inputs"
)

// https://adventofcode.com/2020/day/12
// Twelve : advent of code, day twelve part1 and 2
func Twelve() {
    inputSlice := inputs.Day12

    directions := [][]string{}
    directions = append(directions, []string{"E", "0"})
    for dir := range inputSlice {
        tmp := strings.Split(inputSlice[dir], " ")
        directions = append(directions, tmp)
    }

    waypointDirs := [][]string{}
    waypointDirs = append(waypointDirs, []string{"E", "0"})
    for dir := range inputSlice {
        tmp := strings.Split(inputSlice[dir], " ")
        waypointDirs = append(waypointDirs, tmp)
    }

    eastWest, northSouth := travel(directions)
    fmt.Print("(Part1) - Manhattan Distance of my ship: ")
    fmt.Println(absOfInt(eastWest) + absOfInt(northSouth))

    eastWest, northSouth = waypointTravel(waypointDirs)
    fmt.Print("(Part2) - Manhattan Distance of my ship: ")
    fmt.Println(absOfInt(eastWest) + absOfInt(northSouth))
}

func waypointTravel(directions [][]string) (int, int) {
    eastWest := 0
    northSouth := 0

    currentWaypointPosition := []int{eastWest + 10, northSouth + 1}

    for dir := range directions {
        asInt, _ := strconv.Atoi(directions[dir][1])
        switch directions[dir][0] {
        case "N":
            currentWaypointPosition[1] = currentWaypointPosition[1] + asInt
        case "S":
            currentWaypointPosition[1] = currentWaypointPosition[1] - asInt
        case "E":
            currentWaypointPosition[0] = currentWaypointPosition[0] + asInt
        case "W":
            currentWaypointPosition[0] = currentWaypointPosition[0] - asInt
        case "L":
            switch asInt {
            case 90:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest - offsetNorthSouth
                currentWaypointPosition[1] = northSouth + offsetEastWest
            case 180:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest - offsetEastWest
                currentWaypointPosition[1] = northSouth - offsetNorthSouth
            case 270:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest + offsetNorthSouth
                currentWaypointPosition[1] = northSouth - offsetEastWest
            default:
                fmt.Println("shrug1.")
            }
        case "R":
            switch asInt {
            case 90:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest + offsetNorthSouth
                currentWaypointPosition[1] = northSouth - offsetEastWest
            case 180:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest - offsetEastWest
                currentWaypointPosition[1] = northSouth - offsetNorthSouth
            case 270:
                offsetEastWest := currentWaypointPosition[0] - eastWest
                offsetNorthSouth := currentWaypointPosition[1] - northSouth

                currentWaypointPosition[0] = eastWest - offsetNorthSouth
                currentWaypointPosition[1] = northSouth + offsetEastWest
            default:
                fmt.Println("shrug2.")
            }
        case "F":
            offsetEastWest := currentWaypointPosition[0] - eastWest
            offsetNorthSouth := currentWaypointPosition[1] - northSouth

            eastWest = eastWest + ((currentWaypointPosition[0] - eastWest) * asInt)
            northSouth = northSouth + ((currentWaypointPosition[1] - northSouth) * asInt)

            currentWaypointPosition[0] = eastWest + offsetEastWest
            currentWaypointPosition[1] = northSouth + offsetNorthSouth
        default:
            fmt.Println("shrug4.")
        }
    }

    return eastWest, northSouth
}

func travel(directions [][]string) (int, int) {
    eastWest := 0
    northSouth := 0
    compass := []string{
        "N",
        "E",
        "S",
        "W",
    }

    currentDirection := directions[0][0]

    for dir := range directions {
        asInt, _ := strconv.Atoi(directions[dir][1])
        switch directions[dir][0] {
        case "N":
            northSouth = northSouth + asInt
        case "S":
            northSouth = northSouth - asInt
        case "E":
            eastWest = eastWest + asInt
        case "W":
            eastWest = eastWest - asInt
        case "L":
            switch asInt {
            case 90:
                // find current in compass and move down 1
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way-1 < 0 {
                            tmp := len(compass) - absOfInt(way-1)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way-1]
                            break
                        }
                    }
                }
            case 180:
                // find current in compass and move down 2
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way-2 < 0 {
                            tmp := len(compass) - absOfInt(way-2)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way-2]
                            break
                        }
                    }
                }
            case 270:
                // find current in compass and move down 3
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way-3 < 0 {
                            tmp := len(compass) - absOfInt(way-3)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way-3]
                            break
                        }
                    }
                }
            default:
                fmt.Println("shrug1.")
            }
        case "R":
            switch asInt {
            case 90:
                // find current in compass and move down 1
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way+1 >= len(compass) {
                            tmp := way + 1 - len(compass)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way+1]
                            break
                        }
                    }
                }
            case 180:
                // find current in compass and move down 2
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way+2 >= len(compass) {
                            tmp := way + 2 - len(compass)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way+2]
                            break
                        }
                    }
                }
            case 270:
                // find current in compass and move down 3
                for way := range compass {
                    if compass[way] == currentDirection {
                        if way+3 >= len(compass) {
                            tmp := way + 3 - len(compass)
                            currentDirection = compass[tmp]
                            break
                        } else {
                            currentDirection = compass[way+3]
                            break
                        }
                    }
                }
            default:
                fmt.Println("shrug2.")
            }
        case "F":
            switch currentDirection {
            case "N":
                northSouth = northSouth + asInt
            case "S":
                northSouth = northSouth - asInt
            case "E":
                eastWest = eastWest + asInt
            case "W":
                eastWest = eastWest - asInt
            default:
                fmt.Println("shrug3.")
            }
        default:
            fmt.Println("shrug4.")
        }
    }

    return eastWest, northSouth
}

func absOfInt(val int) int {
    if val < 0 {
        val = -val
    }

    return val
}

Enter fullscreen mode Exit fullscreen mode

Link to Github source file

Image of AssemblyAI tool

Challenge Submission: SpeechCraft - AI-Powered Speech Analysis for Better Communication

SpeechCraft is an advanced real-time speech analytics platform that transforms spoken words into actionable insights. Using cutting-edge AI technology from AssemblyAI, it provides instant transcription while analyzing multiple dimensions of speech performance.

Read full post

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

πŸ‘‹ Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay