Advent of Code (in MiniScript), Day 1
Tags: miniscript, adventofcode, programming
Published: 2022-12-03 18:34:42

I've decided to participate in the fun annual [Advent of Code](https://adventofcode.com) challenges.  I'll be posting solutions written in [MiniScript](https://miniscript.org), which is a great language for these sorts of tasks.  But so as to not spoil anybody's fun, I won't post them until at least a day or two after each challenge drops.  I encourage you to try them yourself before looking at my solutions!

(Yes, that's why I'm posting them late... not because I tend to procrastinate.  Really!)

Each challenge consists of two parts, and you only get to see the second part after correctly solving the first.  Note that the input file (and so, the correct answers) are randomly generated for each participant.  So if you follow along at home — which I urge you to do! — your answers will be different from mine.

In [Day 1](https://adventofcode.com/2022/day/1), we are given an input file that contains one number per line, with occasional blank lines.  Each batch of numbers between the blanks represents snack calories carried by one elf.  We are tasked with finding the maximum number of calories any elf has.

I chose to do this with [command-line MiniScript](https://miniscript.org/cmdline/).  My solution was straightforward: read each line, adding up a `curTotal` for the current elf as we go; and when we hit a blank (or null, indicating end-of-file), update our max total.
```
f = file.open("input.txt")

maxTotal = 0
curTotal = 0
while true
	line = f.readLine
	print line
	if not line then
		// done with elf
		if curTotal > maxTotal then maxTotal = curTotal
		print "Total: " + curTotal + "  Max: " + maxTotal
		curTotal = 0
	else
		curTotal = curTotal + val(line)
	end if
	if line == null then exit // end of file
end while
```

For my input file, the last max total shown was 71471, so I pasted that in on the Advent of Code site, and it was correct!

This unlocked Part B, in which we have to keep track of the top _3_ totals (and then report the some of those top 3).  This sounds much harder, but really isn't.  Instead of a single `maxTotal` variable, we keep a `top3` list.  After each elf, we just push the new total onto the list, sort it, and pull the lowest one off the front.  That way, the list always contains the biggest 3 numbers.

My first attempt _almost_ worked, but didn't print the sum of the top 3.  So I changed `exit` to `break` in my while loop, and added an additional `print top3.sum` at the end.

```
f = file.open("input.txt")

top3 = [0,0,0]
curTotal = 0
while true
	line = f.readLine
	print line
	if not line then
		// done with elf
		top3.push curTotal
		top3.sort
		top3.pull
		print "Total: " + curTotal + "  Top 3: " + top3
		curTotal = 0
	else
		curTotal = curTotal + val(line)
	end if
	if line == null then break // end of file
end while

print "Sum of top 3: " + top3.sum
```

So the last two lines of output looked like
> Total: 35525  Top 3: [69195, 70523, 71471]
> Sum of top 3: 211189

And again, this answer was correct!

As you can see, MiniScript is a fun and easy language for this sort of problem.  If you're new to it, check out the [1-page quick reference](https://miniscript.org/files/MiniScript-QuickRef.pdf) and see for yourself!  The Advent of Code challenges are quirky and fun.  I'll be posting more solutions over the rest of the month.  But please give them a try yourself!  And if you have questions, comments, or notes about a different approach, please post them in the comments below.  Happy coding!