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