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), iterate_n(256, Lines, Res), length(Res, N), print(N). tick_existing([], [], 0). tick_existing([0|Xs], [6|Ys], New) :- tick_existing(Xs, Ys, New1), New is New1 + 1. tick_existing([X|Xs], [Y|Ys], New) :- X > 0, tick_existing(Xs, Ys, New), Y is X - 1. spawn_n(0, []). spawn_n(N, [8|Ys]) :- N1 is N - 1, spawn_n(N1, Ys). iterate(X, Y) :- tick_existing(X, Y0, New), !, spawn_n(New, Y1), append(Y0, Y1, Y), !. iterate_n(0, X, X). iterate_n(N, X, Y) :- N1 is N - 1, iterate(X, Y0), !, iterate_n(N1, Y0, Y), !.