Created
December 16, 2008 14:08
-
-
Save cbilson/36463 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#light | |
open System | |
let text = @" | |
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 | |
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 | |
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 | |
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 | |
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 | |
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 | |
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 | |
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 | |
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 | |
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 | |
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 | |
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 | |
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 | |
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 | |
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 | |
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 | |
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 | |
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 | |
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 | |
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48" | |
// figure out how big the matrix is | |
let rows = text.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries).Length | |
let columns = text.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries).[0] | |
.Split([|' '|], StringSplitOptions.RemoveEmptyEntries).Length | |
// build it | |
let cells = text.Split([| ' '; '\n'; '\r' |], StringSplitOptions.RemoveEmptyEntries) | |
let grid = Array2.init rows columns <| fun x y -> int cells.[(columns * x) + y] | |
// define our moves | |
let moveDown x y = x, y + 1 | |
let moveRight x y = x + 1, y | |
let moveDiagnalDown x y = x + 1, y + 1 | |
let moveDiagnalUp x y = x + 1, y - 1 | |
let rec repeatMove f n x y = | |
match n with | |
| 0 -> x, y | |
| _ -> let x', y' = f x y | |
repeatMove f (n - 1) x' y' | |
let canMakeMoves f n w h x y = | |
let x', y' = repeatMove f n x y | |
x' >= 0 && x' <= w && y' >= 0 && y' <= h | |
let rec makeMoves f n x y (ms:'a[,]) = | |
match n with | |
| 0 -> [] | |
| _ -> let m = ms.[y, x] | |
let x', y' = f x y | |
m :: makeMoves f (n - 1) x' y' ms | |
// generate n-length sequences with a move, f | |
let rec processLine f n x y ms = | |
let h = Array2.length1 ms | |
let w = Array2.length2 ms | |
// TODO: I should combine canMakeMoves with makeMoves | |
match canMakeMoves f n w h x y with | |
| false -> [] | |
| true -> let m = makeMoves f n x y ms | |
let x', y' = repeatMove f 1 x y | |
m :: processLine f n x' y' ms | |
// generate n-length sequences with a move g, starting at a starting point | |
// moving with f | |
let rec processLines f g n x y ms = | |
let h = Array2.length1 ms | |
let w = Array2.length2 ms | |
match canMakeMoves f 1 w h x y with | |
| false -> [] | |
| true -> let m = processLine g n x y ms | |
let x', y' = repeatMove f 1 x y | |
m @ processLines f g n x' y' ms | |
// These are all of our n-length sequences | |
let sequences n ms = | |
processLines moveDown moveRight n 0 0 ms | |
@ processLines moveRight moveDown n 0 0 ms | |
@ processLines moveDown moveDiagnalDown n 0 0 ms | |
@ processLines moveDown moveDiagnalUp n 0 0 ms | |
@ processLines moveRight moveDiagnalDown n 0 0 ms | |
@ processLines moveRight moveDiagnalUp n 0 ((Array2.length2 ms) - 1) ms | |
let products xs = | |
xs |> List.map (fun x -> x |> List.reduce_left (*)) | |
let answer = | |
grid |> sequences 4 |> products |> Seq.max | |
do | |
printfn "The answer is: %d" answer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#light | |
open System | |
(* | |
let text = @" | |
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 | |
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 | |
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 | |
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 | |
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 | |
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 | |
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 | |
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 | |
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 | |
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 | |
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 | |
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 | |
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 | |
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 | |
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 | |
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 | |
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 | |
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 | |
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 | |
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48" | |
*) | |
let text = @" | |
08 02 22 97 | |
49 49 99 40 | |
81 49 31 73 | |
52 70 95 23 | |
" | |
let rows = text.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries).Length | |
let columns = text.Split([| '\r'; '\n' |], StringSplitOptions.RemoveEmptyEntries).[0] | |
.Split([|' '|], StringSplitOptions.RemoveEmptyEntries).Length | |
let cells = text.Split([| ' '; '\n'; '\r' |], StringSplitOptions.RemoveEmptyEntries) | |
let grid = Array2.init rows columns <| fun x y -> int cells.[(columns * x) + y] | |
let sequences grid n = | |
seq { | |
let lx = Array2.length1 grid | |
let ly = Array2.length2 grid | |
(* | |
// down | |
for i = 0 to lx - 1 do | |
for j = 0 to ly - n do yield seq { | |
for k = 0 to n - 1 do | |
printfn "%d, %d" i (j + k) | |
yield grid.[i,j+k] } | |
// across | |
for j = 0 to ly - 1 do | |
for i = 0 to lx - n do yield seq { | |
for k = 0 to n - 1 do | |
printfn "%d, %d" (i + k) j | |
yield grid.[i+k,j] } | |
// diagnal down from top side | |
// from 0 to the last column that can yield at least one n-length sequence | |
for i = 0 to lx - n do | |
for j = 0 to ly - n do yield seq { | |
for k = 0 to n - 1 do | |
yield grid.[i+k,j+k] } | |
// diagnal down from left side | |
// from 1 to the last row that can yield at least one n-length sequence | |
for j = 1 to ly - n do | |
for i = 0 to lx - n do yield seq { | |
for k = 0 to n - 1 do | |
yield grid.[i+k, j+k] } | |
// diagnal up from left side | |
for j = ly - 1 to n - 1 do | |
for i = 0 to lx - n do yield seq { | |
for k = 0 to n - 1 do | |
printfn "%d, %d" (i+k) (j-k) | |
yield grid.[i+k, j-k] } | |
*) | |
let is = seq { 0 .. lx - n } | |
let js = seq { ly - 1 .. -1 .. lx - n } | |
let ks = seq { 0 .. n - 1 } | |
is |> Seq.map (fun i -> | |
js |> Seq.map (fun j -> | |
ks |> Seq.map (fun k -> grid.[i + k, j - k]))) | |
// diagnal up from bottom | |
for i = 0 to lx - n do | |
printfn "diagnal up from bottom from %d, %d to %d, %d" i (ly - 1) (i + n - 1) (lx - n) | |
for j = ly - 1 to lx - n do yield seq { | |
printfn "from %d, %d to %d, %d" i j (i + n - 1) (j - n + 1) | |
for k = 0 to n - 1 do | |
printfn "%d, %d" (i + k) (j - k) | |
yield grid.[i + k, j - k] } | |
} | |
let products (xs:int seq seq) = | |
xs |> Seq.map (fun x -> x |> Seq.reduce (*)) | |
let answer = | |
sequences grid 4 |> products |> Seq.max | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment