Created
August 21, 2009 03:29
-
-
Save manicolosi/171636 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
class Grid | |
def initialize(str) | |
@grid = str.lines.collect do |line| | |
line.split.collect { |n| n.to_i } | |
end | |
end | |
def width | |
# Assume all grid rows are equal width | |
@grid[0].length | |
end | |
def height | |
@grid.length | |
end | |
def all_in_bounds?(*points) | |
points.all? {|p| in_bounds? p} | |
end | |
def in_bounds?(point) | |
x, y = *point | |
x >= 0 && x < width && y >= 0 && y < height | |
end | |
def [](x, y) | |
@grid[y][x] | |
end | |
def multiply(points) | |
return 0 unless all_in_bounds? *points | |
points.reduce(1) do |total, p| | |
x, y = *p | |
self[x, y] * total | |
end | |
end | |
end | |
class Problem11Grid < Grid | |
attr_reader :adjacents | |
def initialize | |
@adjacents = 4 | |
super <<-eos | |
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 | |
eos | |
end | |
end | |
def going_right(grid, x, y) | |
points = (x...x + grid.adjacents).to_a | |
points = points.zip [y, y, y, y] | |
grid.multiply points | |
end | |
def going_down(grid, x, y) | |
points = (y...y + grid.adjacents).to_a | |
points = points.zip [x, x, x, x] | |
points = points.collect {|p| p.reverse } | |
grid.multiply points | |
end | |
def going_diagonal_down_right(grid, x, y) | |
x_axis = (x...x + grid.adjacents).to_a | |
y_axis = (y...y + grid.adjacents).to_a | |
points = x_axis.zip y_axis | |
grid.multiply points | |
end | |
def going_diagonal_down_left(grid, x, y) | |
x_axis = (x - grid.adjacents + 1..x).to_a | |
y_axis = (y...y + grid.adjacents).to_a.reverse | |
points = x_axis.zip y_axis | |
grid.multiply points | |
end | |
grid = Problem11Grid.new | |
totals = [] | |
(0...grid.height).each do |y| | |
(0..grid.width).each do |x| | |
totals << going_right(grid, x, y) | |
totals << going_down(grid, x, y) | |
totals << going_diagonal_down_right(grid, x, y) | |
totals << going_diagonal_down_left(grid, x, y) | |
end | |
end | |
puts "Answer is: #{totals.max}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment