Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Spiral Numbers

Name: Anonymous 2009-05-01 20:05

Hello /prog/, I have a challenge for you.

It's called spiral numbers.  Being the expert programmers you are you've probably already have heard of it, but if not it goes a little something like this:

Given two positive integers a and b, output on the screen a rectangle with width = b numbers and height = a rows, containing the numbers from 1 to a*b in a spiraling fashion, as shown below.  For a = 4 and b = 3, the output is:

    1    2    3
    10    11    4
    9    12    5
    8    7    6

The columns must be properly n+1 positions, where n is the number of digits in the decimal representation of a *b.

Write a program that prompts for a and b and then displays the appropriate rectangle of numbers.

Example:
    If a = 3 and b = 4, the above rectangle should be

    1    2    3    4
    10    11    12    5
    9    8    7    6


Here's some more examples from my own implementation written in snake tongue.



Have fun!
H:\Documents\Python\Program of the week>"april15 Spiral.py"
Width:8
Height:12
1       2       3       4       5       6       7       8
36      37      38      39      40      41      42      9
35      64      65      66      67      68      43      10
34      63      84      85      86      69      44      11
33      62      83      96      87      70      45      12
32      61      82      95      88      71      46      13
31      60      81      94      89      72      47      14
30      59      80      93      90      73      48      15
29      58      79      92      91      74      49      16
28      57      78      77      76      75      50      17
27      56      55      54      53      52      51      18
26      25      24      23      22      21      20      19

Name: Anonymous 2009-05-02 1:01


import List
import IO

spiral' a b i t | a == 0    = []
                | b == 0    = []
                | otherwise = [i+1..b+i]:(map reverse $ transpose $ spiral' b (a-1) (i+b) t)

spiral a b = spiral' a b 0 (a*b)

pad l str | length str < l = (++) str $ replicate (l - length str) ' '
          | otherwise      = str

printSpiral []           _ = return ()
printSpiral ([]:xss)     l = putChar '\n' >> printSpiral xss l
printSpiral ((x:xs):xss) l = putStr (pad l $ show x) >> printSpiral (xs:xss) l

main = do
    putStr "Width:"
    hFlush stdout
    w <- readLn
    putStr "Height:"
    hFlush stdout
    h <- readLn
    printSpiral (spiral h w) ((+1).length $ show $ w*h)

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List