Advent of Shell
I solved Advent of Code 2020, day 1, part 1 in pure AmigaShell. No ARexx! No cheating!
Approach
Forget head, tail, sed and other such Unix frivolities - or syntactic sugar like "for" and "while". Conditional branching with labels should be enough for everyone!
The tools used are mostly sort, which always sorts in
ascending order, and eval, which evaluates mathematical
expressions and bitwise logical operations.
For fetching values from the data, I opted for the line editor,
edit, which I use to extract a value from a row into
a temporary file which is then read into a variable. I also use
edit to treat the data file as a list, deleting
the first value after each completed loop.
It does take a while to run on my 14 MHz Amiga 1200. I didn't bother timing it, but probably at least a minute.
See a photo of it running (JPG, ~350K)
The code
Click here to show the code with comments.
copy 1.dat t:
cd t:
sort 1.dat 1.sort numeric
copy 1.sort 1.outer
echo "d 2 1000" > to_next
echo "d 1 1" > rem_1st
resident c:edit pure=force
resident c:eval pure=force
resident c:type pure=force
resident c:list pure=force
skip outer
lab outer
edit 1.outer v.outer with to_next > nil:
set outersize=`list 1.outer lformat="%L"`
if $outersize eq "empty"
skip fail
endif
edit 1.outer with rem_1st > nil:
set outerval=`type v.outer`
copy 1.sort 1.inner
skip inner
lab inner
edit 1.inner v.inner with to_next > nil:
set innersize=`list v.inner lformat="%L"`
if $innersize eq "empty"
skip outer back
endif
edit 1.inner with rem_1st > nil:
set innerval=`type v.inner`
set res=`eval $innerval + $outerval`
if val $res gt 2020
skip outer back
endif
if val $res eq 2020
set finalres=`eval $innerval * $outerval`
skip end
endif
skip inner back
lab fail
echo "No matches found in data."
lab end
echo "Final result: $finalres"
Download the code (text, ~1K)