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

```

• Prev by Date: Re: Sorting complex points
• Next by Date: Re: Version differences in Integrate with Min[] in the integrand
• Previous by thread: Re: spiral cipher
• Next by thread: Computation speeds: numerical vs symbolic