Perl-Sensitive Sunglasses PerlMonks

### Re: Spiraling integers

by jimX11 (Friar)
 on Aug 30, 2005 at 00:40 UTC ( #487614=note: print w/replies, xml ) Need Help??

Putting a real world twist on this interesting puzzle, the type of unexpected twists I often see, how would your solution adapt to the following alteration.

The client loves your solution, but asks how hard would it be to make the spiral start at the center.

Replies are listed 'Best First'.
Re^2: Spiraling integers
by ambrus (Abbot) on Aug 30, 2005 at 11:47 UTC

Easy, just subtract every number from n**2 + 1. See, here's the original spiral:

```1 2 3
8 9 4
7 6 5
We subtract it from 10,
```10-1 10-2 10-3
10-8 10-9 10-4
10-7 10-6 10-5
=
9 8 7
2 1 6
3 4 5

Also note that in my J solution, all you have to do is to change the /: operator to \:. Can you do this with a one-charater change to any other existing solutions? :)

Re^2: Spiraling integers
by Elijah (Hermit) on Aug 30, 2005 at 00:53 UTC
Easy,

First: start \$cnt as \$n*\$n instead of 1.
Second: change while loop to continue until \$cnt is not greater then 0.
Third: decrement \$cnt everywhere it was incremented before.

```#!/usr/bin/perl -w

use strict;

print "Enter n: ";
chomp(my \$n = <>);

my @shiza;
my \$firstD = my \$secondD = 0;
my \$cnt    = \$n*\$n;
my \$inc     = 1;

while (\$cnt > 0) {
while (!\$shiza[\$firstD][\$secondD] && \$secondD < \$n && \$inc == 1) {
\$shiza[\$firstD][\$secondD] = \$cnt;
\$secondD++ unless(\$shiza[\$firstD][\$secondD+1] || (\$secondD+1) >=
+ \$n);
\$cnt--;
}
\$firstD++;

while (!\$shiza[\$firstD][\$secondD] && \$firstD < \$n && \$inc == 1) {
\$shiza[\$firstD][\$secondD] = \$cnt;
\$firstD++ unless(\$shiza[\$firstD+1][\$secondD] || (\$firstD+1) >= \$
+n);
\$cnt--;
}
\$secondD--;
\$inc = 0;

while (!\$shiza[\$firstD][\$secondD] && \$secondD >= 0 && \$inc == 0) {
\$shiza[\$firstD][\$secondD] = \$cnt;
\$secondD-- unless(\$shiza[\$firstD][\$secondD-1] || (\$secondD-1) <
+0);
\$cnt--;
}
\$firstD--;

while (!\$shiza[\$firstD][\$secondD] && \$firstD >= 0 && \$inc == 0) {
\$shiza[\$firstD][\$secondD] = \$cnt;
\$firstD-- unless(\$shiza[\$firstD-1][\$secondD] || (\$firstD-1) < 0)
+;
\$cnt--;
}
\$secondD++;
\$inc = 1;
}

for (@shiza) {
for (@{\$_}) {
print "\$_\t" if(\$_);
}
print "\n";
}
Re^2: Spiraling integers
by lidden (Curate) on Aug 31, 2005 at 11:56 UTC
Changing for (1 .. \$n * \$n ){ to for (reverse 1 .. \$n * \$n ){

Create A New User
Node Status?
node history
Node Type: note [id://487614]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (5)
As of 2019-10-23 01:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
In 2019 the site I miss most is:

Results (57 votes). Check out past polls.

Notices?