aoc2021/pl/06.2.pl

54 lines
1.2 KiB
Perl
Raw Permalink Normal View History

2021-12-09 09:36:51 +07:00
numbers_strings([], []).
numbers_strings([A|As], [B|Bs]) :-
number_string(A, B),
numbers_strings(As, Bs).
read_file(Stream, X) :-
\+ at_end_of_stream(Stream),
read_line_to_codes(Stream, C),
string_chars(S, C),
split_string(S, ",", "", Y),
numbers_strings(X, Y),
at_end_of_stream(Stream).
main :-
open('../input/06', read, Stream),
read_file(Stream, Lines), !,
close(Stream),
create_buckets(B0),
add_to_bucket_seq(B0, Lines, B),
%add_to_bucket_seq(B0, [3,4,3,1,2], B),
iterate_n(256, B, B1),
sum_list(B1, S),
print([B1,S]).
create_buckets([0,0,0,0,0,0,0,0,0]).
prefix(0, _, []).
prefix(N, [A|As], [A|Ps]) :-
N > 0,
N1 is N - 1,
prefix(N1, As, Ps).
add_to_bucket(A, N, B) :-
prefix(N, A, P),
append([P, [X], S], A),
X1 is X + 1,
append([P, [X1], S], B).
add_to_bucket_seq(A, [], A).
add_to_bucket_seq(A, [N|Ns], B) :-
add_to_bucket(A, N, B0),
add_to_bucket_seq(B0, Ns, B).
iterate([A0,A1,A2,A3,A4,A5,A6,A7,A8], [A1,A2,A3,A4,A5,A6,B,A8,A0]) :-
B is A0 + A7.
iterate_n(0, A, A).
iterate_n(N, A, B) :-
N > 0,
iterate(A, B0),
N1 is N - 1,
iterate_n(N1, B0, B).