Advent of Code 2022: Day 6
This problem is not too complicated, as it only requires reading a single line of input and scanning the line for a particular condition with the substring.
The condition is checked using character sets: the idea is to count the unique characters over a given substring, reporting if every character in that substring is unique. I do this by checking if the character set for that substring is the same size as the substring:
if *cset(line[i+:size]) = size then { # return value }
The only novel piece of syntax I will mention is:
line[i+:size]
which is shorthand for
line[i:i+size]
and a handy way to say we want "size" elements starting from index "i".
Final Program
procedure main(inputs) local filename if *inputs = 1 then { filename := inputs[1] # Part 1 solution write("Part 1 marker is at: ", do_find(filename, 4)) # Part 2 solution write("Part 2 marker is at: ", do_find(filename, 14)) } else { write("Provide a filename of data") } end procedure do_find(filename, size) local file, marker file := open(filename) | stop("Could not open file") marker := find_marker(read(file), size) # <1> close(file) return marker end procedure find_marker(line, size) local i every i := 1 to (*line-size) do { # <2> if *cset(line[i+:size]) = size then { # <3> return i+size-1 # -1 for 0 index in answer <4> } } return -1 end
- Process the single line from the input file
- Try substrings from the start, where each substring is the required size.
- Check the size of the character set.
- Return the index for the first "marker" found: unicon is 1-indexed, but the question requires 0-index, so subtract 1.