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>
- Re: spiral cipher