my solutions to advent of code
aoc advent-of-code

day 2 2015 in elixir because why not. this looks bad

aylac.top ba53422e 9ccfff4c

verified
Changed files
+70 -42
2015
2
elixir
gleam
+30
2015/2/elixir/main.exs
···
···
+
defmodule Main do
+
{_, input} =
+
File.read("../input.txt")
+
+
input =
+
input
+
|> String.trim()
+
|> String.split("\n")
+
|> Enum.map(fn v ->
+
v |> String.split("x") |> Enum.map(fn v -> String.to_integer(v) end)
+
end)
+
+
input
+
|> Enum.reduce(0, fn v, acc ->
+
[l, w, h] = v
+
sides = [l * w, w * h, h * l]
+
smallest = sides |> Enum.reduce(fn a, b -> min(a, b) end)
+
(sides |> Enum.sum()) * 2 + smallest + acc
+
end)
+
|> IO.puts()
+
+
input
+
|> Enum.reduce(0, fn v, acc ->
+
[l, w, h] = v
+
half_perimeter = [l + w, w + h, h + l]
+
smallest_half_perimeter = half_perimeter |> Enum.reduce(fn a, b -> min(a, b) end)
+
l * w * h + smallest_half_perimeter * 2 + acc
+
end)
+
|> IO.puts()
+
end
+40 -42
2015/2/gleam/src/main.gleam
···
-
import gleam/int.{add, min, multiply, to_string}
-
import gleam/io.{println}
-
import gleam/list.{combinations, fold, map, reduce}
-
import gleam/result.{unwrap}
-
import gleam/string.{split, trim}
-
import simplifile.{read}
pub fn main() {
let input =
-
read(from: "../input.txt")
-
|> unwrap("")
-
|> trim()
-
|> split("\n")
-
|> map(fn(str) {
-
split(str, "x")
-
|> map(fn(str) { int.base_parse(str, 10) |> unwrap(0) })
})
// part 1
-
println(
-
input
-
|> fold(0, fn(prev, cur) {
-
let sides =
-
cur
-
|> combinations(2)
-
|> map(fn(v) { fold(v, 1, multiply) })
-
prev
-
+ fold(sides, 0, fn(prev, cur) { prev + 2 * cur })
-
+ { reduce(sides, min) |> unwrap(0) }
-
})
-
|> to_string,
-
)
// part 2
-
println(
-
input
-
|> fold(0, fn(prev, cur) {
-
let smallest_perimeter =
-
reduce(
-
cur
-
|> map(fn(v) { multiply(v, 2) })
-
|> combinations(2)
-
|> map(fn(v) { fold(v, 0, add) }),
-
min,
-
)
-
|> unwrap(0)
-
prev + smallest_perimeter + fold(cur, 1, multiply)
-
})
-
|> to_string,
-
)
}
···
+
import gleam/int
+
import gleam/io
+
import gleam/list
+
import gleam/result
+
import gleam/string
+
import simplifile as file
pub fn main() {
let input =
+
file.read(from: "../input.txt")
+
|> result.unwrap("")
+
|> string.trim
+
|> string.split("\n")
+
|> list.map(fn(str) {
+
string.split(str, "x")
+
|> list.map(fn(str) { int.base_parse(str, 10) |> result.unwrap(0) })
})
// part 1
+
input
+
|> list.fold(0, fn(prev, cur) {
+
let sides =
+
cur
+
|> list.combinations(2)
+
|> list.map(fn(v) { list.fold(v, 1, int.multiply) })
+
prev
+
+ list.fold(sides, 0, fn(prev, cur) { prev + 2 * cur })
+
+ { list.reduce(sides, int.min) |> result.unwrap(0) }
+
})
+
|> int.to_string
+
|> io.println
// part 2
+
input
+
|> list.fold(0, fn(prev, cur) {
+
let smallest_perimeter =
+
list.reduce(
+
cur
+
|> list.map(fn(v) { v |> int.multiply(2) })
+
|> list.combinations(2)
+
|> list.map(fn(v) { list.fold(v, 0, int.add) }),
+
int.min,
+
)
+
|> result.unwrap(0)
+
prev + smallest_perimeter + list.fold(cur, 1, int.multiply)
+
})
+
|> int.to_string
+
|> io.println
}