The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
\\ 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 <http://www.gnu.org/licenses/>.


\\ 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())
}