ElliSoft
Menu
  • Home
  • Retro Computing
  • Micro Fiction
  • Flash Fiction
  • Geocaching
  • Geocache Stats
  • Genealogy
Menu

Advent of Code 2023 Day 1

Posted on 12 June 2024 by Jon

Here we go then, the 1st day of 2023’s Advent of Code. 

Day 1 looked deceptively simple, with part 1 completed in pretty quick time. The only real problem was the large amount of data caused memory overflow issues, so I split it into 4 separate parts for the data statements.

I’ll list some code segments with explanation on how I did it below, but I don’t want to post the answers for this current year on here for obvious reasons.

First off, declaring the variables:

I used two subroutines to do the number crunching. It’s not very complicated, this one is used to find the left most number. It’s first set to 100 so we have a benchmark to compare against later on. It then simply loops through each character based on the length of the string and compares it to a digit.

LN (Left Number) is set to a multiple of 10 to satisfy the problem – so if 3 is found first, it needs to be set to 30 as we want to add the single last digit of the string to it. i.e. if the last digit found is 5 then the value for this line would be 35.

Once a left number is found, the loop obviously needs to exit to prevent it finding any more numbers – so we exit as soon as LN is less than 100 (i.e. any of the other values).

SUB FINDNUMSL (TEST$ AS STRING * 96) STATIC
L=LEN(TEST$)
LN = 100  'set to an unfindable value - only required for LN
FOR I=0 TO L-1
    M=MID$(TEST$, I, 1)
    ' Test for left numeric only
    IF M="0" THEN 
    LN=0 
    END IF
    IF M="1" THEN 
    LN=10 
    END IF
    IF M="2" THEN 
    LN=20
    END IF
    IF M="3" THEN 
    LN=30 
    END IF
    IF M="4" THEN 
    LN=40 
    END IF
    IF M="5" THEN 
    LN=50 
    END IF
    IF M="6" THEN 
    LN=60 
    END IF
    IF M="7" THEN 
    LN=70 
    END IF
    IF M="8" THEN 
    LN=80 
    END IF
    IF M="9" THEN 
    LN=90
    END IF
    IF LN < 100 THEN ' We need to exit the loop as soon as a numeric is found
    EXIT FOR
    END IF
NEXT I
    ' Left most digit found
    ' End subroutine
END SUB

The subroutine for the right most number, imaginatively called FINDNUMSR, is almost identical except for 2 differences. We set RN to the single digit as opposed to a multiple of 10, as that will be added to LN, and we don’t exit the loop, meaning we keep going until the end so that RN holds the last value in that string.

With the SUBS setup it’s just a matter of cycling through each input line, calling them both, and totalling up the values as we go.

And as I said, I did this 3 more times for the other 750 lines of data, which yes is a bit cheaty but then XC=BASIC makes me lazy.

Part 2 was trickier as we had to find actual strings of digits that would take precedent over the digits themselves, so if the string looked something like ‘iuskjnineij5hkjlcnd6slkj8klmsstwo‘ the result we want is 92.

To accomplish this I just did more of the same and added extra logic into both subroutines, again exiting the loop early for the left number and letting it complete for the right number.

    'Part 2
    IF M = "o" AND MID$(TEST$,I+1,1) = "n" AND MID$(TEST$,I+2,1) = "e" THEN
    LN=10
    END IF
    IF M = "t" AND MID$(TEST$,I+1,1) = "w" AND MID$(TEST$,I+2,1) = "o" THEN
    LN=20
    END IF
    IF M = "t" AND MID$(TEST$,I+1,1) = "h" AND MID$(TEST$,I+2,1) = "r" AND MID$(TEST$,I+3,1) = "e" AND MID$(TEST$,I+4,1) = "e" THEN
    LN=30
    END IF
    IF M = "f" AND MID$(TEST$,I+1,1) = "o" AND MID$(TEST$,I+2,1) = "u" AND MID$(TEST$,I+3,1) = "r" THEN
    LN=40
    END IF
    IF M = "f" AND MID$(TEST$,I+1,1) = "i" AND MID$(TEST$,I+2,1) = "v" AND MID$(TEST$,I+3,1) = "e" THEN
    LN=50
    END IF
    IF M = "s" AND MID$(TEST$,I+1,1) = "i" AND MID$(TEST$,I+2,1) = "x" THEN
    LN=60
    END IF
    IF M = "s" AND MID$(TEST$,I+1,1) = "e" AND MID$(TEST$,I+2,1) = "v" AND MID$(TEST$,I+3,1) = "e" AND MID$(TEST$,I+4,1) = "n" THEN
    LN=70
    END IF
    IF M = "e" AND MID$(TEST$,I+1,1) = "i" AND MID$(TEST$,I+2,1) = "g" AND MID$(TEST$,I+3,1) = "h" AND MID$(TEST$,I+4,1) = "t" THEN
    LN=80
    END IF
    IF M = "n" AND MID$(TEST$,I+1,1) = "i" AND MID$(TEST$,I+2,1) = "n" AND MID$(TEST$,I+3,1) = "e" THEN
    LN=90
    END IF
    ' End of part 2

The total run time, for both part 1 and part 2 in the same script was 12 minutes 56 seconds.

This screen shows just 1 part completing – there were 3 more after this and I totalled up the output for my answers.

Share this:

  • Click to share on Facebook (Opens in new window)
  • Click to share on X (Opens in new window)
  • Click to share on Mastodon (Opens in new window)
  • Click to share on Bluesky (Opens in new window)
Category: Retro Computing

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

  • October 2024
  • August 2024
  • June 2024
  • June 2023
  • April 2023
  • Does Every Family Have One?
  • I’m going to be rich, rich I tell you!
  • All Around The Wold
  • Advent of Code 2023 Day 1
  • Advent of Code Prep – 2023
Goodreads: Book reviews, recommendations, and discussion

Jon's books

Men Without Women
liked it
Men Without Women
by Haruki Murakami
Prophet Song
it was ok
Prophet Song
by Paul Lynch
This is the first Booker winner I couldn’t get on with. The writing style annoyed me. I found it a hard slog to get through which isn’t what I generally look for in a book. Anyway, not for me, and if we all liked the same books what a bo...
Three Men in a Boat
Three Men in a Boat
by Jerome K. Jerome
Naked Lunch
Naked Lunch
by William S. Burroughs
Three at the Angel
Three at the Angel
by Maurice Procter

goodreads.com
Follow me on Mastodon
Mastodon
© 2024 ElliSoft | Powered by Minimalist Blog WordPress Theme