File tree Expand file tree Collapse file tree 5 files changed +132
-0
lines changed Expand file tree Collapse file tree 5 files changed +132
-0
lines changed Original file line number Diff line number Diff line change @@ -40,3 +40,15 @@ The tests can be run with:
40
40
```
41
41
cabal test
42
42
```
43
+
44
+ ## Building the examples and other checker programs
45
+
46
+ Install the library globally on your system with:
47
+ ```
48
+ cabal install
49
+ ```
50
+
51
+ Then a checker program can be build with:
52
+ ```
53
+ ghc --make ProgramName.hs
54
+ ```
Original file line number Diff line number Diff line change
1
+ -- NWERC 2016 - Arranging Hat
2
+ -- See http://2016.nwerc.eu
3
+
4
+ module Main where
5
+
6
+ import Control.Monad
7
+ import Checktestdata
8
+
9
+ main :: IO ()
10
+ main = ctdMain $ do
11
+ n <- int 1 40
12
+ space
13
+ m <- int 1 400
14
+ newline
15
+ replicateM_ (fromIntegral n) $ do
16
+ replicateM_ (fromIntegral m) $ regex " [0-9]"
17
+ newline
Original file line number Diff line number Diff line change
1
+ -- NWERC 2016 - Careful Ascent
2
+ -- See http://2016.nwerc.eu
3
+
4
+ {-# OPTIONS_GHC -fno-warn-type-defaults #-}
5
+ module Main where
6
+
7
+ import Control.Monad
8
+ import Checktestdata
9
+
10
+ main :: IO ()
11
+ main = ctdMain $ do
12
+ x <- int (- (10 ^ 7 )) (10 ^ 7 )
13
+ space
14
+ y <- int (max 1 (abs x)) (10 ^ 8 )
15
+ newline
16
+
17
+ n <- int 0 100
18
+ newline
19
+
20
+ shields <- forM [1 .. n] $ \ i -> do
21
+ li <- int 0 y
22
+ space
23
+ ui <- int (li+ 1 ) y
24
+ space
25
+ fi <- floatP 0.1 10.0 0 10
26
+ newline
27
+ return (i,li,ui,fi)
28
+
29
+ -- Check for each pair that they don't intersect
30
+ assert $ and $
31
+ [ i == j || ui <= lj || uj <= li
32
+ | (i,li,ui,_) <- shields
33
+ , (j,lj,uj,_) <- shields
34
+ ]
Original file line number Diff line number Diff line change
1
+ -- NWERC 2016 - Free Weights
2
+ -- See http://2016.nwerc.eu
3
+
4
+ {-# OPTIONS_GHC -fno-warn-type-defaults #-}
5
+ module Main where
6
+
7
+ import Control.Monad
8
+ import Checktestdata
9
+ import Data.List
10
+
11
+ main :: IO ()
12
+ main = ctdMain $ do
13
+ n <- int 1 (10 ^ 6 )
14
+ newline
15
+
16
+ row1 <- repSep n space $ int 1 (10 ^ 9 )
17
+ newline
18
+ row2 <- repSep n space $ int 1 (10 ^ 9 )
19
+ newline
20
+
21
+ -- Check that each number appears exactly twice.
22
+ -- Numbers at odd positions should be equal to
23
+ -- the next number in the list, and numbers at
24
+ -- even positions should be smaller than the next.
25
+ let ws = sort $ row1 ++ row2
26
+ let check (i,v,w) | odd i = v == w
27
+ | otherwise = v < w
28
+ assert $ all check $ zip3 [1 .. ] ws (tail ws)
29
+
30
+ -- | Replicate the given script n times, separated by
31
+ -- something else.
32
+ repSep :: Integer -> CTD () -> CTD a -> CTD [a ]
33
+ repSep n sep a = forM [1 .. n] $ \ i -> when (i > 1 ) sep >> a
Original file line number Diff line number Diff line change
1
+ -- NCPC 2016 - Interception
2
+ -- See https://ncpc.idi.ntnu.no/ncpc2016/
3
+
4
+ import Checktestdata
5
+ import Control.Monad
6
+
7
+ main :: IO ()
8
+ main = ctdMain $ do
9
+ n <- int 4 250000
10
+ space
11
+ m <- int 1 500000
12
+ space
13
+ c1 <- int 1 (n- 1 )
14
+ space
15
+ c2 <- int 1 (n- 1 )
16
+ newline
17
+
18
+ assert $ n `mod` 2 == 0
19
+ assert $ c1 `mod` 2 == 1
20
+ assert $ c2 `mod` 2 == 1
21
+ assert $ c1 < c2
22
+
23
+ ab <- replicateM (fromInteger m) $ do
24
+ ai <- int 1 n
25
+ space
26
+ bi <- int 1 n
27
+ assert $ ai /= bi
28
+ if (ai `mod` 2 /= bi `mod` 2 ) then do
29
+ space
30
+ c <- int 1 n
31
+ newline
32
+ assert $ c == c1 || c == c2
33
+ else newline
34
+ return $ if ai > bi then (bi, ai) else (ai, bi)
35
+
36
+ assert $ unique ab
You can’t perform that action at this time.
0 commit comments