aoc2021/day1.retro

54 lines
2.1 KiB
Plaintext

# Day 1: Sonar Sweep
## Part 1
First, put the input in a file called input1 and that test case a file called test1 (this is the pattern I am going to use throughout).
The solution is pretty simple: create variables to store the previous number and the count. Then loop through the file. If the current number is more than the previous, add one to the count. Then, store the current number in the variable from the previous one.
Prev is defined as being 9999, larger than any of the values in the file, so the first entry will always not be counted as higher (to avoid needing extra logic for the first entry). We also count the amount of lines the the file, to use in part 2.
~~~
'count var
'lines var
#9999 'prev var-n
~~~
then loop through the file counting up. Retro has a nice word, for-each-line, that does the looping.
~~~
'input1 [ s:to-number dup
@prev gt? [ &count v:inc ] if
!prev
&lines v:inc ] file:for-each-line
@count n:put ASCII:LF c:put
~~~
## Part 2
part 2 is a bit harder as we can't just iterate through the file like part 1 as we need to read three lines at once. The number of lines in the file is known, so we can read `lines - 2` windows and add them up. We need a file handle and to reset the variables from part 1:
~~~
'input1 file:R file:open 'f var-n
#99999 !prev
#0 !count
~~~
then, for each line in the file, we need to read that line and the next 2 lines, then seek back to the line straight after it. The only way I could think to do this is counting the amount of bytes we seek forward (using the length of the lines read) and then seeking that many bytes back, which is a bit of a pain. This is a terrible solution. This loop reads the 3 lines out of the file, adds up the values, and then uses the same logic as part 1 to find upwards changes from the previous window.
I'm not happy with this solution, but it works. Retro users, help me get better!
~~~
'seek-to var
@lines #2 - [
@f file:read-line dup s:length #1 + &seek-to v:inc-by s:to-number
#02 [ @f file:read-line s:to-number ] times
+ +
dup @prev gt? [ &count v:inc ] if
!prev
@seek-to @f file:seek ] times
@count n:put ASCII:LF c:put
@f file:close
~~~