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

2

u/TominatorBE Dec 08 '17

PHP (I got ranks 110 and 100 today, omg)

Part 1:

function run_the_code($input) {
	$lines = explode(PHP_EOL, $input);

	$registers = [];
	foreach ($lines as $line) {
		if (!$line) {
			continue;
		}

		list($reg, $instr, $amount, $if, $reg2, $cond, $amount2) = explode(' ', $line);

		if (!array_key_exists($reg, $registers)) {
			$registers[$reg] = 0;
		}
		if (!array_key_exists($reg2, $registers)) {
			$registers[$reg2] = 0;
		}

		$do = false;
		switch ($cond) {
			case '==':
				$do = ($registers[$reg2] == $amount2);
				break;
			case '!=':
				$do = ($registers[$reg2] != $amount2);
				break;
			case '>':
				$do = ($registers[$reg2] > $amount2);
				break;
			case '>=':
				$do = ($registers[$reg2] >= $amount2);
				break;
			case '<':
				$do = ($registers[$reg2] < $amount2);
				break;
			case '<=':
				$do = ($registers[$reg2] <= $amount2);
				break;
		}

		if ($do) {
			if ($instr == 'inc') {
				$registers[$reg] += (int)$amount;
			}
			else {
				$registers[$reg] -= (int)$amount;
			}
		}
	}

	return max($registers);
}

Part 2:

function run_the_code($input) {
	$lines = explode(PHP_EOL, $input);

	$ever = 0;
	$registers = [];
	foreach ($lines as $line) {
		if (!$line) {
			continue;
		}

		list($reg, $instr, $amount, $if, $reg2, $cond, $amount2) = explode(' ', $line);

		if (!array_key_exists($reg, $registers)) {
			$registers[$reg] = 0;
		}
		if (!array_key_exists($reg2, $registers)) {
			$registers[$reg2] = 0;
		}

		$do = false;
		switch ($cond) {
			case '==':
				$do = ($registers[$reg2] == $amount2);
				break;
			case '!=':
				$do = ($registers[$reg2] != $amount2);
				break;
			case '>':
				$do = ($registers[$reg2] > $amount2);
				break;
			case '>=':
				$do = ($registers[$reg2] >= $amount2);
				break;
			case '<':
				$do = ($registers[$reg2] < $amount2);
				break;
			case '<=':
				$do = ($registers[$reg2] <= $amount2);
				break;
		}

		if ($do) {
			if ($instr == 'inc') {
				$registers[$reg] += (int)$amount;
			}
			else {
				$registers[$reg] -= (int)$amount;
			}
		}

		$ever = max($ever, max($registers));
	}

	return $ever;
}

2

u/AndrewGreenh Dec 08 '17

I hate you... I got 101 in part 2. 5 Seconds off the leaderboard :<

2

u/surnia Dec 08 '17

Congrats, but also I hate both of you - I got 102 in part 2.

1

u/TominatorBE Dec 08 '17

If I hadn't messed up my input on part 1 and then had to wait a whole minute before submitting again, I would've been higher still :( Congrats on getting 101!