diff --git a/day25.erl b/day25.erl new file mode 100644 index 0000000..ca8b1e5 --- /dev/null +++ b/day25.erl @@ -0,0 +1,31 @@ +-module(day25). + +-export([solve/1]). + +solve(Input) -> + RoundData = binary:split(Input, <<$\n>>, [trim_all, global]), + {part1(RoundData), none}. + +part1(Input) -> int_to_snafu(lists:sum(lists:map(fun snafu_to_int/1, Input))). + +snafu_to_int(Snafu) -> snafu_to_int(Snafu, 0). + +snafu_to_int(<<>>, Acc) -> Acc; +snafu_to_int(<<$2, Rest/binary>>, Acc) -> snafu_to_int(Rest, Acc * 5 + 2); +snafu_to_int(<<$1, Rest/binary>>, Acc) -> snafu_to_int(Rest, Acc * 5 + 1); +snafu_to_int(<<$0, Rest/binary>>, Acc) -> snafu_to_int(Rest, Acc * 5); +snafu_to_int(<<$-, Rest/binary>>, Acc) -> snafu_to_int(Rest, Acc * 5 - 1); +snafu_to_int(<<$=, Rest/binary>>, Acc) -> snafu_to_int(Rest, Acc * 5 - 2). + +int_to_snafu(0) -> <<"0">>; +int_to_snafu(N) -> int_to_snafu(N, []). + +int_to_snafu(0, Acc) -> list_to_binary(Acc); +int_to_snafu(Num, Acc) -> + case Num rem 5 of + 0 -> int_to_snafu(Num div 5, [$0 | Acc]); + 1 -> int_to_snafu(Num div 5, [$1 | Acc]); + 2 -> int_to_snafu(Num div 5, [$2 | Acc]); + 3 -> int_to_snafu(Num div 5 + 1, [$= | Acc]); + 4 -> int_to_snafu(Num div 5 + 1, [$- | Acc]) + end.