Created
December 6, 2015 16:53
-
-
Save boone/6e63b9d6eadd35261e09 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
# http://adventofcode.com/day/2 | |
defmodule AdventDay2 do | |
# Part 1 | |
# | |
# present_dimensions - String a list of present dimensions, each in the format of | |
# 1x2x3 where 1 is the length, 2 is the width and 3 is the height, | |
# in feet. | |
# | |
# Returns an integer of the area of wrapping paper required, in square feet. | |
def required_wrapping_paper(present_dimensions) do | |
presents = String.split(present_dimensions, "\n") | |
Enum.reduce presents, 0, fn(present, acc) -> | |
dimensions = String.split(present, "x", parts: 3) | |
# values need to be integers | |
[length, width, height] = Enum.map(dimensions, fn(str) -> String.to_integer(str) end) | |
paper_for_one_gift(length, width, height) + acc | |
end | |
end | |
# Part 2 | |
# | |
# present_dimensions - String a list of present dimensions, each in the format of | |
# 1x2x3 where 1 is the length, 2 is the width and 3 is the height, | |
# in feet. | |
# | |
# Returns an integer of the length of wrapping paper required, in feet. | |
def required_ribbon(present_dimensions) do | |
presents = String.split(present_dimensions, "\n") | |
Enum.reduce presents, 0, fn(present, acc) -> | |
dimensions = String.split(present, "x", parts: 3) | |
# values need to be integers | |
[length, width, height] = Enum.map(dimensions, fn(str) -> String.to_integer(str) end) | |
ribbon_for_one_gift(length, width, height) + acc | |
end | |
end | |
# Private: determines the area of wrapping paper needed for one gift. | |
# | |
# length - Integer length, in feet. | |
# width - Integer width, in feet. | |
# height - Integer height, in feet. | |
# | |
# Returns an Integer in square feet. | |
defp paper_for_one_gift(length, width, height) do | |
side1 = length * width | |
side2 = width * height | |
side3 = length * height | |
2 * (side1 + side2 + side3) + Enum.min([side1, side2, side3]) | |
end | |
# Private: determines the length of ribbon needed for one gift. | |
# | |
# length - Integer length, in feet. | |
# width - Integer width, in feet. | |
# height - Integer height, in feet. | |
# | |
# Returns an Integer in feet. | |
defp ribbon_for_one_gift(length, width, height) do | |
sizes = [length, width, height] | |
# bow length is the sizes multiplied together | |
bow_length = Enum.reduce(sizes, fn(x, acc) -> x * acc end) | |
# drop the longest value, since the ribbon uses the shorest perimeter | |
shortest_sizes = Enum.slice(Enum.sort(sizes), 0, 2) | |
desired_perimeter = Enum.sum(shortest_sizes) * 2 | |
desired_perimeter + bow_length | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment