parent
96e5cf31fa
commit
5c8dbe4878
7 changed files with 1354 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,12 @@ |
||||
00100 |
||||
11110 |
||||
10110 |
||||
10111 |
||||
10101 |
||||
01111 |
||||
00111 |
||||
11100 |
||||
10000 |
||||
11001 |
||||
00010 |
||||
01010 |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,56 @@ |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
|
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
unsigned int gamma = 0; |
||||
unsigned int epsilon = 0; |
||||
unsigned int lineLength = 0; |
||||
unsigned int noOfLines = 0; |
||||
|
||||
// Read the values into an array
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
char ch = fgetc(fp); |
||||
while ( ch != '\n' ){ |
||||
lineLength++; |
||||
ch = fgetc(fp); |
||||
} |
||||
|
||||
rewind(fp); |
||||
|
||||
unsigned int digitCount[lineLength]; |
||||
memset( &digitCount, 0, lineLength*sizeof(unsigned int) ); |
||||
|
||||
|
||||
for ( int i = 0; !feof(fp); i++){ |
||||
ch=fgetc(fp); |
||||
switch (ch) { |
||||
case '\n': |
||||
// I will be incremented at the end of the iteration
|
||||
i=-1; |
||||
noOfLines++; |
||||
break; |
||||
case '1': |
||||
digitCount[i]++; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
for (unsigned int i=0; i < lineLength; i++ ){ |
||||
if ( digitCount[i] > ( (double)noOfLines ) / 2 ){ |
||||
gamma = gamma | 1 << (lineLength - i - 1); |
||||
} else { |
||||
epsilon = epsilon | 1 << (lineLength - i - 1); |
||||
} |
||||
} |
||||
|
||||
printf("Answer: %d", gamma * epsilon); |
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
@ -0,0 +1,43 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
file="$1" |
||||
|
||||
ones=(0 0 0 0 0 0 0 0 0 0 0 0) |
||||
lines=0 |
||||
gamma="" |
||||
epsilon="" |
||||
|
||||
while read line; do |
||||
|
||||
bitn=0 |
||||
while read bit; do |
||||
if [ "$bit" -eq 1 ]; then |
||||
ones[$bitn]=$((${ones[$bitn]} + 1)) |
||||
fi |
||||
bitn=$(( bitn + 1 )) |
||||
done < <(echo "$line" | grep -o .) |
||||
|
||||
lines="$((lines + 1))" |
||||
|
||||
done < <(cat "$file") |
||||
|
||||
echo "${ones[@]}" |
||||
|
||||
for i in ${ones[@]}; do |
||||
if [ "$i" -gt "$(( lines / 2 ))" ]; then |
||||
gamma="${gamma}1" |
||||
epsilon="${epsilon}0" |
||||
else |
||||
gamma="${gamma}0" |
||||
epsilon="${epsilon}1" |
||||
fi |
||||
done |
||||
|
||||
|
||||
gammaDecimal="$( echo "ibase=2; $gamma" | bc )" |
||||
epsilonDecimal="$( echo "ibase=2; $epsilon" | bc )" |
||||
|
||||
echo "Gamma: $gamma -> $gammaDecimal" |
||||
echo "Epsilon: $epsilon -> $epsilonDecimal" |
||||
|
||||
echo "Answer: $((gammaDecimal * epsilonDecimal))" |
@ -0,0 +1,125 @@ |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
|
||||
int countLines(char filename[]){ |
||||
FILE *fp; |
||||
fp=fopen(filename, "r"); |
||||
long int lines =0; |
||||
|
||||
if ( fp == NULL ) { |
||||
return -1; |
||||
} |
||||
|
||||
while (EOF != (fscanf(fp, "%*[^\n]"), fscanf(fp,"%*c"))) |
||||
++lines; |
||||
|
||||
fclose(fp); // closing file
|
||||
return lines; |
||||
} |
||||
|
||||
|
||||
void countPositionBits(int linesize, int noOfLines, char *lines[noOfLines], unsigned int digitCount[]){ |
||||
for ( int i = 0; i < noOfLines; i++){ |
||||
for ( int j = 0; j < linesize; j++ ){ |
||||
if ( lines[i][j] == '1' ) |
||||
digitCount[j]++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
char* filterO2List(unsigned int linesize, unsigned int noOfLines, char **lines, unsigned int iteration){ |
||||
if ( noOfLines == 1 ) |
||||
return lines[0]; |
||||
|
||||
unsigned int digitCount[linesize]; |
||||
memset( &digitCount, 0, linesize*sizeof(unsigned int) ); |
||||
countPositionBits(linesize, noOfLines, lines, digitCount); |
||||
|
||||
char bitKeep = ( digitCount[iteration] >= ((double)noOfLines) / 2 ) ? '1' : '0'; |
||||
|
||||
unsigned int newLinesIndex=0; |
||||
//Not sure why +4 here but any less and it buffer overflows
|
||||
char **newLines = (char**)malloc((digitCount[iteration]+4) * sizeof(char*)); |
||||
|
||||
for ( unsigned int i=0; i < noOfLines; i++ ){ |
||||
if (lines[i][iteration] == bitKeep) |
||||
newLines[newLinesIndex++] = lines[i]; |
||||
} |
||||
|
||||
return filterO2List( linesize, newLinesIndex, newLines, ++iteration ); |
||||
|
||||
} |
||||
|
||||
char* filterCO2List(unsigned int linesize, unsigned int noOfLines, char **lines, unsigned int iteration){ |
||||
if ( noOfLines == 1 ) |
||||
return lines[0]; |
||||
|
||||
unsigned int digitCount[linesize]; |
||||
memset( &digitCount, 0, linesize*sizeof(unsigned int) ); |
||||
countPositionBits(linesize, noOfLines, lines, digitCount); |
||||
|
||||
char bitKeep = ( digitCount[iteration] >= ((double)noOfLines) / 2 ) ? '0' : '1'; |
||||
|
||||
unsigned int newLinesIndex=0; |
||||
//Not sure why +4 here but any less and it buffer overflows
|
||||
char **newLines = (char**)malloc((digitCount[iteration]+4) * sizeof(char*)); |
||||
|
||||
for ( unsigned int i=0; i < noOfLines; i++ ){ |
||||
if (lines[i][iteration] == bitKeep) |
||||
newLines[newLinesIndex++] = lines[i]; |
||||
} |
||||
|
||||
return filterCO2List( linesize, newLinesIndex, newLines, ++iteration ); |
||||
|
||||
} |
||||
|
||||
int main( int argc, char *argv[] ){ |
||||
if( argc == 2 ) { |
||||
|
||||
unsigned int gamma = 0; |
||||
unsigned int epsilon = 0; |
||||
unsigned int lineLength = 0; |
||||
unsigned int noOfLines = countLines( argv[1] ); |
||||
unsigned int iteration=0; |
||||
|
||||
// Read the values into an array
|
||||
FILE *fp=fopen(argv[1], "r"); |
||||
char ch = fgetc(fp); |
||||
while ( ch != '\n' ){ |
||||
lineLength++; |
||||
ch = fgetc(fp); |
||||
} |
||||
|
||||
rewind(fp); |
||||
|
||||
unsigned int digitCount[lineLength]; |
||||
memset( &digitCount, 0, lineLength*sizeof(int) ); |
||||
|
||||
// Make a big array to hold the lines
|
||||
char **lines = (char**)malloc(noOfLines * sizeof(char*)); |
||||
|
||||
// Loop through the file and populate the array
|
||||
for ( unsigned int i = 0; !feof(fp); i++){ |
||||
|
||||
char *line = (char*)malloc(lineLength); |
||||
fscanf(fp, "%s\n", line); |
||||
lines[i] = line; |
||||
} |
||||
|
||||
char *o2Rating = filterO2List( lineLength, noOfLines, lines, 0 ); |
||||
char *co2Rating = filterCO2List( lineLength, noOfLines, lines, 0 ); |
||||
|
||||
int o2RatingDec = (int)strtol(o2Rating, NULL, 2); |
||||
int co2RatingDec = (int)strtol(co2Rating, NULL, 2); |
||||
|
||||
printf("O2 Rating: %s -> %i\n", o2Rating, o2RatingDec); |
||||
printf("CO2 Rating: %s -> %i\n", co2Rating, co2RatingDec); |
||||
printf("Answer: %i\n", o2RatingDec * co2RatingDec); |
||||
|
||||
return 0; |
||||
} else { |
||||
printf("You need to provide a file\n"); |
||||
return 1; |
||||
} |
||||
} |
@ -0,0 +1,108 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
file="$1" |
||||
|
||||
|
||||
gamma="" |
||||
epsilon="" |
||||
|
||||
countPositionBits(){ |
||||
ones=(0 0 0 0 0 0 0 0 0 0 0 0) |
||||
#ones=(0 0 0 0 0) |
||||
stdin="$(cat -)" |
||||
|
||||
while read line; do |
||||
|
||||
bitn=0 |
||||
while read bit; do |
||||
if [ "$bit" -eq 1 ]; then |
||||
ones[$bitn]=$((${ones[$bitn]} + 1)) |
||||
fi |
||||
bitn=$(( bitn + 1 )) |
||||
done < <(echo "$line" | grep -o .) |
||||
|
||||
|
||||
done < <(echo "$stdin") |
||||
|
||||
printf '%s\n' "${ones[@]}" |
||||
|
||||
} |
||||
|
||||
dots(){ |
||||
seq $i | sed 's/.*/./' | tr -d '\n' |
||||
} |
||||
|
||||
ogr="$(cat "$1")" |
||||
csr="$(cat "$1")" |
||||
|
||||
echo "OGR" |
||||
|
||||
i=0 |
||||
while [ "$(echo "$ogr" | wc -l)" -gt 1 ]; do |
||||
counts="$(echo "$ogr" | countPositionBits)" |
||||
noofogr="$(echo "$ogr" | wc -l)" |
||||
noofones="$( echo "$counts" | sed -n "$((i + 1))p" )" |
||||
echo "$ogr" |
||||
echo "No of ones $noofones" |
||||
echo "No of ogr $noofogr" |
||||
if [ "$((noofones * 10))" -ge "$(( noofogr * 10 / 2 ))" ]; then |
||||
echo "Filtering only 1s in position $i" |
||||
echo "^$(dots $i)1" |
||||
ogr="$(echo "$ogr" | grep "^$(dots $i)1" )" |
||||
else |
||||
echo "Filtering only 0s in position $i" |
||||
ogr="$(echo "$ogr" | grep "^$(dots $i)0" )" |
||||
fi |
||||
echo -e "\n---\n" |
||||
i="$((i + 1))" |
||||
done |
||||
|
||||
echo "CSR" |
||||
|
||||
i=0 |
||||
while [ "$(echo "$csr" | wc -l)" -gt 1 ]; do |
||||
counts="$(echo "$csr" | countPositionBits)" |
||||
noofcsr="$(echo "$csr" | wc -l)" |
||||
noofones="$( echo "$counts" | sed -n "$((i + 1))p" )" |
||||
echo "$csr" |
||||
echo "No of ones $noofones" |
||||
echo "No of csr $noofcsr" |
||||
if [ "$((noofones * 10))" -ge "$(( noofcsr * 10 / 2 ))" ]; then |
||||
echo "Filtering only 0s in position $i" |
||||
echo "^$(dots $i)1" |
||||
csr="$(echo "$csr" | grep "^$(dots $i)0" )" |
||||
else |
||||
echo "Filtering only 1s in position $i" |
||||
csr="$(echo "$csr" | grep "^$(dots $i)1" )" |
||||
fi |
||||
echo -e "\n---\n" |
||||
i="$((i + 1))" |
||||
done |
||||
|
||||
|
||||
ogrDecimal="$( echo "ibase=2; $ogr" | bc )" |
||||
csrDecimal="$( echo "ibase=2; $csr" | bc )" |
||||
|
||||
echo "Oxxygen Generator Rating: $ogr -> $ogrDecimal" |
||||
echo "CO2 Scrubber Rating: $csr -> $csrDecimal" |
||||
|
||||
echo "Answer: $((ogrDecimal * csrDecimal))" |
||||
|
||||
|
||||
#while read i; do |
||||
# if [ "$i" -gt "$(( lines / 2 ))" ]; then |
||||
# gamma="${gamma}1" |
||||
# epsilon="${epsilon}0" |
||||
# else |
||||
# gamma="${gamma}0" |
||||
# epsilon="${epsilon}1" |
||||
# fi |
||||
#done < <(echo "") |
||||
# |
||||
#gammaDecimal="$( echo "ibase=2; $gamma" | bc )" |
||||
#epsilonDecimal="$( echo "ibase=2; $epsilon" | bc )" |
||||
# |
||||
#echo "Gamma: $gamma -> $gammaDecimal" |
||||
#echo "Epsilon: $epsilon -> $epsilonDecimal" |
||||
# |
||||
#echo "Answer: $((gammaDecimal * epsilonDecimal))" |
Loading…
Reference in new issue