Spiral matrix: Difference between revisions

Reformatted second D version
(Simplified D code)
(Reformatted second D version)
Line 440:
[13, 22, 21, 20, 7]
[12, 11, 10, 9, 8]</pre>
Using a generator for any rectangular array.:
<lang d>import std.stdio ;
 
struct Spiral { /// 2D spiral 2d index generator
immutable int w,struct hSpiral ;{
int w, h;
 
struct Spiral { // spiral 2d index generator
immutable int w, h ;
int opApply(int delegate(ref int, ref int, ref int) dg) {
int dx = 1, dy, idx, x, y, xy, dx = 01, dy;
int[] subLen = [w, h-1] ;
 
void turn() { auto t = -dy ; dy = dx ; dx = t ; xy = 1 - xy ; }
void forwardturn(int d = 1) { x += d*dx ; y += d*dy ; idx += d ;}
auto t = -dy;
return 0 dy = dx;
dx = t;
xy = 1 - xy;
}
 
void forward(int d = 1) {
x += d * dx;
y += d * dy;
idx += d;
}
 
Bye:
while (true) {
if (subLen[xy] == 0) break ;
foreach(_; 0..subLen[xy]--) break;
foreach if(dg(idx,_; x,0 y)).. break Bye ; else forward(subLen[xy]--) ;
forward(-1) ; turn() ; forwardif ()dg(idx, ;x, y))
break Bye;
else
forward();
forward(-1);
turn();
forward();
}
 
return 0 ;
return 0;
}
}
 
auto spiralMatrix(int w, int h) {
auto m = new int[][](h, w) ;
foreach (ivalue, x, y; Spiral(w, h))
m[y][x] = i value;
return m ;
}
 
void main() {
foreach (r; spiralMatrix(9, 4))
writefln("%2s", r) ;
}</lang>
Output:
<pre>[ 0, 1, 2, 3, 4, 5, 6, 7, 8]
[21, 22, 23, 24, 25, 26, 27, 28, 9]
[20, 35, 34, 33, 32, 31, 30, 29, 10]
[19, 18, 17, 16, 15, 14, 13, 12, 11]</pre>
 
=={{header|E}}==
Anonymous user