working i think
This commit is contained in:
commit
32b4e078ea
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.swp
|
||||
spiral
|
||||
*.hi
|
||||
*.o
|
30
README.md
Normal file
30
README.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Spiral
|
||||
|
||||
bad attempts at solving interview questions
|
||||
|
||||
## The Problem - Verbatim
|
||||
|
||||
Write a small program which:
|
||||
accepts on the command line an odd number N
|
||||
outputs a sequence of numbers corresponding to the following steps:
|
||||
the numbers 1 through N^2 are written in a grid
|
||||
the first number in the sequence is the number in the center of the grid
|
||||
the subsequent numbers are found by spiraling out clockwise, starting to the right
|
||||
For example, for N = 3 we have the grid:
|
||||
1 2 3
|
||||
4 5 6
|
||||
7 8 9
|
||||
So we start with 5, head right to 6, then down to 9, left through 8 and 7, up through 4 and 1 and finally right through 2 and 3. This gives the output:
|
||||
5, 6, 9, 8, 7, 4, 1, 2, 3, end
|
||||
|
||||
For N=5 the output should be:
|
||||
13, 14, 19, 18, 17, 12, 7, 8, 9, 10, 15, 20, 25, 24, 23, 22, 21, 16, 11, 6, 1, 2, 3, 4, 5, end
|
||||
|
||||
IMPORTANT: your solution should not make use of arrays or matrices of numbers. If you are unable to determine a way to solve it without arrays/matrices then a solution with them is better than no solution.
|
||||
|
||||
## Compiling and Running
|
||||
|
||||
```
|
||||
ghc -02 -Wall Spiral.hs -o spiral
|
||||
spiral
|
||||
```
|
58
spiral.hs
Normal file
58
spiral.hs
Normal file
@ -0,0 +1,58 @@
|
||||
import System.IO
|
||||
|
||||
data Incarnation = S Bool Bool Int (Int,Int) Int Int
|
||||
|
||||
seed :: Int -> Int
|
||||
seed n = 1 + (h * (n+1))
|
||||
where h = (div n 2)
|
||||
|
||||
lineage :: Int -> [Int]
|
||||
lineage n = take (n*n) $ futures (atom n)
|
||||
|
||||
atom :: Int -> Incarnation
|
||||
atom n = S False True 1 (1,0) (seed n) n
|
||||
|
||||
xor :: Bool -> Bool -> Bool
|
||||
xor a b = (a || b) && (not (a && b))
|
||||
|
||||
futures :: Incarnation -> [Int]
|
||||
futures self@(S _ _ _ _ l _) =
|
||||
(l:(futures (evolve self)))
|
||||
|
||||
divine :: Incarnation -> Int
|
||||
divine (S v s _ _ l n) = l `sign` val
|
||||
where
|
||||
sign = if s then (+) else (-)
|
||||
val = if v then n else 1
|
||||
|
||||
evolve :: Incarnation -> Incarnation
|
||||
evolve i@(S v s cd (so,sn) _ b)
|
||||
| cd > 1 = (S v s (cd-1) (so,sn) (divine i) b)
|
||||
| otherwise =
|
||||
(S (not v) (s `xor` v) (cs ns) ns (divine i) b)
|
||||
where
|
||||
ns = (intuit v (so,sn))
|
||||
cs = (if v then fst else snd)
|
||||
|
||||
intuit :: Bool -> (Int,Int) -> (Int,Int)
|
||||
intuit True (a,b) = ((a+1),b)
|
||||
intuit _ (a,b) = (a,(b+1))
|
||||
|
||||
-- blurgh io
|
||||
-- bloating the program making me import stuff >:(
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
putStr "destinies to observe: "
|
||||
hFlush stdout
|
||||
args <- getLine
|
||||
mapM_ putStrLn
|
||||
$ map (\n -> ("n=" ++ (show n) ++ " ~ ")
|
||||
++ (if (aura n)
|
||||
then (show (lineage (read n)))
|
||||
else "[ soul contains invalid aura ]"))
|
||||
(words args)
|
||||
|
||||
aura :: String -> Bool
|
||||
aura s = foldr (&&) True
|
||||
(map (`elem` ['0'..'9']) s)
|
Loading…
Reference in New Issue
Block a user