parent
d8448356ef
commit
f45f295764
5 changed files with 175 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 @@ |
||||
3,4,3,1,2 |
@ -0,0 +1 @@ |
||||
4,1,1,4,1,1,1,1,1,1,1,1,3,4,1,1,1,3,1,3,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,5,1,2,1,1,5,3,4,2,1,1,4,1,1,5,1,1,5,5,1,1,5,2,1,4,1,2,1,4,5,4,1,1,1,1,3,1,1,1,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,2,1,1,1,1,1,1,1,2,4,4,1,1,3,1,3,2,4,3,1,1,1,1,1,2,1,1,1,1,2,5,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,3,1,2,1,2,1,3,4,5,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,3,1,1,3,1,1,4,1,1,1,1,1,2,1,1,1,1,3,2,1,1,1,4,2,1,1,1,4,1,1,2,3,1,4,1,5,1,1,1,2,1,5,3,3,3,1,5,3,1,1,1,1,1,1,1,1,4,5,3,1,1,5,1,1,1,4,1,1,5,1,2,3,4,2,1,5,2,1,2,5,1,1,1,1,4,1,2,1,1,1,2,5,1,1,5,1,1,1,3,2,4,1,3,1,1,2,1,5,1,3,4,4,2,2,1,1,1,1,5,1,5,2 |
@ -0,0 +1,103 @@ |
||||
#include <stdio.h> |
||||
#include <stdbool.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
|
||||
|
||||
typedef struct LanternFishListItem LanternFishListItem; |
||||
struct LanternFishListItem { |
||||
unsigned int daysToSpawn; |
||||
LanternFishListItem *next; |
||||
}; |
||||
|
||||
void printFrom( LanternFishListItem *first ){ |
||||
printf("%i,", first->daysToSpawn); |
||||
if ( first->next != NULL ) printFrom(first->next); |
||||
} |
||||
|
||||
unsigned int countFrom( LanternFishListItem *current ){ |
||||
unsigned int count = 1; |
||||
while ( current->next != NULL ){ |
||||
count++; |
||||
current = current->next; |
||||
} |
||||
return count; |
||||
} |
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
|
||||
LanternFishListItem *first = NULL; |
||||
LanternFishListItem *previous = NULL; |
||||
unsigned int no; |
||||
char ch; |
||||
while ( fscanf( fp, "%i%c", &no, &ch ) ){ |
||||
|
||||
LanternFishListItem *lf = (LanternFishListItem*)malloc(sizeof(LanternFishListItem)); |
||||
lf->next = NULL; |
||||
lf->daysToSpawn = no; |
||||
|
||||
if ( first == NULL ){ |
||||
first = lf; |
||||
} else { |
||||
previous->next = lf; |
||||
} |
||||
|
||||
previous = lf; |
||||
|
||||
if ( ch == '\n' ) break; |
||||
} |
||||
|
||||
for ( unsigned int i = 0; i < 80; i++ ){ |
||||
unsigned int toAdd=0; |
||||
LanternFishListItem *current = first; |
||||
while (current != NULL){ |
||||
if ( current->daysToSpawn == 0 ){ |
||||
toAdd++; |
||||
current->daysToSpawn = 7; |
||||
} |
||||
current->daysToSpawn--; |
||||
if ( current->next != NULL ) |
||||
current = current->next; |
||||
else |
||||
break; |
||||
|
||||
} |
||||
|
||||
|
||||
previous = current; |
||||
//printf("On day %i add %i fish\n", i, toAdd);
|
||||
for (unsigned int j = 0; j < toAdd; j++){ |
||||
LanternFishListItem *lf = (LanternFishListItem*)malloc(sizeof(LanternFishListItem)); |
||||
lf->next = NULL; |
||||
lf->daysToSpawn = 8; |
||||
previous->next = lf; |
||||
previous = lf; |
||||
} |
||||
|
||||
//printf("After %3i day: ", i+1);
|
||||
//printFrom(first);
|
||||
//printf("\n");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} |
||||
printf("There are %i Fish.\n",countFrom(first)); |
||||
|
||||
|
||||
fclose(fp); |
||||
|
||||
|
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
@ -0,0 +1,60 @@ |
||||
#include <stdio.h> |
||||
#include <stdbool.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
|
||||
#define POSSIBLE_SPAWN_AGES 9 |
||||
|
||||
unsigned long countFish(unsigned long *fishCount){ |
||||
unsigned long count = 0; |
||||
for( unsigned int i = 0; i < POSSIBLE_SPAWN_AGES; i++ ){ |
||||
count += fishCount[i]; |
||||
} |
||||
return count; |
||||
} |
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
|
||||
unsigned int no; |
||||
char ch; |
||||
// I realised that the ordering of the fish doesn't matter. What matters is how many of them are of each age.
|
||||
// This array will contain the number of fish of age 1 in fishCount[1] and so on.
|
||||
unsigned long fishCount[POSSIBLE_SPAWN_AGES] = {0}; |
||||
while ( fscanf( fp, "%i%c", &no, &ch ) ){ |
||||
fishCount[no]++; |
||||
if ( ch == '\n' ) break; |
||||
} |
||||
|
||||
for ( unsigned int i = 0; i < 256; i++ ){ |
||||
// "backup" the number of fish of age 0 as the memmove will loose this
|
||||
unsigned long age0 = fishCount[0]; |
||||
memmove( &fishCount[0], &fishCount[1], sizeof(unsigned long) * (POSSIBLE_SPAWN_AGES - 1) ); |
||||
|
||||
// All the fish that had a spawn_age of 0 will now have a spawn age of 6
|
||||
fishCount[6] += age0; |
||||
|
||||
// They will also all have a new fish with age of 8
|
||||
fishCount[8] = age0; |
||||
|
||||
//printf("\nDay %i:\n", i+1);
|
||||
//for( unsigned int j = 0; j < POSSIBLE_SPAWN_AGES; j++){
|
||||
// printf("Fish with spawn age %i: %lu\n", j, fishCount[j]);
|
||||
//}
|
||||
} |
||||
printf("There are %lu Fish.\n",countFish(fishCount)); |
||||
|
||||
|
||||
fclose(fp); |
||||
|
||||
|
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
Loading…
Reference in new issue