| 1 | import Data.Int |
|---|
| 2 | import Data.Array.Base |
|---|
| 3 | import Data.Array.ST |
|---|
| 4 | import Control.Monad.ST |
|---|
| 5 | import System.Environment |
|---|
| 6 | |
|---|
| 7 | main :: IO () |
|---|
| 8 | main = do |
|---|
| 9 | [_nr, _len] <- getArgs |
|---|
| 10 | let nRounds = read _nr :: Int |
|---|
| 11 | len = read _len :: Int |
|---|
| 12 | stToIO $ do |
|---|
| 13 | arr <- newArray (1, len) 0 |
|---|
| 14 | |
|---|
| 15 | let spin :: STUArray s Int Int -> Int -> Int -> Int -> ST s () |
|---|
| 16 | spin _ r i n | i > n = return () |
|---|
| 17 | spin arr r i n = do x <- unsafeRead arr i |
|---|
| 18 | unsafeWrite arr i $ x + r |
|---|
| 19 | spin arr r (i + 1) n |
|---|
| 20 | |
|---|
| 21 | loop :: STUArray s Int Int -> Int -> ST s () |
|---|
| 22 | loop _ r | r > nRounds = return () |
|---|
| 23 | loop arr r = do |
|---|
| 24 | k <- getNumElements arr |
|---|
| 25 | spin arr r 0 (k - 1) |
|---|
| 26 | loop arr (r + 1) |
|---|
| 27 | |
|---|
| 28 | loop arr 1 |
|---|