mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-26 21:30:31 +01:00
Day 16 part 1: optimize all but initial allocations.
I don't think this can be much faster.
This commit is contained in:
@@ -3,7 +3,9 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <numeric>
|
||||||
#include "days.hpp"
|
#include "days.hpp"
|
||||||
|
#include "utils.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
std::array<int, 4> base_pattern{0, 1, 0, -1};
|
std::array<int, 4> base_pattern{0, 1, 0, -1};
|
||||||
@@ -26,47 +28,38 @@ namespace {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> partial_sum(const std::vector<int> &numbers) {
|
void simulate(std::vector<int> numbers, std::ostream &output) {
|
||||||
|
std::vector<int> new_numbers(numbers.size());
|
||||||
std::vector<int> partial_sums(numbers.size());
|
std::vector<int> partial_sums(numbers.size());
|
||||||
partial_sums[0] = numbers[0];
|
|
||||||
for (int j = 1; j < numbers.size(); ++j) {
|
|
||||||
partial_sums[j] = partial_sums[j - 1] + numbers[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
return partial_sums;
|
for (int i = 0; i < 100; ++i) {
|
||||||
}
|
for (int rank = 0; rank < numbers.size(); ++rank) {
|
||||||
|
std::partial_sum(numbers.begin() + rank, numbers.end(), partial_sums.begin() + rank);
|
||||||
void next_phase(const std::vector<int>& numbers, std::vector<int> &new_numbers) {
|
int n = 0;
|
||||||
new_numbers.resize(numbers.size());
|
for (int pos = rank; pos < numbers.size(); pos += rank + 1) {
|
||||||
|
int run = std::min(rank + 1, (int) numbers.size() - pos);
|
||||||
for (int rank = 0; rank < numbers.size(); ++rank) {
|
if (int modifier = get_modifier(rank, pos); modifier) {
|
||||||
auto partial_sums = partial_sum(numbers);
|
n += modifier * (partial_sums[pos + run - 1] - partial_sums[pos] + numbers[pos]);
|
||||||
int n = 0;
|
}
|
||||||
for (int pos = rank; pos < numbers.size(); pos += rank + 1) {
|
|
||||||
int run = std::min(rank + 1, (int) numbers.size() - pos);
|
|
||||||
if (int modifier = get_modifier(rank, pos); modifier) {
|
|
||||||
n += modifier * (partial_sums[pos + run - 1] - partial_sums[pos] + numbers[pos]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n = std::abs(n % 10);
|
||||||
|
|
||||||
|
new_numbers[rank] = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = std::abs(n % 10);
|
std::swap(numbers, new_numbers);
|
||||||
|
|
||||||
new_numbers[rank] = n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::copy(numbers.begin(), numbers.begin() + 8, std::ostream_iterator<int>(output));
|
||||||
|
output << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void aoc2019::day16_part1(std::istream &input, std::ostream &output) {
|
void aoc2019::day16_part1(std::istream &input, std::ostream &output) {
|
||||||
auto numbers = read_input(input);
|
auto numbers = read_input(input);
|
||||||
auto new_numbers = numbers;
|
|
||||||
|
|
||||||
for (int i = 0; i < 100; ++i) {
|
simulate(std::move(numbers), output);
|
||||||
next_phase(numbers, new_numbers);
|
|
||||||
std::swap(numbers, new_numbers);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy(numbers.begin(), numbers.begin() + 8, std::ostream_iterator<int>(output));
|
|
||||||
output << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void aoc2019::day16_part2(std::istream &input, std::ostream &output) {
|
void aoc2019::day16_part2(std::istream &input, std::ostream &output) {
|
||||||
@@ -89,9 +82,10 @@ void aoc2019::day16_part2(std::istream &input, std::ostream &output) {
|
|||||||
|
|
||||||
numbers = std::vector(numbers.begin() + offset, numbers.end());
|
numbers = std::vector(numbers.begin() + offset, numbers.end());
|
||||||
std::vector<int> new_numbers(numbers.size());
|
std::vector<int> new_numbers(numbers.size());
|
||||||
|
std::vector<int> partial_sums(numbers.size());
|
||||||
|
|
||||||
for (int i = 0; i < 100; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
std::vector<int> partial_sums = partial_sum(numbers);
|
std::partial_sum(numbers.begin(), numbers.end(), partial_sums.begin());
|
||||||
|
|
||||||
for (int j = 0; j < numbers.size(); ++j) {
|
for (int j = 0; j < numbers.size(); ++j) {
|
||||||
int n = partial_sums.back() - partial_sums[j] + numbers[j];
|
int n = partial_sums.back() - partial_sums[j] + numbers[j];
|
||||||
|
|||||||
Reference in New Issue
Block a user