-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path11.hs
39 lines (28 loc) · 1.1 KB
/
11.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import Data.Char (ord)
parseInt :: String -> Int -> Int
parseInt [] n = n
parseInt (x:xs) n = parseInt xs (10 * n + (ord x)-(ord '0'))
-- read2DArr :: String -> [[Int]]
-- read2DArr s = (takeWhile (/= ' ') (takeWhile (/= '\n') s))
-- read2DArr s = (fmap (parseInt . lines) s)
valid :: Int -> Int -> Bool
valid x y = (&&) (x `elem` [0 .. 19]) (y `elem` [0 .. 19])
cell :: Int -> Int -> [[Int]] -> Int
cell x y b
| not (valid x y) = 0
| otherwise = (b !! x) !! y
chain :: [[Int]] -> (Int, Int) -> (Int, Int) -> Int -> Int
chain b p@(px,py) d@(dx,dy) 0 = cell px py b
chain b p@(px,py) d@(dx,dy) n = (cell px py b) * (chain b (px + dx, py + dy) d (n - 1))
solve :: [[Int]] -> Int
solve b = maximum [chain b (x,y) d 3 | x <- [0 .. 19], y <- [0 .. 19], d <- [(0, 1), (1, 0), (1, 1), (1, -1)] ]
blanks' :: Char -> [String] -> [String]
blanks' ' ' ss = [] : ss
blanks' c [] = [[c]]
blanks' c (s : ss) = (c : s) : ss
blanks :: String -> [String]
blanks = foldr blanks' []
main = do
str <- readFile "11.dat"
let b = fmap (\x -> (fmap (\y -> parseInt y 0) x)) (fmap blanks (lines str))
print $ solve b