Skip to content

Instantly share code, notes, and snippets.

@boone
Created December 6, 2015 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save boone/6e63b9d6eadd35261e09 to your computer and use it in GitHub Desktop.
Save boone/6e63b9d6eadd35261e09 to your computer and use it in GitHub Desktop.
# 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