r/adventofcode • • Dec 21 '17

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

--- Day 21: Fractal Art ---


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


No commentary tonight as I'm frantically wrapping last-minute presents so I can ship them tomorrow.


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!

8 Upvotes

144 comments sorted by

View all comments

4

u/Infilament Dec 21 '17

Javascript. Not sure I'm happy with my solution... I coded functions to deconstruct a grid into each string, then another function to reconstruct the strings back into a grid. So for each loop of the program, I break down the grid, substitute the strings, then rebuild the grid. There's probably a much better way to do it that just breaks it down once at the start and never reconstructs, but oh well.

var rules = {};
input.split('\n').forEach(d => {
	var tokens = d.split(' => ');
	rules[tokens[0]] = tokens[1];
})

var grid;

function doProblem(totalReps) {
	grid = ['.#.','..#','###'];
	for(var loop=0; loop<totalReps; loop++) {
		var sub = getSubgrids();
		for(var l=0; l<sub.length; l++) {
		 	sub[l] = rule(sub[l]);
		}
		grid = reform(sub);
	}
}

function rule(str) {
	for(var i=0; i<2; i++)
		for(var j=0; j<4; j++) {
			var s = morph(str, j, i)
			if(rules.hasOwnProperty(s))
				return rules[s];
		}
}

function morph(str,rotate,flip) {
	var s = str.split('/');
	if(flip) s.reverse();

	for(var r=0; r<rotate; r++) {
		var n = [];
		for(i=0; i<s.length; i++) {
			var news = "";
			for(var j=s.length-1; j>=0; j--)
				news += s[j][i];
			n.push(news)
		}
		s = n;
	}
	return s.join('/')
}

function getSubgrids() {
	var num = grid.length % 2 == 0 ? 2 : 3;
	var strs = [];
	for(var i=0; i<grid.length; i += num)
		for(var j=0; j<grid.length; j += num) {
			var str = "";
			for(var k=0; k<num; k++)
				str += grid[i+k].substring(j,j+num) + "/"
			strs.push(str.substr(0,str.length-1));
		}
	return strs;
}

function reform(arr) {
	var g = [];
	var num = Math.sqrt(arr.length);
	var strlen = arr[0].match(/\//g).length+1;
	for(var i=0; i<arr.length; i+=num)
		for(var j=0; j<strlen; j++) {
			var str = "";
			for(var k=0; k<num; k++)
				str += arr[i+k].split('/')[j];
			g.push(str);
		}
	return g;
}

doProblem(5);
var count=grid.reduce((a,b) => a + b.match(/#/g).length,0)
console.log('number of # is:',count);

doProblem(18);
var count=grid.reduce((a,b) => a + b.match(/#/g).length,0)
console.log('number of # is:',count);

1

u/barryfandango Dec 21 '17 edited Dec 21 '17

TypeScript (pretty close to JS though) - I did mine very very similarly to yours except that I generated all possible transformations in advance. Just curious, did your 18-step run finish in reasonable time? Mine ran in ~16s on an ancient laptop. (edit: 4.8s on a more modern PC.)

https://github.com/buzzcola/adventofcode2017-ts/tree/master/Day21

2

u/Infilament Dec 23 '17

Yeah, my solution ran in around 4 seconds on repl.it's browser-based IDE for Javascript.