diff options
| author | lonkaars <loek@pipeframe.xyz> | 2023-12-03 16:47:51 +0100 | 
|---|---|---|
| committer | lonkaars <loek@pipeframe.xyz> | 2023-12-03 16:47:51 +0100 | 
| commit | e275c8c30af198c17a84d0ac288154df51282b77 (patch) | |
| tree | a34710aae6d93d0311a8bdae34d1d700f12fcc9f /03 | |
| parent | d9ba0f7584f448731926394c03c98700ff242601 (diff) | |
garbage man day 3 complete
Diffstat (limited to '03')
| -rw-r--r-- | 03/main.cc | 117 | 
1 files changed, 55 insertions, 62 deletions
@@ -1,86 +1,79 @@  #include <bits/stdc++.h> +#include <vector>  using namespace std; -const vector<char> SYMBOLS = {'#', '$', '%', '&', '*', '+', '-', '/', '=', '@'}; +const vector<char> SYMBOLS = {'#', '$', '%', '&', '+', '-', '/', '=', '@', '*'};  const vector<char> NUMBERS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};  int main() { -	// phase 1 -- read lines into buffer  	vector<string> lines;  	for (string line; getline(cin, line);)  		lines.push_back(line);  	size_t rows = lines.size();  	size_t cols = lines[0].size(); -	// phase 2 -- create valid number mask -	vector<vector<bool>> valid_mask(rows, vector<bool>(cols, false)); -	for (int i = 0; i < rows; i++) { -		for (int j = 0; j < cols; j++) { -			// row and column offset for checking diagonals too -			for (int roff = -1; roff <= 1; roff++) { -				for (int coff = -1; coff <= 1; coff++) { -					// skip any x,y coordinates that are outide the "grid" -					int y = i + roff; -					if (y < 0) continue; -					if (y >= rows) continue; -					int x = j + coff; -					if (x < 0) continue; -					if (x >= cols) continue; +	int output = 0; -					for (char symbol : SYMBOLS) -						if (lines[y][x] == symbol) -							valid_mask[i][j] = true; -				} -			} +	auto check_and_mark = [lines, cols](vector<vector<bool>> &checked, unsigned int row, unsigned int col) -> int { +		int number = 0; +		if (lines[row][col] < '0' || lines[row][col] > '9') return number; +		int begin_col = col; +		while (true) { +			if ((begin_col - 1) < 0) break; +			if (lines[row][begin_col - 1] >= '0' && lines[row][begin_col - 1] <= '9') +				begin_col--; +			else +				break;  		} -	} -	for (int i = 0; i < rows; i++) { -		for (int j = 0; j < cols; j++) -			printf("%c", lines[i][j]); -		printf("\n"); -	} -	for (int i = 0; i < rows; i++) { -		for (int j = 0; j < cols; j++) -			printf("%c", valid_mask[i][j] ? 'x' : ' '); -		printf("\n"); -	} +		for (col = begin_col; lines[row][col] >= '0' && lines[row][col] <= '9' && col < cols; col++) { +			number *= 10; +			number += lines[row][col] - '0'; +			checked[row][col] = true; +		} + +		printf("%d at beginning coords %c%d\n", number, "ABCDEFGHIJKLMNOP"[begin_col], row +1); + +		return number; +	}; -	// phase 3 -- read each number and add to output if any of its digits are -	//            true in valid_mask -	int output = 0; -	int digit = 0; -	int valid_digit = false;  	for (int i = 0; i < rows; i++) {  		for (int j = 0; j < cols; j++) { -			char cell = lines[i][j]; -			bool valid = valid_mask[i][j]; -			int last_digit = digit; -			for (char num : NUMBERS) { -				if (cell != num) -					continue; -				// printf("[%c]", cell); -				digit *= 10; -				digit += cell - '0'; -				if (valid) -					valid_digit = true; -			} -			if (digit == last_digit && digit != 0) { -				// printf(" (inline, %d, %s)\n", digit, valid_digit ? "valid" : "not valid"); -				if (valid_digit) -					output += digit; -				digit = 0; -				valid_digit = false; +			for (char symbol : SYMBOLS) { + +				if (lines[i][j] == symbol) { +					int temp_cogs_mul = 1; +					unsigned int temp_cogs_cnt = 0; +					vector<vector<bool>> checked(rows, vector<bool>(cols, false)); +					printf("[%c at %c%d]\n", lines[i][j], "ABCDEFGHIJKLMNOP"[j], i +1); +					for (int roff = -1; roff <= 1; roff++) { +						for (int coff = -1; coff <= 1; coff++) { + +							// skip any x,y coordinates that are outide the "grid" +							int y = i + roff; +							if (y < 0) continue; +							if (y >= rows) continue; +							int x = j + coff; +							if (x < 0) continue; +							if (x >= cols) continue; + +							if (checked[y][x] == true) continue; + +							int number = check_and_mark(checked, y, x); +							if (number > 0 && lines[i][j] == '*') { +								temp_cogs_mul *= number; +								temp_cogs_cnt++; +							} +						} +					} +					if (temp_cogs_cnt == 2) { +						printf("cog count 2, adding ratio %d\n", temp_cogs_mul); +						output += temp_cogs_mul; +					} +				}  			}  		} -		if (digit != 0) { -			// printf(" (EOL, %d, %s)\n", digit, valid_digit ? "valid" : "not valid"); -			if (valid_digit) -				output += digit; -			digit = 0; -			valid_digit = false; -		}  	}  	printf(">> %d\n", output);  |