# 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.

To read the whole file, as one long string:

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

To read the file line by line:

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

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
println(index)
index = findnext(isequal(val), myarray, index+1)
end
``````

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

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.