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).