Beefy Boxes and Bandwidth Generously Provided by pair Networks
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??


in reply to Spiraling integers

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,

    I made three simple changes.
    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 ){

Log In?
Username:
Password:

What's my password?
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?
    Notices?