Re: Re: spiral cipher

*To*: mathgroup at smc.vnet.net*Subject*: [mg55904] Re: [mg55850] Re: spiral cipher*From*: Daniel Lichtblau <danl at wolfram.com>*Date*: Sat, 9 Apr 2005 03:56:05 -0400 (EDT)*References*: <200504080536.BAA25067@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

zak wrote: > Thanks dh at metrohm.ch for your letter > i mean the following > moves={0, 5, 2, 7, 4, 6} > so the movement of the point will trace across the following points: > dat = {{0, 0}, {5, 0}, {5, 2}, {5 - 7, 2}, {5 - 7, 2 - 4}, {5 - 7 + 6, 2 - 4}} > > Show[Graphics[Line[dat]]]; > > will draw the spiral. > > the problem how to construct (dat List) from (moves List) > > regards > [...] There are various ways to do this. One is to use the basic four directions in a repeating list of the length of your input moves. Note that I remove the initial 0 in your moves list because it is not clear to me what it is doing there. moves = {5,2,7,4,6}; directions = {{1,0},{0,1},{-1,0},{0,-1}}; increments = moves * PadRight[{}, Length[moves], directions]; Now use FoldList to iteratively add the increments, beginning at the origin. In[11]:= dat = FoldList[Plus, {0,0}, increments] Out[11]= {{0, 0}, {5, 0}, {5, 2}, {-2, 2}, {-2, -2}, {4, -2}} Note that this is reasonably efficient. It will handle a million moves in under 2 seconds on my 1400 GHz machine. moves = Table[Random[Integer,10],{10^6}]; In[14]:= Timing[ increments = moves * PadRight[{}, Length[moves], directions]; dat = FoldList[Plus, {0,0}, increments]; ] Out[14]= {1.76 Second, Null} Daniel Lichtblau Wolfram Research

**References**:**Re: spiral cipher***From:*zak <chocolatez@gmail.com>