Advent of Code with Julia

I enjoy Advent of Code every year. I like the small daily puzzles, and I certainly wouldn't want anything long and complicated every day. However, in order to add a bit of challenge, without resorting to racing, this year I'm using a language I don't really know. That's right, it's time for a periodic return to my Attempt to Learn Julia!

I've gotten a bit further than my last attempt. However, as with then, the tutorials/documentation are still not all that I'd hope. (I notice that they have many videos; however, when I'm trying to find the syntax for something, I don't want to watch a whole video hoping they'll mention it.) So here's a cheatsheet of some basic things I've figured out so far.

Loading data from a file

To read the whole file, as one long string:

open("filename.txt", "r") do f
    data = read(f, String)

To read the file line by line:

open("filename.txt", "r") do f
    for ln in eachline(f)

Once you've read that data, you might want to split it appart into a list:

mylist = split(ln)       # Defaults to splitting on whitespace
mylist = split(ln, ',')  # Or, provide a delimiter

If you had numbers in that data file of yours, you'll probably want to convert them from strings into numbers:

intval = parse(Int, stringval)
floatval = parse(Float64, stringval)

Searching in your string or array

Now that you have your data loaded, maybe you'll want to find a particular value. To check if a value is in your array (or a character in your string):

val in myarray

If you want to know where is the array your value is, you can use findfirst and findnext. Note that these will both return nothing if you search value is not in the array, and nothing cannot be used as a boolean, so if you want to go through all the occurences of your value, you'll need to check for it:

index = findfirst(isequal(val), myarray)
while index != nothing
    index = findnext(isequal(val), myarray, index+1)

These can be used with other conditions in place of isequal, including user defined predicates.

Regular Expressions

There are various tutorials online for using Regular Expressions in Julia, but they are mostly incorrect. It looks like the methods changed name at some point, so the examples in the tutorial no longer work. For version 1.5.3, you can find if a regular expression matches on your string with occursin:

occursin(r"abc", "abcdefg")


Substitions can be done with replace on arrays and strings, with a slight variation between the two. For arrays:

replace([1, 2, 3, 4, 5, 6], 1=>10, 2=>20)

For strings, the same format applies, but only one substition can be done. You can apply multiple rules by nesting calls to replace:

replace(replace("abcdef", "a"=>"x"), "b"=>"y")

However, for strings, replace can also be used with regular expression, which would allow more complicated substitutions, such as reordering substrings.