parent
91b232f9d6
commit
d0135de39a
5 changed files with 300 additions and 0 deletions
@ -0,0 +1,10 @@ |
||||
solution-part%: solution-part%.c |
||||
gcc $< -o $@
|
||||
|
||||
test-%: solution-% example.txt |
||||
$< example.txt
|
||||
|
||||
run-%: solution-% realinput.txt |
||||
$< realinput.txt
|
||||
|
||||
.PHONY: $(patsubst %,run-%, 1 2) $(patsubst %,test-%, 1 2) |
@ -0,0 +1,10 @@ |
||||
5483143223 |
||||
2745854711 |
||||
5264556173 |
||||
6141336146 |
||||
6357385478 |
||||
4167524645 |
||||
2176841721 |
||||
6882881134 |
||||
4846848554 |
||||
5283751526 |
@ -0,0 +1,10 @@ |
||||
5723573158 |
||||
3154748563 |
||||
4783514878 |
||||
3848142375 |
||||
3637724151 |
||||
8583172484 |
||||
7747444184 |
||||
1613367882 |
||||
6228614227 |
||||
4732225334 |
@ -0,0 +1,130 @@ |
||||
#include <stdio.h> |
||||
#include <stdbool.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
|
||||
#define ANSI_COLOR_RED "\x1b[31m" |
||||
#define ANSI_COLOR_YELLOW "\x1b[33m" |
||||
#define ANSI_COLOR_RESET "\x1b[0m" |
||||
|
||||
#define GRIDROWS 10 |
||||
#define GRIDCOLS 10 |
||||
|
||||
typedef struct Octopus { |
||||
unsigned int energy; |
||||
bool flashed; |
||||
} Octopus; |
||||
|
||||
unsigned int flashCount = 0; |
||||
|
||||
void printGrid(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void flash(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row); |
||||
void increaseBy1(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row); |
||||
void increaseAllBy1(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void setToZero(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void step(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void resetFlashes(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
|
||||
void printGrid(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ){ |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ){ |
||||
if ( grid[col][row].flashed ) printf(ANSI_COLOR_RED); |
||||
printf("%i", grid[col][row].energy ); |
||||
if ( grid[col][row].flashed ) printf(ANSI_COLOR_RESET); |
||||
} |
||||
printf("\n"); |
||||
} |
||||
} |
||||
|
||||
void flash(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row){ |
||||
flashCount++; |
||||
grid[col][row].flashed = true; |
||||
|
||||
if ( col > 0 ){ |
||||
if ( row > 0 ) increaseBy1(grid, col-1, row-1); |
||||
increaseBy1(grid, col-1, row); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col-1, row+1); |
||||
} |
||||
|
||||
if ( row > 0 ) increaseBy1(grid, col, row-1); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col, row+1); |
||||
|
||||
if ( col < GRIDCOLS - 1 ){ |
||||
if ( row > 0 ) increaseBy1(grid, col+1, row-1); |
||||
increaseBy1(grid, col+1, row); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col+1, row+1); |
||||
} |
||||
} |
||||
|
||||
void increaseBy1(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row){ |
||||
grid[col][row].energy++;//Increase the enegry
|
||||
if ( grid[col][row].energy > 9 && !grid[col][row].flashed ){ // if it hasn't already flashed and is over 9 it should
|
||||
flash(grid, col, row); |
||||
} |
||||
} |
||||
|
||||
void increaseAllBy1(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ){ |
||||
increaseBy1( grid, col, row ); |
||||
} |
||||
} |
||||
|
||||
|
||||
void setToZero(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ) |
||||
if (grid[col][row].energy > 9) grid[col][row].energy = 0; |
||||
|
||||
} |
||||
|
||||
void resetFlashes(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ) |
||||
grid[col][row].flashed = false; |
||||
} |
||||
|
||||
void step(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
increaseAllBy1(grid); |
||||
|
||||
setToZero(grid); |
||||
printGrid(grid); |
||||
resetFlashes(grid); |
||||
} |
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
|
||||
Octopus octopuses[10][10]={0}; |
||||
char ch; |
||||
unsigned int row = 0, col=0; |
||||
while ( fscanf( fp, "%c",&ch ) && !feof(fp)){ |
||||
if ( ch == '\n' ){ |
||||
col=0; |
||||
row++; |
||||
} else { |
||||
octopuses[col++][row].energy = atoi(&ch); |
||||
} |
||||
} |
||||
|
||||
printGrid(octopuses); |
||||
for ( unsigned int i = 0; i < 100; i++ ){ |
||||
printf("\n\n"); |
||||
step(octopuses); |
||||
} |
||||
|
||||
printf("\nThere were %i flashes\n", flashCount); |
||||
|
||||
fclose(fp); |
||||
|
||||
|
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
@ -0,0 +1,140 @@ |
||||
#include <stdio.h> |
||||
#include <stdbool.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
|
||||
#define ANSI_COLOR_RED "\x1b[31m" |
||||
#define ANSI_COLOR_YELLOW "\x1b[33m" |
||||
#define ANSI_COLOR_RESET "\x1b[0m" |
||||
|
||||
#define GRIDROWS 10 |
||||
#define GRIDCOLS 10 |
||||
|
||||
typedef struct Octopus { |
||||
unsigned int energy; |
||||
bool flashed; |
||||
} Octopus; |
||||
|
||||
unsigned int flashCount = 0; |
||||
|
||||
unsigned int countZeros(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void printGrid(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void flash(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row); |
||||
void increaseBy1(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row); |
||||
void increaseAllBy1(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void setToZero(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void step(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
void resetFlashes(Octopus grid[GRIDCOLS][GRIDROWS]); |
||||
|
||||
unsigned int countZeros(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
unsigned int count = 0; |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ) |
||||
if ( grid[col][row].energy == 0 ) count++; |
||||
return count; |
||||
} |
||||
void printGrid(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ){ |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ){ |
||||
if ( grid[col][row].flashed ) printf(ANSI_COLOR_RED); |
||||
printf("%i", grid[col][row].energy ); |
||||
if ( grid[col][row].flashed ) printf(ANSI_COLOR_RESET); |
||||
} |
||||
printf("\n"); |
||||
} |
||||
} |
||||
|
||||
void flash(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row){ |
||||
flashCount++; |
||||
grid[col][row].flashed = true; |
||||
|
||||
if ( col > 0 ){ |
||||
if ( row > 0 ) increaseBy1(grid, col-1, row-1); |
||||
increaseBy1(grid, col-1, row); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col-1, row+1); |
||||
} |
||||
|
||||
if ( row > 0 ) increaseBy1(grid, col, row-1); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col, row+1); |
||||
|
||||
if ( col < GRIDCOLS - 1 ){ |
||||
if ( row > 0 ) increaseBy1(grid, col+1, row-1); |
||||
increaseBy1(grid, col+1, row); |
||||
if ( row < GRIDROWS - 1 ) increaseBy1(grid, col+1, row+1); |
||||
} |
||||
} |
||||
|
||||
void increaseBy1(Octopus grid[GRIDCOLS][GRIDROWS], int col, int row){ |
||||
grid[col][row].energy++;//Increase the enegry
|
||||
if ( grid[col][row].energy > 9 && !grid[col][row].flashed ){ // if it hasn't already flashed and is over 9 it should
|
||||
flash(grid, col, row); |
||||
} |
||||
} |
||||
|
||||
void increaseAllBy1(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ){ |
||||
increaseBy1( grid, col, row ); |
||||
} |
||||
} |
||||
|
||||
|
||||
void setToZero(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ) |
||||
if (grid[col][row].energy > 9) grid[col][row].energy = 0; |
||||
|
||||
} |
||||
|
||||
void resetFlashes(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
for ( unsigned int row = 0; row < GRIDROWS; row++ ) |
||||
for ( unsigned int col = 0; col < GRIDCOLS; col++ ) |
||||
grid[col][row].flashed = false; |
||||
} |
||||
|
||||
void step(Octopus grid[GRIDCOLS][GRIDROWS]){ |
||||
increaseAllBy1(grid); |
||||
|
||||
|
||||
setToZero(grid); |
||||
printGrid(grid); |
||||
resetFlashes(grid); |
||||
} |
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
|
||||
Octopus octopuses[10][10]={0}; |
||||
char ch; |
||||
unsigned int row = 0, col=0; |
||||
while ( fscanf( fp, "%c",&ch ) && !feof(fp)){ |
||||
if ( ch == '\n' ){ |
||||
col=0; |
||||
row++; |
||||
} else { |
||||
octopuses[col++][row].energy = atoi(&ch); |
||||
} |
||||
} |
||||
|
||||
printGrid(octopuses); |
||||
for ( unsigned int i = 0; countZeros(octopuses) != GRIDCOLS * GRIDROWS; i++ ){ |
||||
printf("\n\n"); |
||||
printf("Step %i\n",i+1); |
||||
step(octopuses); |
||||
} |
||||
|
||||
printf("\nThere were %i flashes\n", flashCount); |
||||
|
||||
fclose(fp); |
||||
|
||||
|
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
Loading…
Reference in new issue