From c52a19c71cf16346c5de5e21425063047311b786 Mon Sep 17 00:00:00 2001 From: Ian C Date: Thu, 9 Dec 2021 23:50:11 +0000 Subject: Added day 8. Part 2 doesn't work. --- 8.c | 53 +++++++++++++++++++++++++++++++ 8a.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ data.8a | 10 ++++++ 3 files changed, 174 insertions(+) create mode 100644 8.c create mode 100644 8a.c create mode 100644 data.8a diff --git a/8.c b/8.c new file mode 100644 index 0000000..c0bf7c5 --- /dev/null +++ b/8.c @@ -0,0 +1,53 @@ +#include +#include +#include + +static char *ReadLine(char *p, size_t size, FILE *fp) +{ + if ((p=fgets(p, size, fp))) + { + size_t l = strlen(p); + + while(l && p[l-1] == '\n') + { + p[--l] = 0; + } + } + + return p; +} + +int main(void) +{ + char buff[0x8000]; + char *signal[10] = {0}; + char *digit[4] = {0}; + int sum = 0; + int f = 0; + + while(ReadLine(buff, sizeof buff, stdin)) + { + for(f = 0; f < 10; f++) + { + signal[f] = strtok(f == 0 ? buff : NULL, " |"); + } + + for(f = 0; f < 4; f++) + { + size_t len; + + digit[f] = strtok(NULL, " |"); + + len = strlen(digit[f]); + + if (len == 2 || len == 4 || len == 3 || len == 7) + { + sum++; + } + } + } + + printf("sum = %d\n", sum); + + return 0; +} diff --git a/8a.c b/8a.c new file mode 100644 index 0000000..9619dfc --- /dev/null +++ b/8a.c @@ -0,0 +1,111 @@ +#include +#include +#include + +static char *ReadLine(char *p, size_t size, FILE *fp) +{ + if ((p=fgets(p, size, fp))) + { + size_t l = strlen(p); + + while(l && p[l-1] == '\n') + { + p[--l] = 0; + } + } + + return p; +} + +static int GetDigit(const char *p) +{ + static struct + { + const char *sig; + int digit; + int unique; + } digit[10] = + { + {"acedgfb", 8, 1}, + {"cdfbe", 5, 0}, + {"gcdfa", 2, 0}, + {"fbcad", 3, 0}, + {"dab", 7, 1}, + {"cefabd", 9, 0}, + {"cdfgeb", 6, 0}, + {"eafb", 4, 1}, + {"cagedb", 0, 0}, + {"ab", 1, 1} + }; + + int check[10] = {0}; + int f; + + for(f = 0; f < 10; f++) + { + if (strlen(digit[f].sig) == strlen(p)) + { + int n; + + check[f] = 1; + + if (!digit[f].unique) + { + for(n = 0; n < strlen(p); n++) + { + if(!strchr(digit[f].sig, p[n])) + { + check[f] = 0; + } + } + } + } + } + + for(f = 0; f < 10; f++) + { + if(check[f]) + { + return digit[f].digit; + } + } + + printf("No digit for %s\n", p); + exit(1); +} + +int main(void) +{ + char buff[0x8000]; + char *signal[10] = {0}; + char *digit[4] = {0}; + int num = 0; + int sum = 0; + int f = 0; + + while(ReadLine(buff, sizeof buff, stdin)) + { + char result[5] = "0000"; + + for(f = 0; f < 10; f++) + { + signal[f] = strtok(f == 0 ? buff : NULL, " |"); + } + + for(f = 0; f < 4; f++) + { + size_t len; + + digit[f] = strtok(NULL, " |"); + + num = GetDigit(digit[f]); + result[f] = '0' + num; + } + + sum += atoi(result); + } + + printf("sum = %d\n", sum); + + return 0; +} diff --git a/data.8a b/data.8a new file mode 100644 index 0000000..c9f629b --- /dev/null +++ b/data.8a @@ -0,0 +1,10 @@ +be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe +edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc +fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg +fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb +aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea +fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb +dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe +bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef +egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb +gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce -- cgit v1.2.3