diff --git a/2019/src/day16.cpp b/2019/src/day16.cpp index ecb817a..9159c2b 100644 --- a/2019/src/day16.cpp +++ b/2019/src/day16.cpp @@ -25,6 +25,24 @@ namespace { return result; } + + std::vector advance(const std::vector& numbers) { + std::vector new_numbers; + new_numbers.reserve(numbers.size()); + + for (int rank = 0; rank < numbers.size(); ++rank) { + int n = 0; + for (int pos = rank; pos < numbers.size(); ++pos) { + n += get_modifier(rank, pos) * numbers[pos]; + } + + n = std::abs(n % 10); + + new_numbers.push_back(n); + } + + return new_numbers; + } } void aoc2019::day16_part1(std::istream &input, std::ostream &output) { @@ -36,7 +54,7 @@ void aoc2019::day16_part1(std::istream &input, std::ostream &output) { for (int rank = 0; rank < numbers.size(); ++rank) { int n = 0; - for (int pos = 0; pos < numbers.size(); ++pos) { + for (int pos = rank; pos < numbers.size(); ++pos) { n += get_modifier(rank, pos) * numbers[pos]; } @@ -53,5 +71,38 @@ void aoc2019::day16_part1(std::istream &input, std::ostream &output) { } void aoc2019::day16_part2(std::istream &input, std::ostream &output) { - output << "Not implemented\n"; + auto numbers = read_input(input); + const auto initial_size = numbers.size(); + + constexpr auto repetitions = 10000; + + numbers.reserve(repetitions * numbers.size()); + + int offset = 0; + for (int i = 0; i < 7; ++i) { + offset *= 10; + offset += numbers[i]; + } + + for (int i = 1; i < repetitions; ++i) { + std::copy(numbers.begin(), numbers.begin() + initial_size, std::back_inserter(numbers)); + } + + numbers = std::vector(numbers.begin() + offset, numbers.end()); + + for (int i = 0; i < 100; ++i) { + std::vector partial_sums(numbers.size()); + std::vector new_numbers(numbers.size()); + + partial_sums[0] = numbers[0]; + for (int j = 1; j < numbers.size(); ++j) { + partial_sums[j] = partial_sums[j - 1] + numbers[j]; + } + + for (int j = 0; j < numbers.size(); ++j) { + new_numbers[j] = partial_sums.back() - partial_sums[j] + numbers[j]; + } + } + + std::copy(numbers.begin(), numbers.begin() + 8, std::ostream_iterator(output)); }