This topic is about Day 1 of the Advent of Code 2022 .
With less than 2 hours to go for Advent of Code 2022, I am leaving this post open so that folks can discuss their day 1
adventures when it begins (12:00 AM EST)!
Link to our leaderboard:
https://adventofcode.com/2022/leaderboard/private/view/370884
The entry code is:
370884-a6a71927
Good luck!
3 Likes
My solution:
main(File) ->
{ok, RawData} = file:read_file(File),
Data = [ [binary_to_integer(X) || X <- binary:split(N, <<"\n">>, [global, trim])]
|| N <- binary:split(RawData, <<"\n\n">>, [global, trim]) ],
io:format("part 1: ~p~n", [solve1(Data)]),
io:format("part 2: ~p~n", [solve2(Data)]).
solve1(Data) ->
lists:max([ lists:sum(X) || X <- Data ]).
solve2(Data) ->
lists:sum(lists:sublist(lists:reverse(lists:sort([ lists:sum(X) || X <- Data ])), 3)).
3 Likes
I used :gb_sets
to get top 3. It doesn’t help much since it is O(n.lg(n))
vs O(lg(n))
and n
here is not large. But felt like let’s just try this (Elixir though)
defmodule AdventOfCode.Y2022.Day01 do
@moduledoc """
--- Day 1: Calorie Counting ---
Problem Link: https://adventofcode.com/2022/day/1
"""
alias AdventOfCode.Helpers.InputReader
@input InputReader.read_from_file(2022, 1)
def run(input \\ @input) do
input = parse(input)
{:gb_sets.largest(input), top_n_calories(input, 3)}
end
def parse(data \\ @input) do
data
|> String.split("\n")
|> Enum.reduce({:gb_sets.new(), 0}, fn
"", {calorie_set, total} -> {add_calories(calorie_set, total), 0}
This file has been truncated. show original
1 Like
Hi the links are still 2021 you should change them to 2022
2 Likes
I also used a series of split, map, sum and max from the lists module.
As I did not read the requirements to the end, I also implemented the calculation of which elf carried the most calories (= index of max in the list of sums).
It seems that the lists module does not provide such a function
find(Elem :: term(), List :: list()) -> Index :: integer() | enoent.
find(Elem, List) ->
find(Elem, List, 1).
find(Elem, [], Idx) ->
enoent;
find(Elem, [Elem|_List], Idx) ->
Idx;
find(Elem, [_|List], Idx) ->
find(Elem, List, Idx + 1).
or did I not look close enough?
2 Likes
Yes, looks like there is not Enum.find_index
equivalent in lists
module. However, can anyone explain why string:str(List, [Elem]) - 1
yields the desired index?
1 Like
mafinar
December 7, 2022, 10:59pm
8
I started doing Erlang solution. I am not used to Erlang so might look funny my code. Here’s Day 1:
-module(day_1).
-export([solve/0]).
input() ->
{ok, RawCalories} = file:read_file("data/1.txt"),
RawCalories.
solve() ->
RawCalories = input(),
ParsedData = parse(RawCalories),
Calories = [lists:sum(X) || X <- ParsedData],
Solve1 = solve1(Calories),
Solve2 = solve2(Calories),
{Solve1, Solve2}.
solve1(Calories) -> lists:max(Calories).
solve2(Calories) ->
SortedCalories =
lists:reverse(
lists:sort(Calories)),
Top3 = lists:sublist(SortedCalories, 3),
lists:sum(Top3).
parse(RawCalories) ->
[[binary_to_integer(Calory) || Calory <- ElfCalories]
|| ElfCalories
<- [binary:split(ElfCalories, <<"\n">>, [global, trim])
|| ElfCalories
<- [Calories
|| Calories <- binary:split(RawCalories, <<"\n\n">>, [global, trim])]]].
2 Likes