\\ Copyright 2015 Kevin Ryde \\ This file is part of Math-PlanePath. \\ \\ Math-PlanePath is free software; you can redistribute it and/or modify it \\ under the terms of the GNU General Public License as published by the Free \\ Software Foundation; either version 3, or (at your option) any later \\ version. \\ \\ Math-PlanePath is distributed in the hope that it will be useful, but \\ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY \\ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License \\ for more details. \\ \\ You should have received a copy of the GNU General Public License along \\ with Math-PlanePath. If not, see . \\ This is a bit of fun drawing the flowsnake in ascii art for \\ http://codegolf.stackexchange.com/questions/50521/ascii-art-of-the-day-2-flow-snakes \\ ____ \\ ____ \__ \ \\ \__ \__/ / __ \\ __/ ____ \ \ \ ____ \\ / __ \__ \ \/ / __ \__ \ \\ ____ \ \ \__/ / __ \/ / __/ / __ \\ ____ \__ \ \/ ____ \/ / __/ / __ \ \ \ \\ \__ \__/ / __ \__ \__/ / __ \ \ \ \/ \\ __/ ____ \ \ \__/ ____ \ \ \ \/ / __ \\ / __ \__ \ \/ ____ \__ \ \/ / __ \/ / \\ \ \ \__/ / __ \__ \__/ / __ \ \ \__/ \\ \/ ____ \/ / __/ ____ \ \ \ \/ ____ \\ \__ \__/ / __ \__ \ \/ / __ \__ \ \\ __/ ____ \ \ \__/ / __ \/ / __/ / __ \\ / __ \__ \ \/ ____ \/ / __/ / __ \/ / \\ \/ / __/ / __ \__ \__/ / __ \/ / __/ \\ __/ / __ \ \ \__/ ____ \ \ \__/ / __ \\ / __ \ \ \ \/ ____ \__ \ \/ ____ \/ / \\ \ \ \ \/ / __ \__ \__/ / __ \__ \__/ \\ \/ / __ \/ / __/ ____ \ \ \__/ \\ \ \ \__/ / __ \__ \ \/ \\ \/ \ \ \__/ / __ \\ \/ ____ \/ / \\ \__ \__/ \\ __/ \\ \\ Each hexagon of the flowsnake is 2 characters and a line segment does \\ across its corners either by __, / or \. The loop goes over x,y and \\ calculates which of these to show at each location. Only moderate \\ attempts at minimizing. \\ \\ The code expresses a complex number z in base b=2+w and digits 0, 1, w^2, \\ ..., w^5, where w=e^(2pi/6) sixth root of unity. Those digits are kept \\ just as a distinguishing 1 to 7 then taken high to low for net rotation. \\ \\ This is in the style of Ed Shouten's http://80386.nl/projects/flowsnake/ \\ (xytoi) but only for net rotation, not making digits into an "N" index \\ along the path. \\ \\ The extents calculated are relative to an origin 0 at the centre of the \\ shape (not the start of the curve as in Math::PlanePath::Flowsnake). The \\ vecmin()/vecmax() calculate with centre of the little hexagons. Segments \\ other than the start and end are always / or \ and so go only to that \\ centre. But if the curve start or end are the maximum or minimum then \\ they are the whole hexagon so a +1 is needed. This only occurs for k=0 \\ for X minimum and k<3 for the X maximum. \\ \\ Pari has "quads" like sqrt(-3) builtin but the same can be done with real \\ and imaginary parts separately. k=3; { S = quadgen(-12); \\ sqrt(-3) w = (1 + S)/2; \\ sixth root of unity b = 2 + w; \\ base \\ base b low digit position under 2*Re+4*Im mod 7 index P = [0, w^2, 1, w, w^4, w^3, w^5]; \\ rotation state table T = 7*[0,0,1,0,0,1,2, 1,2,1,0,1,1,2, 2,2,2,0,0,1,2]; C = ["_","_", " ","\\", "/"," "]; \\ extents X = 2*sum(i=0,k-1, vecmax(real(b^i*P))); Y = 2*sum(i=0,k-1, vecmax(imag(b^i*P))); for(y = -Y, Y, for(x = -X+!!k, X+(k<3), \\ adjusted when endpoint is X limit z = (x- (o = (x+y)%2) - y*S)/2; v = vector(k,i, z = (z - P[ d = (2*real(z) + 4*imag(z)) % 7 + 1 ])/b; d); print1( C[if(z,3, r = 0; forstep(i=#v,1, -1, r = T[r+v[i]];); r%5 + o + 1)]) ); \\ r=0,7,14 mod 5 is 0,2,4 print()) }