diff --git a/day 10/day_10_felix.cpp b/day 10/day_10_felix.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7f04f50535a153714458168d97ce1fdc9c527ed9 --- /dev/null +++ b/day 10/day_10_felix.cpp @@ -0,0 +1,114 @@ +#include <bits/stdc++.h> +using namespace std; +const bool DEBUG = false; + +#define coord pair<int, int> + +vector<vector<int>> trailMap; +vector<coord> trailHeads; +coord mapSize; +const vector<coord> DIRS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; + +void parseMap() { + DEBUG && cout << "Parsing map" << endl; + string line; + stringstream ss; + char c; + int row = 0; + int col = 0; + while (getline(cin, line)) { + DEBUG && cout << "Read line: " << line << endl; + ss = stringstream(line); + col = 0; + while (ss >> c) { + if (c == '0') trailHeads.push_back({row, col}); + if (col == 0) trailMap.push_back({c - '0'}); + else trailMap[row].push_back(c - '0'); + col++; + } + row++; + } + mapSize = {row, col}; +} + +bool printMap() { + for (int i = 0; i < mapSize.first; i++) { + for (int j = 0; j < mapSize.second; j++) { + cout << trailMap[i][j] << " "; + } + cout << endl; + } + return false; +} + +bool isInBounds(coord c) { + return c.first >= 0 && c.first < mapSize.first && c.second >= 0 && c.second < mapSize.second; +} + +bool islegall(coord curr, coord next) { + return isInBounds(next) && trailMap[next.first][next.second] == trailMap[curr.first][curr.second] + 1; +} + +int searchPart1(coord head) { + DEBUG && cout << "Searching from " << head.first << " " << head.second << endl; + vector<coord> toSearch = {head}; + int n_nines = 0; + array<array<bool, 100>, 100> visited = {false}; + while (!toSearch.empty()) { + coord curr = toSearch.back(); + toSearch.pop_back(); + if (visited[curr.first][curr.second]) continue; + visited[curr.first][curr.second] = true; + if (trailMap[curr.first][curr.second] == 9) { + n_nines++; + DEBUG && cout << " Found a 9 at " << curr.first << " " << curr.second << endl; + continue; + } + for (coord dir : DIRS) { + coord next = {curr.first + dir.first, curr.second + dir.second}; + if (islegall(curr,next)) toSearch.push_back(next); + } + } + return n_nines; +} + +int searchPart2(coord head) { + DEBUG && cout << "Searching from " << head.first << " " << head.second << endl; + vector<coord> toSearch = {head}; + int n_nines = 0; + //array<array<bool, 100>, 100> visited = {false}; + while (!toSearch.empty()) { + coord curr = toSearch.back(); + toSearch.pop_back(); + //if (visited[curr.first][curr.second]) continue; + //visited[curr.first][curr.second] = true; + if (trailMap[curr.first][curr.second] == 9) { + n_nines++; + DEBUG && cout << " Found a 9 at " << curr.first << " " << curr.second << endl; + continue; + } + for (coord dir : DIRS) { + coord next = {curr.first + dir.first, curr.second + dir.second}; + if (islegall(curr,next)) toSearch.push_back(next); + } + } + return n_nines; +} + + + + + +int main () { + parseMap(); + DEBUG && printMap(); + int p1 = 0; + int p2 = 0; + for (coord head : trailHeads) { + p1 += searchPart1(head); + p2 += searchPart2(head); + } + cout << "Part 1: " << p1 << endl; + cout << "Part 2: " << p2 << endl; + return 0; +} \ No newline at end of file diff --git a/day 11/day_11_felix.cpp b/day 11/day_11_felix.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5426f72b6e0cb46d77e4124f837ff2d099517fba --- /dev/null +++ b/day 11/day_11_felix.cpp @@ -0,0 +1,71 @@ +#include <bits/stdc++.h> +using namespace std; +const bool DEBUG = true; + +#define ll long long + +void add_to_map(map<ll, ll> &x, ll key, ll value) { + if (x.find(key) == x.end()) { + x[key] = value; + } else { + x[key] += value; + } +} + +map<ll,ll> step(const map<ll,ll> &x0) { + map<ll, ll> x1; + for (auto [stone, count] : x0) { + if (count == 0) continue; + string numstring = to_string(stone); + if (stone == 0) add_to_map(x1, 1, count); + else if (numstring.size() % 2 == 0) { + ll left = stoi(numstring.substr(0, numstring.size() / 2)); + ll right = stoi(numstring.substr(numstring.size() / 2, numstring.size() / 2)); + add_to_map(x1, left, count); + add_to_map(x1, right, count); + } else { + if (stone >= LLONG_MAX / 2024) cout << "TOO LARGE! " << stone << endl; + add_to_map(x1, stone * 2024, count); + } + } + return x1; +} + +map<ll,ll> read_input() { + map<ll, ll> state; + ll stone; + DEBUG && cout << "Reading input" << endl; + while (cin >> stone) { + DEBUG && cout << " Stone: " << stone << endl; + add_to_map(state, stone, 1); + } + DEBUG && cout << "Input read" << endl; + return state; +} + +ll sum_over(map<ll,ll> x) { + ll sum = 0; + for (auto [stone, count] : x) { + sum += count; + } + return sum; +} + +int main () { + map<ll,ll> state = read_input(); + + for (int i = 0; i < 25; i++) { + state = step(state); + } + cout << "Part 1: " << sum_over(state) << endl; + for (int i = 0; i < 50; i++) { + state = step(state); + DEBUG && cout << "Step: " << i+25 << endl; + for (auto [stone, count] : state) { + DEBUG && cout << " Stone: " << stone << " Count: " << count << endl; + } + } + cout << "Part 2: " << sum_over(state) << endl; + + return 0; +} \ No newline at end of file diff --git a/day 8/day_8_felix.cpp b/day 8/day_8_felix.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4913e71f52f4e0989f51e14ea6c54d9f71c496a0 --- /dev/null +++ b/day 8/day_8_felix.cpp @@ -0,0 +1,159 @@ +#include <bits/stdc++.h> +using namespace std; +const bool DEBUG = true; + +#define coord pair<int, int> +map <char, vector<coord>> beacons; +int nrows = 0; +int ncols = 0; + +void parseInput() { + string line; + int row = 0; + while (getline(cin, line)) { + nrows++; + ncols = line.size(); + for (int col = 0 ; col < line.size(); col++) { + if (line[col] != '.') { + beacons[line[col]].push_back({row, col}); + } + } + row++; + } +} + +bool isInBounds(coord a) { + return a.first >= 0 && a.first < nrows && a.second >= 0 && a.second < ncols; +} + +pair<coord, coord> antinodePositions(coord a, coord b) { + coord newA = {a.first - (b.first - a.first), a.second - (b.second - a.second)}; + coord newB = {b.first + (b.first - a.first), b.second + (b.second - a.second)}; + return {newA, newB}; +} + +vector<coord> resonanceNodes(coord a, coord b) { + vector<coord> resNodes; + int dx = b.first - a.first; + int dy = b.second - a.second; + // Check modulus? + while (dx % 3 == 0 && dy % 3 == 0) { + dx = dx/3; + dy = dy/3; + cout << "Found modulus 3!" << endl; + } + while (dx % 2 == 0 && dy % 2 == 0) { + dx = dx/2; + dy = dy/2; + cout << "Found modulus 2!" << endl; + } + while (dx % 5 == 0 && dy % 5 == 0) { + dx = dx/5; + dy = dy/5; + cout << "Found modulus 5!" << endl; + } + + coord newNode = a; + while (isInBounds(newNode)) { + resNodes.push_back(newNode); + newNode = {newNode.first - dx, newNode.second - dy}; + } + newNode = {a.first + dx, a.second + dy}; + while (isInBounds(newNode)) { + resNodes.push_back(newNode); + newNode = {newNode.first + dx, newNode.second + dy}; + } + return resNodes; +} + +int countAntinodes() { + int nantinodes = 0; + array<array<bool, 100>, 100> hasAntiNode = {false}; + + for (auto [key, freqbeacons] : beacons) { + for (int i = 0; i < freqbeacons.size(); i++) { + for (int j = i + 1; j < freqbeacons.size(); j++) { + auto [a, b] = antinodePositions(freqbeacons[i], freqbeacons[j]); + DEBUG && cout << "Beacons (" << freqbeacons[i].first << ", " << freqbeacons[i].second << ") and (" << freqbeacons[j].first << ", " << freqbeacons[j].second << ")" << endl; + if (isInBounds(a) && !hasAntiNode[a.first][a.second]) { + nantinodes++; + hasAntiNode[a.first][a.second] = true; + DEBUG && cout << "Antinode at " << a.first << " " << a.second << endl; + } + if (isInBounds(b) && !hasAntiNode[b.first][b.second]) { + nantinodes++; + hasAntiNode[b.first][b.second] = true; + DEBUG && cout << "Antinode at " << a.first << " " << a.second << endl; + } + } + } + } + return nantinodes; +} + +bool printNodes(const array<array<bool, 100>, 100> &hasAntiNode) { + vector<string> grid; + for (int row = 0 ; row < nrows ; row++) { + grid.push_back(""); + for (int col = 0; col < ncols; col++) { + if (hasAntiNode[row][col]) { + grid[row] += "#"; + } else { + grid[row] += "."; + } + } + } + for (auto [key, freqbeacons] : beacons) { + for (auto beacon : freqbeacons) { + grid[beacon.first][beacon.second] = key; + } + } + for (auto row : grid) { + cout << row << endl; + } + return false; +} + +int countFrequencyNodes() { + int nantinodes = 0; + array<array<bool, 100>, 100> hasAntiNode = {false}; + + for (auto [key, freqbeacons] : beacons) { + for (int i = 0; i < freqbeacons.size(); i++) { + for (int j = i + 1; j < freqbeacons.size(); j++) { + DEBUG && cout << key << "-beacons (" << freqbeacons[i].first << ", " << freqbeacons[i].second << ") and (" << freqbeacons[j].first << ", " << freqbeacons[j].second << ")" << endl; + DEBUG && cout << "Resonance nodes at "; + for (auto resNode : resonanceNodes(freqbeacons[i], freqbeacons[j])) { + DEBUG && cout << "(" << resNode.first << ", " << resNode.second << "), "; + if (!hasAntiNode[resNode.first][resNode.second]) { + nantinodes++; + hasAntiNode[resNode.first][resNode.second] = true; + } + } + DEBUG && cout << endl; + } + } + } + DEBUG && printNodes(hasAntiNode); + return nantinodes; +} + +bool printBeacons() { + for (auto [key, freqbeacons] : beacons) { + cout << key << ": "; + for (auto beacon : freqbeacons) { + cout << "(" << beacon.first << ", " << beacon.second << ") "; + } + cout << endl; + } + return false; +} + +int main () { + parseInput(); + DEBUG && printBeacons(); + cout << "Part 1: " << countAntinodes() << endl; + cout << "Part 2: " << countFrequencyNodes() << endl; + DEBUG && cout << "nrow: " << nrows << " ncols: " << ncols << endl; + return 0; +} \ No newline at end of file diff --git a/day 9/day_9_felix.cpp b/day 9/day_9_felix.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc14694d24dd9d1e74df0ab7738d5fa9d363c164 --- /dev/null +++ b/day 9/day_9_felix.cpp @@ -0,0 +1,65 @@ +#include <bits/stdc++.h> +using namespace std; +const bool DEBUG = false; + +deque<long long> input; +deque<long long> fwdOriginal; + +void readInput() { + char c; + long long i = 0; + bool iseven = true; + while (cin >> c) { + input.push_back(c-'0'); + if (iseven){ + for (int j=0; j<c-'0'; j++) fwdOriginal.push_back(i); + } + if (iseven) i++; + iseven = !iseven; + } +} + + +long long checkSum() { + deque<long long> fwd = fwdOriginal; + long long dig = 0; + long long hole = 0; + + long long sum = 0; + long long pos = 0; + while (input.size() > 0) { + dig = input.front(); + input.pop_front(); + DEBUG && cout << "DIGIT " << dig << endl; + for (int i=0; i<dig; i++) { + long long val = fwd.front(); + sum += pos * val; + DEBUG && cout << "Added " << val << " * " << pos << endl; + fwd.pop_front(); + if (fwd.size() == 0) return sum; + pos++; + } + + if (input.size() < 1) return sum; + hole = input.front(); + input.pop_front(); + DEBUG && cout << "HOLE" << endl; + for (int i=0; i<hole; i++) { + long long val = fwd.back(); + sum += pos * val; + DEBUG && cout << "Added " << val << " * " << pos << endl; + fwd.pop_back(); + if (fwd.size() == 0) return sum; + pos++; + } + } + return sum; +} + +int main () { + readInput(); + + long long part1 = checkSum(); + cout << "Part 1: " << part1 << endl; + return 0; +} \ No newline at end of file diff --git a/day 9/day_9_felix2.cpp b/day 9/day_9_felix2.cpp new file mode 100644 index 0000000000000000000000000000000000000000..53676a6d50f6db3b04f5630185000a4cd03cb5cd --- /dev/null +++ b/day 9/day_9_felix2.cpp @@ -0,0 +1,76 @@ +#include <bits/stdc++.h> +using namespace std; +const bool DEBUG = true; + +#define ll long long + +vector <ll> fileid; +vector <ll> filesize; +vector <ll> filestart; + +vector <ll> holestart; +vector <ll> holesize; + +void readInput() { + char c; + ll i = 0; + bool iseven = true; + ll pos = 0; + while (cin >> c) { + if (iseven) { + fileid.push_back(i); + filesize.push_back(c-'0'); + filestart.push_back(pos); + i++; + pos += c-'0'; + } else { + holestart.push_back(pos); + holesize.push_back(c-'0'); + pos += c-'0'; + } + iseven = !iseven; + } +} + + +void rearrange() { + DEBUG && cout << "Rearranging files" << endl; + + for (int file = filesize.size()-1; file >= 0; file--) { + for (int hole = 0; hole < file; hole++) { + if (holesize[hole] >= filesize[file]) { + // insert file into hole + DEBUG && cout << "Inserting file " << fileid[file] << " into hole pos " << holestart[hole] << endl; + holesize[hole] -= filesize[file]; + filestart[file] = holestart[hole]; + holestart[hole] += filesize[file]; + break; + } + } + } +} + +ll fileValue(int file) { + ll val = 0; + for (ll i = 0; i < filesize[file]; i++) { + val += filestart[file] + i; + } + return val * fileid[file]; +} + +ll checkSum() { + ll sum = 0; + for (int file = 0; file < fileid.size(); file++) { + sum += fileValue(file); + } + return sum; +} + +int main () { + readInput(); + rearrange(); + + long long part2 = checkSum(); + cout << "Part 2: " << part2 << endl; + return 0; +} \ No newline at end of file