language: BASIC (yabasic) prompt: https://adventofcode.com/2020/day/12


Fun fact: BASIC (C64 and later QBASIC) was my first programming language.


#!/usr/bin/env yabasic

sub solution_1()
    facing$ = "E"
    dim pos(2)
    pos(1) = 0
    pos(2) = 0

    open #8, "input", "r"
    while !eof(8)
        line input #8 command$

        op$ = left$(command$,1)
        amount = val(mid$(command$,2))

        switch op$
            case "R": facing$ = cardinal_rotate$(facing$, -amount) : continue
            case "L": facing$ = cardinal_rotate$(facing$, amount) : continue
        end switch

        move_dir$=facing$
        if (!op$ = "F") move_dir$ = op$

        switch move_dir$
            case "N": pos(1) = pos(1) - amount : break
            case "E": pos(2) = pos(2) + amount : break
            case "S": pos(1) = pos(1) + amount : break
            case "W": pos(2) = pos(2) - amount : break
        end switch
    end while
    close #8

    print "Ended at (", pos(1), ", ", pos(2), ")"
    print "The Manhattan distance from the start is ", abs(pos(1)) + abs(pos(2))
end sub

sub cardinal_rotate$(dir$, degrees)
    times = degrees / 90
    while (times < 1)
        times = times + 4
    end while

    while (times > 0)
        switch dir$
            case "N": dir$ = "W" : break
            case "W": dir$ = "S" : break
            case "S": dir$ = "E" : break
            case "E": dir$ = "N" : break
        end switch
        times = times - 1
    end while

    return dir$
end sub

sub solution_2()
    dim pos(2)
    pos(1) = 0
    pos(2) = 0
    dim waypoint(2)
    waypoint(1) = -1
    waypoint(2) = 10

    open #8, "input", "r"
    while !eof(8)
        line input #8 command$

        op$ = left$(command$,1)
        amount = val(mid$(command$,2))

        switch op$
            case "R": rotate(waypoint(), -amount) : break
            case "L": rotate(waypoint(), amount) : break
            case "F":
                pos(1) = pos(1) + waypoint(1) * amount
                pos(2) = pos(2) + waypoint(2) * amount
                break
            case "N": waypoint(1) = waypoint(1) - amount : break
            case "E": waypoint(2) = waypoint(2) + amount : break
            case "S": waypoint(1) = waypoint(1) + amount : break
            case "W": waypoint(2) = waypoint(2) - amount : break
        end switch
    end while
    close #8

    print "Ended at (", pos(1), ", ", pos(2), ")"
    print "The Manhattan distance from the start is ", abs(pos(1)) + abs(pos(2))
end sub

sub rotate(xy(), degrees)
    times = degrees / 90
    while (times < 1)
        times = times + 4
    end while

    while (times > 0)
        _temp = xy(1)
        xy(1) = -xy(2)
        xy(2) = _temp

        times = times - 1
    end while
end sub


solution_1()

solution_2()