Mercurial > hg > aoc
view 2017/03/app.d @ 2:4620ff0a058c
day 3
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Thu, 07 Dec 2017 11:44:51 -0500 |
parents | |
children |
line wrap: on
line source
import std.stdio; import std.math: realabs=abs; import std.complex; import std.conv: to; auto generateSpiral(numType)(numType x) { auto z = Complex!numType(0); auto i = Complex!numType(0, 1); auto direction = Complex!numType(1); numType stepsTillTurn = 1, stepsTaken = 0; bool maxedOnce = false; auto result = [z]; for(numType steps = 1; steps < x; steps++) { z += direction; stepsTaken++; result ~= z; if(stepsTaken == stepsTillTurn) { // Time to turn direction *= i; stepsTaken = 0; if(maxedOnce) { stepsTillTurn++; maxedOnce = false; } else { maxedOnce = true; } } } return result; } auto tallySpiral(numType)(Complex!numType[] spiral) { auto tally = [numType(1)]; for(auto i = 1; i < spiral.length; i++) { numType sum = 0; auto z = spiral[i]; for(auto j = 0; j < i; j++) { auto w = spiral[j]; if(abs(w - z) < 2) { sum += tally[j]; } } tally ~= sum; } return tally; } void main(string[] args){ auto target = to!double(args[1]); auto spiral = generateSpiral(target); auto end = spiral[$-1]; writeln(realabs(end.re) + realabs(end.im)); auto tally = tallySpiral(spiral); writeln(tally); }