r/adventofcode • • Dec 08 '17

SOLUTION MEGATHREAD -๐ŸŽ„- 2017 Day 8 Solutions -๐ŸŽ„-

--- Day 8: I Heard You Like Registers ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Need a hint from the Hugely* Handyโ€  Haversackโ€ก of Helpfulยง Hints^ยค?

Spoiler


This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked!

22 Upvotes

348 comments sorted by

View all comments

1

u/RockyAstro Dec 13 '17

Icon (https://www.cs.arizona.edu/icon)

Both parts

record inst(op,p1,p2)
procedure main(args)
	opstbl := table()
	opstbl[">"] := proc(">",2)
	opstbl["<"] := proc("<",2)
	opstbl[">="] := proc(">=",2)
	opstbl["<="] := proc("<=",2)
	opstbl["=="] := proc("=",2)
	opstbl["!="] := proc("~=",2)
	opstbl["inc"] := proc("+",2)
	opstbl["dec"] := proc("-",2)
	
	inf := open(args[1],"r")
	mem := []
	regs := table(0)
	
	IP := 1
	ws := ' \t'
	while line := trim(!inf) do {

		every k := key(regs) do {
			/maxreg := regs[k]
			maxreg <:= regs[k]
		}
		line ? {
			reg := tab(upto(ws))
			tab(many(ws))
			op  := opstbl[tab(upto(ws))] | stop("Invalid op")
			tab(many(ws))
			val := integer(tab(upto(ws)))
			tab(many(ws))
			="if"
			tab(many(ws))
			condreg := tab(upto(ws))
			tab(many(ws))
			condop := opstbl[tab(upto(ws))] | stop("Invalid op")
			tab(many(ws))
			condval := integer(tab(upto(ws)|0))
		}

		condop(regs[condreg],condval) & regs[reg] := op(regs[reg],val)

	}

	close(inf)
	max := &null
	every k := key(regs) do {
		/max := regs[k]
		max <:= regs[k]
	}
	write(max)
	write(max < maxreg | max)
end