commit db9b6acbb6496b8c9f03095357f3e835d8aae6f7 Author: nalydmerc Date: Mon Dec 4 19:40:03 2023 -0500 Committing days 1-4 diff --git a/01/01-part2.c b/01/01-part2.c new file mode 100644 index 0000000..cb94b43 --- /dev/null +++ b/01/01-part2.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +// How much memory to allocate for each line +#define MAX_LINE_LEN 200 + +#define DEFAULT_FILE "input.txt" + +// Returns 0 if a string is not a number (e.g. 'two') +// Otherwise, returns the equivilant ascii character digit. +// Only works for single digits. +// Only accepts lower case. +char parse_num(char *str) +{ + const char *num_strings[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; + + // The lengths of the strings above, + const uint8_t num_string_lens[10] = { 4, 3, 3, 5, 4, 4, 3, 5, 5, 4 }; + + bool possible_nums[10] = { [0 ... 9] = true }; + uint8_t num_idx = 0; + uint8_t char_incriment = 0; + char current; + bool result_still_possible = false; + + for (char_incriment = 0; char_incriment < 6; char_incriment++) + { + // Grab out next character in the string + current = *(str + char_incriment); + + for (num_idx = 0; num_idx < 10; num_idx++) + { + if (!possible_nums[num_idx]) continue; + + // If we have passed the end of our number string and every character has matched, + // then we return our valid character. + if (char_incriment == num_string_lens[num_idx] && possible_nums[num_idx]) return (num_idx + '0'); + + // If the character is not the letter it should be, disqualify this number. + // e.g. if num_idx == 1 and char_incriment == 2, current should equal 'e' + // because 'e' is the 3rd number in the word 'one.' + if (current != num_strings[num_idx][char_incriment]) possible_nums[num_idx] = false; + else result_still_possible = true; + } + if (!result_still_possible) return 0; + } + + return 0; +} + +// Returns a string of the next line. +// Remember to free() this after you're finished. +// Limited by MAX_LINE_LEN (I'm lazy.) +char *next_line(FILE *file) +{ + char *strbuf = malloc(sizeof(char) * MAX_LINE_LEN); + uint8_t idx = 0; + char current = 0; + + while (current != '\n' && current != EOF) + { + current = fgetc(file); + strbuf[idx] = current; + idx++; + } + + return strbuf; +} + +int main(int argc, char **argv) { + + // Get filename as an argument + char *path = (argc > 1) ? argv[1] : DEFAULT_FILE; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + int8_t firstdigit = -1; + int8_t lastdigit = -1; + int8_t parsed_num = -1; + uint32_t sum = 0; + char current = 0; + char *strbuf = next_line(file); + uint8_t strbuf_idx = 0; + + while (current != EOF) + { + parsed_num = parse_num(strbuf + strbuf_idx); + current = strbuf[strbuf_idx++]; + + if (current == '\n') + { + if (lastdigit == -1) lastdigit = firstdigit; + sum += (firstdigit * 10) + lastdigit; + firstdigit = -1; + lastdigit = -1; + strbuf_idx = 0; + free(strbuf); + strbuf = next_line(file); + continue; + } + + if (parsed_num != 0) current = parsed_num; + + if (current < '0' || current > '9') continue; + + if (firstdigit == -1) + { + firstdigit = current - '0'; + } + else + { + lastdigit = current - '0'; + } + } + + printf("Sum: %d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/01/01.c b/01/01.c new file mode 100644 index 0000000..b59a204 --- /dev/null +++ b/01/01.c @@ -0,0 +1,57 @@ +#include +#include +#include + +int main(int argc, char **argv) { + + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : "input.txt"; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + int8_t firstdigit = -1; + int8_t lastdigit = -1; + uint32_t sum = 0; + char current = 0; + + while (current != EOF) + { + current = fgetc(file); + + if (current == '\n') + { + if (lastdigit == -1) lastdigit = firstdigit; + sum += (firstdigit * 10) + lastdigit; + firstdigit = -1; + lastdigit = -1; + continue; + } + + if (current < '0' || current > '9') continue; + + if (firstdigit == -1) + { + firstdigit = current - '0'; + } + else + { + lastdigit = current - '0'; + } + } + + printf("Sum: %d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/01/01test.c b/01/01test.c new file mode 100644 index 0000000..955697f --- /dev/null +++ b/01/01test.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +// Returns -1 if a string is not a number (e.g. 'two') +// Otherwise, returns the number. +// Only works for single digits. +// Only accepts lower case. +int8_t parse_num(char *str) +{ + const char *num_strings[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; + + // The lengths of the strings above, + const uint8_t num_string_lens[10] = { 4, 3, 3, 5, 4, 4, 3, 5, 5, 4 }; + + bool possible_nums[10] = { [0 ... 9] = true }; + uint8_t num_idx = 0; + uint8_t char_incriment = 0; + char current; + bool result_still_possible = false; + + for (char_incriment = 0; char_incriment < 6; char_incriment++) + { + // Grab out next character in the string + current = *(str + char_incriment); + + for (num_idx = 0; num_idx < 10; num_idx++) + { + if (!possible_nums[num_idx]) continue; + + // If we have passed the end of our number string and every character has matched, + // then we return our valid character. + if (char_incriment == num_string_lens[num_idx] && possible_nums[num_idx]) return num_idx; + + // If the character is not the letter it should be, disqualify this number. + // e.g. if num_idx == 1 and char_incriment == 2, current should equal 'e' + // because 'e' is the 3rd number in the word 'one.' + if (current != num_strings[num_idx][char_incriment]) possible_nums[num_idx] = false; + else result_still_possible = true; + } + if (!result_still_possible) return -1; + } + + return -1; +} + +int main(int argc, char **argv) { + + const char *num_strings[10] = { "zerorr", "oneqw", "twoqw", "threere", "fourer", "fiveer", "sixer", "sevener", "eighter", "nineer" }; + + uint8_t i = 0; + + for (i = 0; i < 10; i++) + { + printf("%d\n", parse_num(num_strings[i])); + } + + return 0; +} \ No newline at end of file diff --git a/01/input.txt b/01/input.txt new file mode 100644 index 0000000..9569e81 --- /dev/null +++ b/01/input.txt @@ -0,0 +1,1000 @@ +2xjzgsjzfhzhm1 +qhklfjd39rpjxhqtftwopfvrrj2eight +95btwo +lfsqldnf3onenplgfxdjzjjnpzfxnineseven +five7fouronesevenpfsrmszpc +xcsfkjqvln2tpm +ncjtcdb625two9 +6srtj3gfghkdtmfzseven +three4fournineone +pcpsxmkhdgsix25six6ngzsqzdcrb +1sixdzhbjvnvgcxmsrlkb9xbjk7t2 +dsxnfkjn2vtwofivethree2 +qfbp2tpgvsxm +kvbhsseven2rkbllhrhvsevenfour2vf +bqbtzbtt3 +ninek6 +3fivebvqhvhlvz +two68jxfnqlzfkninenine8 +vhckhhhb2sixtftjtdjf2nine +4jc +3sevenxlxfnpk +5sjfive +c8bvlkdq283rqfftj +8eight1threehhvmnlft +4sixmfcronelzcpnfourlgdbkgt +hntcjmppp9fmntwokx2 +24mkgr6mx9n4 +cksfkrdmdcmnbmkgk3two4 +twosixthreefivelq3nine +njmrtr6fmldninevcbtxr42 +eightfrdrczdxrcrfxh6 +8sevenonefmfqhtx8lk +lnoneight8twodg +tszrcb7tvvhfive4 +nknphprtv67fivehqlfournine2jk +9eightszgdhftggrktkzbsmnhtwonekh +1onefzkgf2two417 +77fivepsmmpp +bnine7vmttgmdskc +6tnsixclbvkhmsp +ggreightwo1mnsbzmxsdcdrhhg5one +ninetwo6qtbklgb2 +four8fmfxmr +threetxfrsevenvfdgrtsixtwofsq7 +hqxlseven53 +vxqq24eight6 +7psxpgxmkpzkzeight3 +9four7 +stwoone4eightwoj +one38 +9cjlrgrgpfjeighteightdcpjhzbjqcdthree +rqfone2 +dvkxhvkgxcfivescjcnqqnnine2tthreecptkgxmzjsbzdrhk +5lhprmg8two7two3 +5lvtg5sevennine2zrrmghf4seven +fourfive97sevensevensixcsffnlcbtjk +onesixoneninesixnbkf5xpsgsmpvdsdsqdvpjjzp +nineb321mgkpqjqjqh +seven2cstttkvkmpssflkxjmbnvthreefour +six1bmcjbhdgqm6kgzsxbgdqnjqf3four6 +zchkfjxsllkncz175 +vsveightwo8 +fourbtrnfdp2four5 +13dtf8769 +6qfvvdqdrtstwothree4seven8vszpseven +7rgzpxfbczk1fivetwo4two9nine +3sksmfxn +16ninetwonqqmptq +9five4fckzssxsvpzbvlktjzcninethree +3threel889bvbcgvl +threetzzjntxlsd2klrjfnbg87 +3two3qrrdbkbk +29oneightt +7mkpfchstjt7mshqht4fivesix +tvmqndvsix875nine8 +vg7477ninecpnrvnine7 +seveneightmknlqjlstx4zjjrpbhjhnnc8 +8qklthreetwo7tlmrfzvtwo7zvccc +6one1dpstqpmfbhst +sixfourfourseven6rzdkfour +6eighttbltmntb8 +seven72cqslvzpgj +jpvrsgfhtwo5nfc1cgxdrdrbfnseven +four1ninezlhqxtsgfzsevenhspvmxrtztzgtmseven5 +foursixzjvgjgsevensvkd5 +seven121fivefgxhdfive +twoh8 +ghhtttxqgr95 +zkpklcjbjlr2 +nine2mtrdcbrbntrdqninevbkbfg35lnpx +nineninesix68pcvsdnns +rf16one7 +seven276 +sixseven1 +qjxseven9six +7c9xvhgmpf41 +dlzpvdpxseven9nine +mlmlqrpn4twofivesbmhdbcsixtwo +ld74txfzksr5qconenine +six7djcdrtk7chktrh88 +2seven7jtrbhznt +1eighthnhchsevenfive +qdhscpeight8 +12gnxzzm +k7fourmhcfkggt8919np +8zljspvnmlx6four +36twofivethreeptbdrfqzbz7qbjm +bxkbjbzgone3ldhlnhxfcf7btkktspxrtqkxqfdmlqgqvgclb +sevenfourmdrxseven2z2fiveone +8bbprzqrqn +twofivethree95mpqclhfkzlsix +gpfjflrkc96tmsix6dxjnfive +qzeight6 +five5zlthgqjntwotqmnnsd +eight6nbpvfour4kzkvbzrxcmkh +fdkrxdckqbpsklz64fourones8 +5qpldkhltl +27xldkbqbnmrrbqkhmksvk +pjoneightknpcgkkv7cbknrhfdmtdm8 +432xsixvvktflzxone +35fouronemzzszfqppllgchsjjnine +qgcnzcbvsxbtn6lthreenineone +two2fourkdgbfb +fzkmbtvnvj5bzfgvxv3nineknpqzznzmf +9mkqtmlnpzt282dgkmvlsonefourthree +mcqhpkhonethreeninesevenfdsggqnlfcnrft3frqzkscft +847 +gsxvvr6tghfbxxghgv6lplf +fqzgkxkbmkpbhpvpdprmlhsngc5 +qeightwo2threecrjjtv9fourbthree +2eightdcbgfdqzk +fourtwothree5tdzpzfxkpjmlkzzrf +seven633 +8mldn +eightmg7dvjzbngkxmnxdctjtdffive97zpjrjqvp +sixfournineone38eighteight +8mngs412 +3fivefourtwo7five +7sevenjfkcf7rvone8xjdvsc +tljcrzngfdsqctfour6hsnljsxrqdzd +csix7hnkhds4four67 +3cxrlqcnseven4twox3 +rtwonerxcnpqdnzksvzmmndcjlzq2nine6ntfzjdqnrjeight +zbqgrvvvblggbghtfx98 +three2zcpspgtq77vqtgpcxkvq8 +94zksixnvbxrllxln +1eightrctknxkmv9jtwoeight +2onenine5eight58 +four2five +6fourfiveeight +pbfourlzdl4 +4onejrltvhxprhlzctrqzbz5fourseven6 +hlsdjlleightdcmdj8jdg +eightbfkgvbxxm6 +sixseven9hmhchsmqhhtrdftcfivetz +mq4five2fsdhzn +ceight3mncgnineeight8dkqrjjtmc +onefour7eightsix +seven4fqsjk38fhbmn9fgzzcc +9cmb5ninenjsppthpnine5 +qghtvpsqpxptoneljvstwo8lpqcbgtqvjmpq +onelq85dlqpx8 +1threetzsxqtndvhqn +lqdvkonebqjqj9 +3six6 +9two9sixeight776 +scrrprfkblkplgqzzqb2 +18vcrhxb4b +three8nine +1khkncj8fivefourthree2 +ninetwo8tbbsfmkqtt51five +66one88 +ninempgbhpm6seven34 +eightthreetwo4threetwo +vvpqkdonesevendvfrgmhhlsix91threethree +vbskcncpjxtdhqlcone6kgqpz +54lmnnqsrm73 +5mqnmvcbqnz82ninethree +47teightthreehrhtdndrk +fft2foursrdhxkzfourv +tbeight48759eight9twonenl +3sfkvkmvbbm9four9cbjzgllfl +sixqhxeightone7tlsd +22zmllbhcptwo +dqxdjrkmnvkbsxc3ztbseven +oneeight6dcphmnrfltfour +mgxzcfsevenfour4six +sixb8six34gqjtlcq +fiveseventhreexfblvxgkplvbrgpfive1onesix +one3mgqphj5 +7fpzxmmxgnb5 +jbshclzone3oneseven117dkzzdxdd +56five1 +jeightwo1ninemxtvgl717pbv1mqs +3six36 +35mlzjsgxxtg +hmmjgonehjqdcqkh1gskjrmfour7 +eightfiverqbb3 +sixtdkfbglhbjbvthreejsd8tglkrsfktcjt +1eight2mgxrgbbb3 +zzqxvtthreepf3eighttwoonefive +vjnxhl4threetwokj +oneqddgbbqtzsonenxkeightvx7 +nine24 +ftwone2 +53twonehx +two7three4fourhbgninenkvxjjsz +7five62ninefour +53nine7lqthree4 +1six1jn +five5drcjvbgdxzonefourfjdkfive +6onecfninesqfdtxmdhmfvlhbsjv9eight +5dqmfmqbdfdjvpl +qxkqfjshdone2zrmdsts +1qrvnf8zvfour +dht2 +4twoqdrshn87vxldzvnkn1five +4nineh +zctqdcfbseven6three58lzscrpsbb2 +fzmndhssmm3jdzlfourshjkmjkv53gvssnvzsz +five2qkxtfkj3sixshpnzdcjhlcmksnv +bskcmljnq69 +psxkxqztb3xsctsk6qvldjdzzqmgqcxncx2btqxh +onetwosixttghndtzx8 +8twocmnfmslsheighthtxsgjddm +fnvkqndfqmhgscnvq31kvvftxbzhtgzxqtngvqseven +7sevenkhhvtvsbrvcvm8zksvgcfrkgfourtzjvpqstckmmlzz +7hkfiveeightpjhone +8zptwoonemrninefive3spxrlhr +3qvjknqcnngpkninecgsbp3sevenfnpvrcltj +qztwo8678 +bxkj959dntcpzv +4one4 +lstwone347nine +ff79krfbjttqp4seven1 +gjtlbgxdqt7eightsix +8fivefour82threetwo +1zjxthree4 +szgx6fivefour12 +557dspnfzhmlh +5hnfour +847zzkrtjlb +82six +xlnhrcksv3fourzl +2ninetwo8ninelhnsbseven9 +ccseightwo8fiveonetwo5onegkhlg +eightp2onegrmfsnine5one +4five9xnmlldfive +five636 +fivesix29 +34dsbtmlhgggzkqxs7 +twothreesmgjch93mcdndsn +cmnmtzjnmtggseven1tjsshnktffive72 +7xcbpsix6m +7fourthree +7cxnzthree +5eightthree3lpvlfk +4rdnp +one6gmpjfouronettbbjdqsxn +6xtcv +dpspd1cb2onegxsgdtcsix +1eightpseven +ntczqmrclm2 +six7nineeight1 +qrndlfour9bhbmlgj6 +52vhnxvngjjkzt +nine8six +3seventhreesixfpmpbjninesix +seightwoseven4sevenppdnk7 +lnxeightbhxfmdrxcbjzx9sixnine +8ptdmjrd21zrnt1one +one1dmbfournine2 +25five748 +266eightwom +zxfxjn32threelxmqnlcvnknzbn3 +lqmjm2onezseven +sphlhbbz14sixtwosix +sixr9llqxb4 +tnnhlmsix314mqvdlxfour4 +threenjxgtthreethreeeight14one +1fivetwo +hhhtkpvhvg8 +31cslxxzgbktjtwotrzs1one +twoseven9 +4fivenine9332 +six35nineeightwok +nine9fpxgqjrftwovhldfflqthree +434four5threetpcs +ql52kzzgnsgll +onex5145 +gsppnkx1 +22six +zjbbqnbhsdfourmk19sixone +six3onesevensixvnsixone7 +seventhreefive8 +four62four7eightseventwo +2three5jtzmtxhqxhsixxlkmptshb +five3lklnccst1dstgvnprktgcnseven +sevenfour52 +hfxkkbcfpcgzfqsv1three68three +lnqrcdpglf2ksqddhp +13onenbmqvpqsbbf +1bfive +1dmnlscgvfdqrf +bvtwonettkzzxpb4 +5two2t7 +t7djkh +63t86nlhfgqgnrghqone1 +one89eightlmztkcjjnonefive +7twosjmcrlcfqr29lfkrjz +1nine5four +xxjbmsvfxb8 +nxvrvcqkbseven99rbzbdp641 +56fdpx +skszhkqdtonesixth5eight +ninetwo8jqbtwokbhzvv4fiveoneightxb +1threemfcblxjljdtone +fsfgncxvcmszn2pzspkkgqvfxlnbzgjr1 +rrxhnslrkeightgcsbcgdbkplzxbmmlxsn5sfp66 +foureight3 +5rplrmrjtjcfnct9sixfourzptmffrpthree +mld6ztzninesixfour4 +twohbbxmthljpkqthtcgtt8 +ltvgmqgsix89 +6khclqhcvdz24eightseven +6prb +nhsjqtnk6bqzhzvldlcgsmkq1twobfqzm +tfivehmdtxqlsevenzxt1ckjbnttgqctwo4 +ghnjjmtlvfive9znltjfskfnl3vdcjkvqcdplvdmckmfgxq +ztvvbbjx3 +6jhsrszlpsh +4fhtrctvrgmfhdjqvqp8sixnnftggrzlgs2 +bvlqxnjbbjgtfpslpspvpl7jsjlrdfiveeight88 +fsvcxvlc74sevenltx37sevenlbq +fourfivetgkqz5cgj4 +cnrjtfvht74nptvh +oneldnoneone745dhvqnvmlfj +2trhmdcpnreight +dshghlkjzh1kv +threexzkssrxlzzpxsjzbbtthree7 +eightdsqrdllssxv7sevendttwo3three +stz6five9four +jfbfgvfgmvlhjv94 +rcncncfcqsevenjdrtctbbsznpct48cbbxseven +ninevjxzk2two +1qgdcpslvqhjzbgtsbnzcd +kmlzbndds8fivegfdgpfivetwo63 +66mkeightnine1rvfnine4 +nine82 +58ntpkdssixnntjlgfkxq +2jxqttctsxthreepnxsfive +fivekvfkqpc28foursixptgbpfm6 +6twofourslqbzlcsmf +five4vmdl +thx5six +5hfnsqhvcfgckcseven3jgdtkkv +seven6eight65five99 +hplrgdqrjtonesevenseven4z65eight +khkts8hcsfvhvqjv9eightnine48 +pqxztthreeninelxhcxkjclk2 +sixrmfpj6nine4zx +9xtvxkxpjv9 +cmtggbrckmmzffncttxsevenhphmhfgjsr85 +83s4 +26fivefivethreemstzpncmhfm +87eightfourgvmmfbknineone +bdxg2zszhcgtvtseventhmbvfive +zeight8 +eight78dcnq4jtz +67csrthree +3vqxtwonerts +1five3 +sevensixfournineksxkz9bkbgcrjjjhnineeight +8seven29 +9394 +pkqxvl9vbjmqblrksjqcshpzpfrfouroneeightnine +heightwolgpplrbnhrgdkrk25crttkkzkbt +6659eighttwoone +55lzqzng2dmtpq45 +512gpmqpsqfive9eight +eightsnxz58zrbh8fiveeight +six893ninerrxzj +twoflrzzcgninefqqlmmzzqgnjrcxcfour5ninetlcmc +tmfkbgcssdcmkthmx1seven +6three9fourmdpzj +mgprpn68 +xssxrtpntlkppxp958rzd2nine8 +fx15twoeighttfjlcglnbptwo66 +threeseven522 +xrjpstjr2 +6eight1742oneighthhj +1ddfkgjrxfzrhnxtnvfqxdv4 +8hlcxdpkrnrgfzmsschlhcbndkcvdszgqntl +five154sixfourqgffh +5rsvtzgrvq1slrlgqksone6lns +92sevenk3xfrvgddsthree4 +rctlcz67 +2nmrbhnzpf7 +bjmssix1sevenfour4 +744ninefivefivejjcnpgrqxtrctwo +r4five4 +16two2 +threefn8 +3gmsrqtjm +one8tmlnlqvgfone5fivefive +1spllmone9three1xsssk5 +6rlqqblbrxh8 +41qqccnsevengbbrpgcqggtlhtzqcfqzhtx +hzfivethreenine2 +sixeightvcm4lngvkdlpz6dstz +twoeight34tv1 +tgqc6fqsftwoninexncjnrtcgcbrxdmnine +8one27ninerjt3seven +1sjvxlzszhhsix +2xxmpjsfbr +7eight5eight5bzgdpkkpgrn +twozcrxdsix1lrxltrhvznine7twoone +8qlfive8nlmthree39 +4five5five7671 +4fiveqtrngqtbpd74 +vbccfjhjndeight1h +8kfzchkdvfgvlhqzfgseven +6ninexrxsvlmmzrsevenjhzzggfcxqrvfjtnjctveight9 +6fourfourfourxgrgqklnpcsjbsqvhnkjfcjdhdf +65fpnfszb3 +srnhthmpseven1four3rrpznf +vgmqr9zttpdrzjfiveninesevendfive +fournthreesevenseven72seven +9594 +twolhvpfzbfsfourrrcpzzshd66grxddrmkvthree +seven5twotwolpsqlbcqpthree +29eightzjgsfmll +gtkrjrsevenfbjcpjlsmqsfceightseven9 +qkbntcjvfl6three9qhpcptvpkfour7b +gvkhmrljmhrpj956bzxhkljpvpxltctjvvpfjtsnb +rcqlnpcmng6l5vfkpddeightsevenfhmxzztndq +sptdrlsfxpsxff4five +lrzhhxdrkdtbdjbsfourthreemmjjnn1 +9sxthreethree +six9fourseven4 +dpone9fshbbpcm8 +twoczqzvqkcnine6eight +qbtkgxp1fourdz +dxrrsdbmtpnl6hfdtj +sixsvtwo8 +5fxdkhbgqm8fouronefive5 +jqj6lhtbjt +6pdgrsdxghfkhptbjcrrjcsevenbksvmzvnninercz +8rzqvh6ntlg2bfktcphztdkckjg7two +fivesixnine1 +4beightsevenonetwothree8jx +sixfourmvpk6fourtgknrjmxfftnmngjnine9 +68seventwosnqsj +g853seven7 +7ninejqslxmkxpbkxksjcjlnttslpcmsprvgnrxg +jmvqrhdcctwofivev6eightone +ninefiveseven9eighthbb7two +threethreethreerlgqzvsevenx3eight +xbkvgdsrhknine3blt +xzbcgjkkbk1two1zprpn3bcxxhlxjtx7eight +3tflfncljtwo9 +four3seven8one6 +six7vqfive +ddhhgvrkzfhone8 +fqtbnbvdvbklnkmpr89twotwo4 +9two166eight4cfnsstwo +twofive88 +nxpmbfiveeightqmtblmtzpjcnxnxjtwosixtwo9 +fourthreefivedone9jzhrbrzmdqkzmqzfklxq +qbgpfsvlx1eightjsevensixfour +2sevenfqkeight2five +sqnsvsevenrbkhgkbhmmqjztzvn3sevennkcghqqcckp +eighthcrzxpjt1eightone +sixone2 +four56zqxr1lcmblzgdgqjnqb +q6hdldzmjh6ninevjm9 +j82onek67 +5njnffiveshlbqpqhzt +97nineoneightcq +ffivetwo41vnzhfqmrd4 +two2fiveone1nftfhvzkpltvn4three +twofivethree7jlsjxgjfbvnlxhb +rmb4fourlmzgvfcsgn2five +6dthkxkcdbssixdlrb38 +qgbnpdpchmnnftqpeight9xlmlskqhc156drhpf +sevensixsevenjqckcmg6sixxtgvrvm2sgtvrjrq +4nnhmghrqrkcmfmqxtqxncljskfvmhfmgqfour +dlpqjk2fivesix7 +onegtddk5vzgpndqp2five +qsslgone4onelbnbckznrfnjmsgz +pvqdbhjgqrgbqkzgpdbmvninekhvfrmpchhxm2 +tpxvskgzgnnvmnfncvqxxtkmm75vfgmxr4zbpdmdseven +ssnqndqxsevenxztmfq64 +mcxmhtnbczdfnstjn31six +twosixfz5jvbxxlhdklbp1 +five4six952 +vmnhjm3rzgglnmzj318 +dcnprh12qnmmqnvhkrhtrnxs5 +5b +mkfgxmvsixeight5 +crzdkbjthreeone287fourpgzqldn +2cgdd +seven8oneeightllqtfbdtmdnvlcsfh5 +4seven1zqponeeightlplm +c7sevendvmxlfpnr6 +eightlkhjgqj6 +njvmgjdmx2 +9six7 +3cfbjptcp5one8four +eight6kxc8one +6sevenlpbdcgbhxsixfourseven7 +4sixeightsix9hq +6eightb +8eight86jkrdgmxdfourthree +4dxczptzbvjfive56eight +seven3threerpqhsqspsdpvxj2sevensndcxn +zqcbcseventwo4gh16jksxkphgf +44tfour7br +five266five93seven1 +prsbtlbninendbpzv5xx5 +6three2nqgtrlkfxn +ninefourxkrsgshmdd78six7nine +gnkphdvhqk74fptcqgp +cfdmp2 +fzhhdclzncxmg26nineeight4 +seventworlcqhfq2qrfiveqqgmmzdpntfm +onedvsbvstdshtlzs6sixfive +qjfbtdtcknthreeeightsix71 +2ninesixscdxtwo +threerlpjxlzsr9qqzmfbzdtnknn2four +8kxxljngrqsgkxcnlhrlxxfgl57fql7 +vhrjlgqjnnthree4four8fivebfourffcnbghnz +5jb5oneoneonebseven +kbkv3three4rgdkdzkrkk +eightxhxzkbhjxsvfsjfbzghktvlqhseven2xkslcrfsgdc +sevenone6rmkcvfour6jhvhz +threenhfprcngzhcqckchphcninecmqvczqt5 +foureight6 +7fkrgmdrxgdkfpvxkns9 +5onetwoqnp +nine73dbfljgnninecdgxrgkdlsqzflbtwo +five3jcsevenfour8sevenjgfxkfgnlzbkb +lqtvkrfour67gdnrhkfvzgfoureightone +kct1pljt8seven +six269two +64k +41ggbblvhs726 +mbvfq5gghsxtwomngfczfdpb1seven +4ggzmdpbkrczhmmrk5 +317 +pxtgbfnfhqgncrsgtf7sixfour +dvqnfourcsnmcxnxq7ghmjbgmct +vnskfrdcjdoneddjpkcj7fourjjlllonepxlpjkzbzfour +hbdjzfbvrthreekxmlkm49 +trptone5bpsxgl +5one1 +sixsixfzgbninecxssl9 +six7xdnsdgsix4 +fivefive84fxrzgk4eight81 +zszvqhms8sstxvfz +3one3sixbmxbfsdbdtmh +qnfgnjgcv6two57 +5676xzlbzk485seven +five8dbbtpxctf +two1gntvjr +77one +vlnkqvczts5tkghpvthree6krgszgx4 +nine2threefoureight +foursevenhc3twofour +9zzgqfzmfpsfn +ghb57sixeightwofqc +6twovninejckdhmcsxkfoursix5 +oneqxljxjhnineppln419 +one2zlfsxrkfourthreexl7 +nqbtczpblq856one6 +3cxmmzlh1 +frjsdskzk79lcxvjqqdnlqsmbpbdxrxthreeseven +twoone457fivetbq4 +fourtvbdksxsjxzgdk77 +fourgbvdlpbgztwoftmkjkkmthreesix1 +nhrqfbzggrskfgmnbg7sevenfzrnlxfbtc +foursevenmdrnfqsn4jvnrntwo29 +fivevzvszgqvqp6627zqnk +15fcvczdlqprxjzhgbxpxs5 +9fourfivejsgvnf9five +kzlndjrn8rgq +spfqqx3sevenoneldqnqbmspvsixfiveninezmvks +oneseven5 +2eightfour5bqbmsnhmtfivebss +ninejnckkvseven4 +jzhfcmvb8fiveqgq18fivevlpgdnkbq +67four +grzpdtl9 +lzf8fivedr2fivevbpldcone +nine4bdfptdffgkssltwopl +eightlvgfhfbsqrdjrskqkprdlltnzzpfhnczsonetwo5eight +7xqfgzglblftvsqqbgpfmthreesix9jfl2 +eightgngsvqvrhgmvhtqhbpdeightfour6 +1bqvpnggbdrfoureightxmclfpfqgjssrpflnzl +eightfive1qvhhthk9ninetwo +six36fourfivefivezsvndsl5four +jnpzplgbqf6tlzpsgvzhtnkdvhzhbvhps5 +cldz3bfpvdxjmc +dpponeseven48sevennineeightrkn +five3fournine +2xcckljnjz98mjjscfjsxsevenqhxrqvqmbvhzgkc +sixtwo66469 +79four5eight +jxqktt47 +eight36 +rsjlmlj5oneightc +xczzpjknphtspmh7eightvfzjjk2five +kmznfcxhsn8fivethreexnineone2 +four6six +2hhnine627 +eightnine1vkdpgvxgm +8three6pvtqmfdxdkxps +7frnthree +78tworhldxeighttphp +dcmv6vvfbzjdtphbpssjnnqdmrgzgkfdveightwov +zsbmctdseven1snxmqxzgsix9 +lxtwo4sevenxsix +tkdkqfpj5eightq8two447 +seven1onesixfivest +45six5sevenseven +jpxxdjphzskpbrllninexmmmdxrznzthreecvsmjssmfxczhm5 +4flhfqlphfcnn9sevenx3 +16ttrmgqninefsgvkt5four +3snfkm +6threetwoglgkbqjlsn4fivehcgfour +ninesixfive1ninelgdmhkqrvn +two3pxvlsheight +two51 +sixninezkbfbxgzznlgtpxgcpzvgkczdbfive8three +fourjljzqgbsthreeqjdgsqpspnsixxnglmkss5m +32sevenctqtqrqlsfourfoursixrcjztxx +8qlccjngpt +2eight58five +1ninesevenxtlbrq6 +9fivevkmm8tgxfkzvgq +53txg +3xqmjvxkcbjf2 +2fhndgqnqd5 +2vnrpjdb6four79 +7four5 +foursix5hdcg489ninerncnk +6s2jd +fournine8ninejn6rkknh5 +fcfxflzv7seven7 +1fournineqzknrvfhdxfoureight4seveneightwobr +1two3 +twombl5 +fourzjh9six +1ljrvbrqpcchb +11rvqfmcxgg +fiveoneggjpmdt2t +nnjdzhdrkvhpxnprlfrhxpbtpbdxm1xfshdr +five39threehhrhsrhhqkjt9 +hm8nine +3ldckgksm48xc2seven8gbzfq +sixqpcqjzqxsjhr7 +kthreethreelmjfour485 +mnggrsbbnh1 +xfn5 +qzlxtczqlvninekjnbnonefcbqqgfmqf66xpvjgfzjgxvjrcqmzx +krsfvctzfhonejxtqbbnd7eight +tjhgbtqtwoljone9 +mdfntzfpg1fiveninecvxrfnine2 +7hcrxzc +6two6plgrmbnine9sdbvgtnj +threenine4fthstfjzzp +6eighteight9npghczggthreectqssdtp +flc4gtqsjmrddx8eightseven +threeone1oneone7 +gfbfjzltcjfkkrsprgtpfive4 +sixrdzp2onesevenrqrtldnq4c +sevenktwo3threeeightthreenhnmpdmlqjnvl +4eight82717 +nrhqqkmkeightthreenzqbgcphoneseven7 +twoprrgggznzffour5bbrdsvtgkkrbl5nlrkpjmnbzgsbtl +28pvjrszmrdntp4nqdnhkdrtwoxr +sixsix9five4 +lxchg91threethree74 +6bmxblxdkghqdjqgqbrqtxknvdsevenztgspsfh83 +39bsspvhslzkmrnzxtlxsbhk4 +74seveneight9ninedgzgjdvxgvrnfz +fourxvvqsfktptjbsb69 +rxsevenfive5vx9 +72six7 +five5lcxv2jvsssxqjtmzclfdfourfive +87three9 +6rckksfour413331 +33gtz +xkmxtvzhgxqqmknn9pzhgjxqseight +8threefivedrtlgrnqfouroneq +6snzkxjcfive62dqtqmtwoxnine +zxtjclonefour1eight5eight1 +qlffthreeseven2three +xfppngbg5six3two8nine +ninesevensevencfhppvhdnfour8 +xhvnm1 +9threecbdccktrkfourfour9twoneqd +1five4fivenine +jcscpdtzk757nine8 +sevenninesixxkzzzbfour2three +sixthreetwovfqxtbvcrrjtwo3four9 +nzdjhtlqfnxmrzvgrzkfmm7mhmvbbxfd +3seven2eight99 +two6nineljvxs5eightseven3 +55fivezgbmcdpv +hkgvvrtrtwopjbqhtts8seven +c138 +mnrnhqtzthreesnnj2 +81 +qscxbblvsxsgtcpr4cphmxgmbrb +4six2mrvdpxqvhngrrzhjdjfp +4tmrlmdfivefivethree7 +363 +8488one +827pcxnhpk +ckbdqdvhdd4hrb9nnghltwo +5onecjjfdfrxppqkhrpthree5lr4 +62lvlsp2sixfive5 +czxfkhcbvcdhdzx2 +jzdgngb68 +fourtwo18pxkttcr8four +bkttjvvmxvzkhmxtpqrxxhslstwo6five22 +four26mcvb2fivepone +dzptwo5ninejgjrfour +nrhqqnjfour9four +ffoneightpxp41six +threeninehzmrh8dzvmpgrhsv +5onefour5 +jdl5fourtwo8 +threefour8seventwo1seven +lvkjd6five6fxkfthxkgmfour6 +three3seventhreepbsgc +7threethree6fgmfgcv6glrk +nine3five +54one9 +jhvqhrvqfrfgpdrh3three5 +3psztbfour4 +nlffive1nxcqpfour232 +3threetwosgsbdjnt +dtfstb1qhggj +qnnp9twojdg4kfzvtbsevenfour +qfnmdkfkpndd36sixsixfourseven +8seven7oneseven9x4five +4847onetgmsbjjqhtfiveksmmlftk +fivesixlklrnhtdfg3 +cpcqone1pnxkhrkdhhzheightlpb5three +eighttwo6 +seven2fourfourvfzxqbh7 +frf1fivesix3snnlpgpc7 +svtvfcsevenhszznbzpfiveeight2 +lqpqzthree5mcmzpqlxkgpssix +9sltfzqsczpjbndmqbccgmq +5six9fourxppzkgbj6 +8dqhklnxseven1 +3two4 +ktvlhmq3xzmcztbplxlqzpqmoneightffd +76dklx7two8nine5vgvh +xmgjgfz4 +two7tcnceight9 +ninecvfgpbrqcgvplt32six +g3rcbzqxnjllqoneklpbjzbqbseven +svkf8ggdnmeighthhjlz3four +hfdb44zqjmxbrft3qrpgvjngc1 +dzsbnsrg35tm +qchpdcg2 +9775fcg91 +gdrhdgmfdk77eight +14bsixthreeseven +two1twoninepkkvhlzlt3 +kvslhphhj9fourvljqbfive +8nc6 +qg7six +7vkgv8 +td5fivefive +xvfour8jttrsvvjkkdxxzjsl +7qbgdfkj4fourfivenmqtfmgeight +eightfourdzxpfggzxcqrmtxnggchlqtwokcnrdhqf1 +lbhcptlfhflgthreefive9cpprdlbv +nine7941cfxnxszfivebm +ninenhgpj7fourfour9 +456xg +ninethreesqdp11four32lgdl +38trrgt7 +tnhhxlm3rvzvxmmcgpxm +oneqtmg25snbgzfhtkq8hdlvszrclcsrhqsdn +3cjndzmkfx +clxvdv7seven +five6three1 +8sixfour36seven9mlxmrx7 +vdrk27jnrbrvdrnine2nvnlkcszoneightchk +67drgjqrqdktplq +36pprvngxrrjtnpffmrxxdl +hkkrgxtpvzzmcrfcbcjzbpnvls88hrxl +b4jkeightsevenmxkdpvdpt857 +6eighteight2four +eights73five +fiveslpjvzjlpvzone41nine +smnmlrxx7 +onesixfive4 +8s75eightone +1fivecpqsxm +99743ninesix +twopzflcvxsgzn1v8 +9three49 +two2sevenf8sixvdpxzgxbmkrz2 +sevenfive6shhbqhgqqhstdrnfxsjtjvnine +kzqsvn29s +threenlrrhz4ttqljvr +qx9sfdx +nhsbgsvvp7 +876eightfivetprjjbxhzbfpqgltt1 +six3xdjtphrm1pbjvjfn +nflcpmjpt6six9two6xvbmbm +fmlglbgmhvseven4nnkkgcmbv9chmthxvztgsevenbtzs +7bkmchf4five +xgglktnbeight183twonine +onecbpdv9 +fhhmddrnlnkvlb5drtcbrjprzcqlj7mgspc +7threexkfjklvzcfourtnrgmpveightfour8 +6rhmcblhfourtwo3two +one4fiveonenine +slksfchvlgblninefszfbksddgvd4 +four742sbseven3lk +8qbchrfldtvppv6fourzfivez +ninephsmnnvsfour1 +one5kvcrtnc5sixonehjfxnsixfqhzjj +8drgrzngh +16eight8rczbjmblhn +threejpgjbpfdbvgdpftwo96 +sfkhvjgd2smgfkr9two27 +threeqpdeight3 +threesevenxblrmqkvzvrbhsix4 +9seven2vlhsninenvptdvmrpzbrlpfhfnl +xkjpdpgsrtvlfg1eight +seven254 +three8fnmcfhrdtjdlpfqlqhgx +21bkjv54s8 +82ddfour6vcggxhlmpfivesix +cdsbgtpqthreefivel8nine +5five5cksct7bvjbtdjkcz +64fhm +tqk5 +3mhzkhtfzscpgfctfskdn2five +cvmvthreez8fivegvcbsxj35nfxdshqz +sevenqlqmkhdjpmsjrtggqzfive35scmnfpmhmp +sixfive2 +6sevensvqhhfivetwo +eightthree84 +82six8 +8bbhrkzgtg59cpgdvb +11three3hfjkvmsl +qdljkm792 +eightgq5xgskvtpgmhxsnhzlqhnksxflvx +ghdhv1seventhree55fourthreemrlhq +oneonethree3zm +3twobsxqfsfnine +eightsbznkpzsqqtpxfhlfr5 +sevenchs2twoeight +ninezjtxp7bpzdgtoneeightoneighth +fmkbvzzgvl46fiveoneightqn +kvsonevxtmmxnfour4lpxjrbcfoursixp +391onelktkfd1three2twonels +pn2 +3cmsmfvjchflngkrbtsfrblltwo +eightfour8ninesix29 +dpdvnonefour2eightbzzrvthmkgfcdv5 +59sfiverboneone3 +6xrqq1 +9bczfbfbhkntmdmseven68 +npqm35qszmptx +fivepkdlmonefivesixz252 +dzrtwonetbbv9twovrsp +fpkfourfivendkhz6five +86dknvgcnmcslmztwo3 +fivetxrrzjpb6tqseightjthnhn +362zhtxdgvcdgnzv55 +eightsevenbllbgvdonethreeprglpjhxhqfdn6csnghrtl +5fourc +8fournine3svdlh5sevenoneighttsq +eightjkqmgljpprcpblvrthreeseven8fourone7 +vqrqlhmb9seven231vbfzrrstwohjvdjgg +kk1foursixeight849 +seven13ttbnlr21 +jfgsksrrkjsixsixthreesixfourrbxqzdhc9 +3fiveeightqbndjdg6pmftqshone +nineoneseventkdpztbkk83two4 +cjdbxhpzr87eight +twosevenkkdhf86sevendzhvkrttjljr +67cdltmnbkktzseightsix7two +three44zqtglqcffrkmhsgjfive +twoonenbf74three9tthsvmngcx +lvrnpvmvgvnnonesix5 +nchcfxxphmnqbhfourxnine52sixj +fourqpvngjszftg88seven +xgzmv133zvjmlfqhcmjbqzfntkjtpdjlkmv +fivejxc4threebzqbhrldsf +glvtpvnsevenqvrtcgjkhkcsix1seven +sjeightwo4fivesevensixnqxsjckfive +z5 +jxxhsmdvkglljhxzxljqz9zplmslcfdxxljtwosixkjxlsrfcx +fiversdslrkcqclzb7zdzlbllfkvphfqhnfour +five1hpdncfpzhdxrhnv4lblgthree7snj +8scqf +threepcfkrhstmsbfvqxsxrctwo185six +7lqvpqxbjrv9nine985 +eight16jvfqcgbmhdgdltxz9 +three8vncqf9 +zrzp9sevenxthpsxtdninebmnhgrkdjqqjfffourblbkch +fiveseven25snpsnjgnfl +ninefourxrtdlb1threefivefive1rbqzfbxtst +three8three7five41 +tcnvsevenz45fngtjljh +txvpst1 +eighthrlbmtk4nssknqmxjvjnqsqlfivekzrphrtwo +two492ninekcjvllckdtkp +48vlvmkcvbsfoursix8 +eight28sixsix3nine45 +jkm8hhqfclneightjlpsnck8dcvlvgkrfprflsvlh +4zxjqlfn +fivebpqfjtcmlsixfour48onejqhzgtftrvkknngf +dkfour7fivezzsjdbnvgninefivenine5 +twoxjqldtk91eightneight +seven57177 +gpbqvlpxvnzgninefoureightthree5 +bzprbrninesnjpgqthreeeightsixtgmvrthfour4 +83brtxx4zzxsxrcfivebzbxlsl +threesevenninetwo8twoone +veightwochrmfrkrcppxkj4tvvzmhqjhnjvtq1threegtmfnnjpxb +3zgqpvq9krslgjgkjmtbsbhbjg +4nine8mhfs67vhdjvsjrlz2 +nine659xrvhhnnbqq7 +bninetwoeight8fxntpdkrfp9eightnb +qtwonecvbgxqfiveoneeight4five +seven926 +shkkksn4onefivethree +eightsevenqvfqmzqsfn1 +sixdgjmtk5fivevqbxxdzrjqdtgnnffzmfqxzjdzhp +stsjcmzbxt1 +rvnone3three9twozchp26 +ninefmpkdlvzfivetwo1 +four4one4vdpgp9lprtqjzmhk +15rpdhczznrzclfcsxdx41 +seven36twopnvjdxrss5 +46ninenine +6jg8xtqfmjffdlfhzrn +2jsixfive573 +two8eight39fbqkdzseven9 +3gnrg5 +hlkk1 +1sevenfive7 +72jvdqmlrddk +ninetwo8hzdninesixnjhgrcsttwo +23cxdccvvjrjfsixlcrmxjkeight +6brqjfjsix56nine3 +ninezveighttwogc5two +ninexskpsth5sevennine +c7jmmjcv +89sixthreeeight71q +fivekccfngmxseven7onernfskqnqfive5 +sevensixone4hfhgs +xq2jxddpdm3nine8ptqlm4 +smsevendj19fbqdjpznfourgqq6 +7147 +znqbfmcpd4twoseven +fhcsmxtdx6 +sxj2tcb92 +6nine6 +qdfknmdzt88 +66threebsndqlkrshfive5 +eight7pckdhlqzrx24 +3ninevk +sevennine3 +8one1rjtnhjx +eightthree3ninekzhtlqsevenssprmrqhhgncrs +6one8nlzxfxvr +4cgm9fivethree +four77gxvdqztzzgbsxhntwortndzqzj +t8three335 +c2rjggzl +jjgjbqgbnz4gdsqk66991 +ninezckbpsr9 +jb5sevenseven +one5nfdcvx +1kbcmclhrh1onejzft +fiveninefivedglztnjxblonehfive3 +6onesixh6onethree9 +spdzhnt5tpzrkh1fxlnine4skgzdln +1onenineqgzcq2eightwonh +vfzvds826vtlrcg6rvseven +vqmoneight9tknqtcsmb +kqrcrqrqjbdeight7ckhr23 +oneeight2 +8eightnhtqcggtxc6dfsfcjfpznmsthree +sxfvfdkff8dvlmbdktsixmzpnxzmml2 +9lgmxktj1frxl diff --git a/01/input2.txt b/01/input2.txt new file mode 100644 index 0000000..406809a --- /dev/null +++ b/01/input2.txt @@ -0,0 +1,4 @@ +zero1 +1zero +asdfone +asdfoneasdfoneasdf diff --git a/02/02-part2.c b/02/02-part2.c new file mode 100644 index 0000000..b4b73eb --- /dev/null +++ b/02/02-part2.c @@ -0,0 +1,126 @@ +#include +#include +#include + +#define STRBUF_SIZE 200 + +enum color +{ + color_red = 0, + color_green, + color_blue +}; + +typedef struct gameresult_t +{ + uint8_t red; + uint8_t green; + uint8_t blue; +} gameresult; + +gameresult parse_hand(char *str) +{ + gameresult result = {0}; + uint8_t num = 0; + + while (true) + { + num = 0; + while (*str != ' ') + { + num = (num * 10) + (*str - '0'); + str++; + } + + str++; + + switch(*str) + { + case 'r': + result.red += num; + str += 3; + break; + case 'g': + result.green += num; + str += 5; + break; + case 'b': + result.blue += num; + str += 4; + break; + } + + if (*str != ',') return result; + + str += 2; + } +} + +gameresult parse_game_maxes(char *str) +{ + // Keeps track of the most cubes of a single color seen any hand + gameresult maxes = {0}; + + // Keeps result from the most recent hand + gameresult result = {0}; + + while (*str != ':') str++; + + while (*str == ':' || *str == ';') + { + str += 2; + result = parse_hand(str); + if (result.red > maxes.red) maxes.red = result.red; + if (result.green > maxes.green) maxes.green = result.green; + if (result.blue > maxes.blue) maxes.blue = result.blue; + while (*str != ';' && *str != '\n') str++; + } + + return maxes; +} + +bool game_is_valid(char *str) +{ + gameresult maxes = {0}; + + maxes = parse_game_maxes(str); + + return (maxes.red <= 12 && maxes.green <= 13 && maxes.blue <= 14); +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : "input.txt"; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char strbuf[STRBUF_SIZE] = {0}; + gameresult maxes = {0}; + uint8_t gamenum = 1; + uint32_t power = 0; + uint32_t sum = 0; + + while (fgets(strbuf, 200, file)) + { + maxes = parse_game_maxes(strbuf); + power = maxes.red * maxes.green * maxes.blue; + sum += power; + } + + printf("Sum: %d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/02/02.c b/02/02.c new file mode 100644 index 0000000..280f15a --- /dev/null +++ b/02/02.c @@ -0,0 +1,124 @@ +#include +#include +#include + +#define STRBUF_SIZE 200 + +enum color +{ + color_red = 0, + color_green, + color_blue +}; + +typedef struct gameresult_t +{ + uint8_t red; + uint8_t green; + uint8_t blue; +} gameresult; + +gameresult parse_hand(char *str) +{ + gameresult result = {0}; + uint8_t num = 0; + + while (true) + { + num = 0; + while (*str != ' ') + { + num = (num * 10) + (*str - '0'); + str++; + } + + str++; + + switch(*str) + { + case 'r': + result.red += num; + str += 3; + break; + case 'g': + result.green += num; + str += 5; + break; + case 'b': + result.blue += num; + str += 4; + break; + } + + if (*str != ',') return result; + + str += 2; + } +} + +gameresult parse_game_maxes(char *str) +{ + // Keeps track of the most cubes of a single color seen any hand + gameresult maxes = {0}; + + // Keeps result from the most recent hand + gameresult result = {0}; + + while (*str != ':') str++; + + while (*str == ':' || *str == ';') + { + str += 2; + result = parse_hand(str); + if (result.red > maxes.red) maxes.red = result.red; + if (result.green > maxes.green) maxes.green = result.green; + if (result.blue > maxes.blue) maxes.blue = result.blue; + while (*str != ';' && *str != '\n') str++; + } + + return maxes; +} + +bool game_is_valid(char *str) +{ + gameresult maxes = {0}; + + maxes = parse_game_maxes(str); + + return (maxes.red <= 12 && maxes.green <= 13 && maxes.blue <= 14); +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : "input.txt"; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char strbuf[STRBUF_SIZE] = {0}; + uint8_t gamenum = 1; + uint32_t sum = 0; + + while (fgets(strbuf, 200, file)) + { + if (game_is_valid(strbuf)) + sum += gamenum; + gamenum++; + } + + printf("Sum: %d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/02/input.txt b/02/input.txt new file mode 100644 index 0000000..b3914a6 --- /dev/null +++ b/02/input.txt @@ -0,0 +1,100 @@ +Game 1: 7 blue, 9 red, 1 green; 8 green; 10 green, 5 blue, 3 red; 11 blue, 5 red, 1 green +Game 2: 7 green, 3 blue; 20 blue, 4 green; 6 red, 13 blue, 2 green +Game 3: 11 blue, 3 red, 1 green; 15 red, 9 blue, 3 green; 11 blue, 4 red, 4 green; 1 red, 2 green, 14 blue; 18 blue, 4 green, 10 red +Game 4: 3 red, 7 blue; 3 blue, 2 red, 2 green; 2 green, 1 red, 1 blue; 3 green, 5 blue, 5 red; 7 blue, 1 green, 1 red; 2 green, 7 blue +Game 5: 1 blue, 2 red, 1 green; 6 blue, 3 green, 2 red; 2 blue +Game 6: 5 green, 5 red, 5 blue; 9 blue, 6 green, 8 red; 7 green, 3 red, 15 blue; 9 blue, 9 green; 10 red, 12 blue, 4 green; 9 blue, 1 red, 9 green +Game 7: 8 blue, 9 green, 16 red; 9 green, 9 blue; 10 red, 5 blue, 8 green; 9 green, 17 red, 2 blue; 1 blue, 18 red, 8 green; 3 green, 8 blue, 14 red +Game 8: 6 green, 8 blue, 16 red; 10 green, 1 blue, 4 red; 2 blue, 15 red, 10 green; 7 green, 9 red, 2 blue; 17 red, 4 green, 7 blue +Game 9: 5 blue, 1 green, 4 red; 2 green, 6 red, 12 blue; 2 green, 7 blue, 1 red; 12 blue, 2 green, 1 red +Game 10: 1 red, 16 blue, 18 green; 14 green, 13 blue; 4 green, 7 blue; 5 red, 16 blue, 11 green; 14 green, 2 red, 5 blue; 10 blue, 3 red, 6 green +Game 11: 4 green, 2 blue, 17 red; 1 green, 2 red, 1 blue; 5 blue, 14 red +Game 12: 7 red, 7 green; 7 blue, 7 green, 8 red; 14 red, 7 blue, 5 green +Game 13: 1 red, 7 green; 7 green, 5 blue; 4 blue, 1 red; 14 green, 5 blue, 2 red; 3 red, 5 green; 10 green, 2 blue, 3 red +Game 14: 4 blue, 7 red; 10 red, 6 blue; 1 green, 3 red; 1 green, 12 blue, 8 red; 1 red, 1 green, 6 blue; 1 green, 6 red +Game 15: 4 green, 6 blue, 12 red; 7 blue, 6 red, 4 green; 1 green; 16 blue, 5 red, 5 green; 11 blue, 7 red, 2 green +Game 16: 6 blue, 2 red, 4 green; 7 green, 2 blue; 2 red, 4 green; 3 green, 4 blue, 1 red +Game 17: 9 green, 9 red, 3 blue; 9 green, 4 blue, 5 red; 10 green, 2 blue, 3 red +Game 18: 2 red, 1 green; 3 red, 9 blue, 1 green; 4 red, 10 blue; 6 blue, 2 green, 5 red; 12 blue, 5 red, 2 green +Game 19: 2 blue, 15 green, 9 red; 9 blue, 15 red, 4 green; 9 green, 4 blue, 4 red; 2 blue, 12 green, 16 red +Game 20: 5 blue, 2 green, 9 red; 10 blue, 2 green, 6 red; 1 red, 13 green, 6 blue; 15 green, 13 blue, 12 red; 13 blue, 5 green +Game 21: 3 red, 1 green, 10 blue; 8 green, 10 blue, 5 red; 12 blue, 5 red, 2 green +Game 22: 4 blue, 6 red, 2 green; 5 blue, 16 red; 13 red; 19 red, 1 green, 6 blue; 11 red, 2 green, 5 blue +Game 23: 5 red, 4 green, 2 blue; 7 blue, 3 green; 5 blue, 4 red, 1 green; 2 blue, 3 red, 2 green +Game 24: 1 green; 4 red, 6 green, 2 blue; 6 green, 4 red; 8 blue, 3 red, 2 green; 1 blue, 2 red +Game 25: 4 green, 2 blue, 12 red; 10 blue, 1 red, 2 green; 3 green, 12 blue; 7 green, 12 red, 3 blue; 2 green, 6 blue, 13 red; 3 green, 14 red, 9 blue +Game 26: 8 red, 8 blue, 4 green; 5 red, 14 blue, 11 green; 3 green, 4 blue; 3 red, 10 green, 8 blue +Game 27: 14 red, 5 blue, 6 green; 1 red, 1 green; 3 red, 1 blue, 4 green +Game 28: 11 green, 9 blue; 3 green, 6 blue, 7 red; 9 blue, 5 red, 10 green; 8 red, 5 blue, 10 green; 10 green, 9 red, 2 blue +Game 29: 12 red, 1 green, 7 blue; 4 red, 4 blue; 12 red, 1 blue +Game 30: 3 red, 9 blue; 7 blue, 3 green, 2 red; 1 green, 3 blue, 8 red; 15 blue, 8 red, 1 green; 1 red, 2 green, 6 blue; 2 blue, 3 green, 15 red +Game 31: 10 red, 14 green, 9 blue; 6 blue, 7 red; 16 red, 3 blue, 5 green; 11 red, 7 blue, 1 green; 10 green, 8 red, 3 blue; 14 green, 6 red, 8 blue +Game 32: 1 red, 7 blue, 4 green; 5 green, 6 blue; 4 blue, 2 green; 2 blue, 3 green +Game 33: 2 red, 4 green; 1 green, 12 blue; 1 red, 4 green, 13 blue; 3 red, 11 blue; 8 blue, 3 red, 4 green; 4 green, 2 blue, 3 red +Game 34: 9 green, 3 red, 10 blue; 2 red, 5 green, 7 blue; 8 green, 3 red +Game 35: 3 blue, 1 red; 1 red, 1 green, 3 blue; 13 red, 1 blue; 3 blue, 3 green, 14 red; 1 blue; 3 blue, 2 green, 3 red +Game 36: 5 red, 10 blue; 10 green, 4 red, 8 blue; 6 blue, 9 green, 9 red +Game 37: 1 red, 3 green, 1 blue; 7 blue, 4 red; 11 red, 6 blue, 2 green; 1 green, 10 red, 3 blue; 2 blue, 1 green, 10 red; 10 red, 4 blue +Game 38: 13 red, 6 blue, 1 green; 8 red, 4 green, 8 blue; 13 green, 7 red, 3 blue; 6 red, 12 green, 2 blue; 7 blue, 15 green, 5 red; 13 green, 2 blue, 11 red +Game 39: 1 blue, 5 green, 6 red; 1 green, 8 red, 4 blue; 8 red, 10 green, 6 blue; 2 blue, 1 red, 4 green; 3 blue, 2 red, 7 green; 8 red, 6 green, 2 blue +Game 40: 6 blue, 20 green, 12 red; 7 blue, 10 red, 7 green; 5 red, 2 green, 8 blue; 2 blue, 1 red, 7 green; 11 green, 3 red; 9 red, 9 blue, 6 green +Game 41: 15 red, 5 green, 7 blue; 4 red, 7 blue; 12 green, 7 blue; 12 red, 15 green, 8 blue +Game 42: 2 green, 12 blue, 4 red; 2 blue, 2 red, 8 green; 10 blue, 2 red, 11 green; 1 green, 1 red, 5 blue +Game 43: 14 blue, 2 green, 11 red; 10 red, 8 blue; 15 blue; 1 green, 16 blue, 6 red; 3 red, 17 blue; 3 blue, 1 green +Game 44: 3 blue, 4 green, 9 red; 7 green, 15 red, 2 blue; 8 green, 8 red; 3 green, 10 blue, 6 red +Game 45: 2 green, 14 red; 1 blue, 16 red, 5 green; 3 green, 5 red; 1 blue, 5 green, 2 red +Game 46: 2 red, 13 blue, 6 green; 8 green, 1 blue; 8 blue, 6 green, 2 red; 6 green, 3 blue; 2 green, 7 blue +Game 47: 1 green, 11 blue, 6 red; 3 green, 4 blue, 4 red; 6 red, 13 blue; 6 blue, 5 green, 6 red +Game 48: 1 red, 1 green; 6 red, 3 blue, 2 green; 3 green, 6 red +Game 49: 10 blue, 15 green, 5 red; 5 green, 10 red; 4 green, 12 red, 5 blue; 7 red, 9 green, 7 blue; 17 green, 3 blue, 4 red +Game 50: 7 red, 8 green; 11 red, 1 green, 2 blue; 12 red, 4 green; 15 red, 2 green; 5 red, 2 blue, 6 green; 1 green, 3 red +Game 51: 7 red, 4 blue, 1 green; 10 red, 7 blue; 11 blue, 8 red +Game 52: 3 green, 2 blue, 1 red; 1 red, 1 blue, 2 green; 3 green, 12 blue; 9 blue, 3 red; 6 blue, 2 red, 2 green; 1 green, 1 red, 14 blue +Game 53: 7 red, 1 green, 4 blue; 5 blue, 5 red; 7 red, 2 blue +Game 54: 3 red, 8 green, 12 blue; 15 red, 4 green, 16 blue; 1 blue, 4 green, 5 red; 5 green, 8 red, 10 blue; 14 red, 7 blue +Game 55: 8 green, 18 blue, 2 red; 4 red, 15 green, 19 blue; 10 blue, 8 red, 1 green +Game 56: 13 blue, 2 red, 5 green; 1 blue, 13 green, 5 red; 3 red, 1 blue, 10 green; 5 red, 14 blue, 1 green; 11 green, 6 blue, 6 red; 11 green, 7 blue, 8 red +Game 57: 1 green; 1 blue; 1 blue, 6 red, 1 green; 1 green, 3 red; 1 green, 6 red +Game 58: 14 blue, 7 red; 4 green, 10 red; 5 blue, 7 green, 6 red; 3 green, 6 red, 19 blue +Game 59: 3 green, 5 red, 3 blue; 1 blue, 5 green, 3 red; 3 blue, 7 red, 4 green +Game 60: 6 blue; 11 blue, 2 red, 6 green; 1 red, 3 blue; 2 green, 1 blue, 2 red +Game 61: 5 red, 6 green, 8 blue; 8 blue, 5 green, 7 red; 6 green, 3 red, 7 blue; 8 green, 7 blue +Game 62: 9 green; 4 red, 5 green; 3 green, 14 blue; 4 green, 3 red, 6 blue +Game 63: 6 green, 12 blue; 1 red, 12 blue; 1 green, 13 blue; 3 blue, 8 green; 7 blue, 2 green +Game 64: 2 green, 11 red, 1 blue; 2 red; 3 green; 2 green, 6 red; 1 blue, 6 red +Game 65: 9 green, 1 blue; 5 green, 14 red, 1 blue; 11 green, 6 blue, 2 red; 8 red, 1 green; 9 green, 11 red, 5 blue; 18 green, 11 red, 1 blue +Game 66: 5 green, 17 red; 1 blue, 4 green, 2 red; 3 green, 2 blue, 13 red; 4 red, 1 green; 2 green, 18 red; 18 red, 1 green, 2 blue +Game 67: 7 green; 2 blue, 1 green; 1 blue, 6 green, 1 red; 3 green, 3 blue +Game 68: 7 blue, 18 red, 16 green; 7 blue, 6 red, 3 green; 5 blue, 4 red; 12 red, 20 green, 7 blue; 5 green, 4 blue +Game 69: 5 red, 19 green, 2 blue; 12 green, 7 red; 7 red, 10 green; 2 blue, 1 red, 1 green +Game 70: 8 red, 2 green, 14 blue; 1 green, 12 red, 3 blue; 2 green, 1 blue, 18 red; 10 red, 15 blue, 1 green; 2 green, 1 red, 14 blue; 1 green, 12 blue, 8 red +Game 71: 11 green, 9 red; 17 red, 1 blue, 9 green; 14 green, 1 red, 1 blue; 6 green, 11 red; 3 red, 14 green; 1 blue, 12 green +Game 72: 4 red, 3 blue, 16 green; 12 green, 5 red, 4 blue; 7 red, 4 blue, 12 green +Game 73: 1 blue; 1 green, 10 blue, 1 red; 1 blue, 1 red, 1 green; 11 blue, 1 green, 1 red; 10 blue +Game 74: 12 red, 3 green; 11 red, 1 blue; 19 red, 1 blue; 3 green, 1 blue; 5 red, 1 blue; 5 red, 1 blue, 2 green +Game 75: 9 blue, 4 green; 1 green, 1 blue, 5 red; 6 blue, 8 red, 3 green; 10 blue, 2 green, 6 red; 3 green, 3 red, 3 blue; 4 green, 7 red, 8 blue +Game 76: 1 green, 13 blue, 2 red; 1 green, 15 blue; 8 red, 1 green, 10 blue; 3 blue, 6 red +Game 77: 9 red, 2 green, 11 blue; 6 red, 5 blue, 2 green; 6 blue, 9 red, 1 green; 4 blue, 5 red; 13 blue +Game 78: 13 blue, 4 red, 2 green; 7 red, 2 green, 8 blue; 6 red, 20 blue, 4 green; 7 red, 3 green, 14 blue; 15 blue, 2 red, 3 green +Game 79: 2 red, 10 blue, 6 green; 4 blue, 3 red, 3 green; 3 red, 5 blue, 3 green; 1 blue, 4 green, 1 red; 1 red, 3 green, 1 blue; 1 blue, 6 green +Game 80: 2 green, 1 blue, 3 red; 2 green, 2 red; 1 green, 4 red, 1 blue; 4 red, 3 green +Game 81: 1 red, 3 green; 11 green; 4 green, 6 red; 1 red, 1 blue, 13 green; 11 green, 1 blue +Game 82: 15 green, 3 red, 9 blue; 3 blue, 7 green, 3 red; 3 blue, 11 green; 9 blue, 3 red, 9 green; 5 blue, 1 green, 1 red; 4 blue, 9 green, 1 red +Game 83: 5 red, 1 blue; 17 red, 1 green, 6 blue; 3 blue, 11 red; 7 blue, 4 red; 1 blue, 12 red, 1 green; 1 red, 1 green, 1 blue +Game 84: 6 red, 7 green, 3 blue; 2 blue, 7 red, 15 green; 1 blue, 5 red, 3 green; 10 red, 1 blue, 4 green; 4 green, 2 blue, 4 red; 9 red, 11 green +Game 85: 1 green, 10 red; 10 red, 2 blue, 3 green; 2 blue, 6 red; 1 blue, 16 red; 8 red, 2 green; 13 red, 4 green +Game 86: 3 blue, 2 red, 9 green; 2 green, 6 red, 8 blue; 2 red, 7 blue, 8 green +Game 87: 14 red, 1 green, 2 blue; 9 blue, 11 green, 7 red; 13 green, 5 blue, 1 red; 12 red, 7 blue, 3 green; 6 red, 8 blue, 3 green +Game 88: 7 blue, 2 green, 14 red; 7 red, 4 green, 16 blue; 6 green, 6 blue, 2 red; 1 red, 7 green, 2 blue +Game 89: 3 red, 5 blue, 3 green; 4 blue, 2 green, 14 red; 17 red, 1 blue +Game 90: 9 red, 1 blue; 7 red; 12 red, 1 green, 1 blue +Game 91: 12 green, 16 blue, 5 red; 18 green, 11 blue, 3 red; 5 green, 6 blue, 2 red; 13 blue, 10 green; 3 red, 2 blue +Game 92: 7 red, 10 green, 13 blue; 4 green, 9 blue, 1 red; 3 green, 9 red, 13 blue +Game 93: 2 blue, 2 red, 6 green; 3 red, 14 green; 13 green, 3 red, 3 blue; 3 red, 8 green; 13 green; 13 green, 1 red, 2 blue +Game 94: 12 red, 5 green, 2 blue; 5 blue, 12 red; 5 blue, 2 red, 9 green; 10 red, 8 green, 8 blue; 7 red, 8 green; 3 blue, 6 green, 5 red +Game 95: 7 green, 5 red, 3 blue; 14 green, 3 red, 5 blue; 6 green, 1 blue; 10 green, 2 red, 5 blue; 4 blue, 14 green, 4 red +Game 96: 2 green, 2 blue, 2 red; 5 blue, 2 red; 2 blue, 1 green; 1 green, 1 red +Game 97: 5 green, 6 red; 6 red, 5 green; 4 red, 4 blue; 1 blue, 4 green, 3 red; 1 green, 8 red; 2 red, 9 green, 5 blue +Game 98: 1 red, 3 blue; 3 green; 1 red, 4 green; 1 red, 4 blue, 3 green; 2 blue, 4 green, 1 red +Game 99: 8 blue, 3 green; 1 green, 3 red; 2 green, 5 blue, 7 red; 5 red, 9 blue, 1 green; 3 green, 6 red, 7 blue; 3 green, 6 blue, 9 red +Game 100: 13 green, 9 blue, 4 red; 2 green, 2 red, 15 blue; 1 red, 1 green; 9 green, 1 red diff --git a/02/input2.txt b/02/input2.txt new file mode 100644 index 0000000..99936c5 --- /dev/null +++ b/02/input2.txt @@ -0,0 +1,3 @@ +Game 1: 7 blue, 9 red, 1 green; 8 green; 10 green, 5 blue, 3 red; 11 blue, 5 red, 1 green +Game 2: 7 green, 3 blue; 20 blue, 4 green; 6 red, 13 blue, 2 green +Game 3: 11 blue, 3 red, 1 green; 15 red, 9 blue, 3 green; 11 blue, 4 red, 4 green; 1 red, 2 green, 14 blue; 18 blue, 4 green, 10 red diff --git a/03/03-part2.c b/03/03-part2.c new file mode 100644 index 0000000..902ee5f --- /dev/null +++ b/03/03-part2.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include +#include + +#define STRBUF_SIZE 200 +#define DEFAULT_FILE "input.txt" +#define ISDIGIT(X) (X >= '0' && X <= '9') + +// Parses a found number. +// The provided location can be any digit of the +// number; this function will automatically +// seek the first digit before processing. +// Erases numbers as they are processed. +uint16_t parse_num_at(char *str, uint8_t idx) +{ + + // Check input + if (str[idx] < '0' || str[idx] > '9') return 0; + + // Find first digit of number + while (ISDIGIT(str[idx]) && idx) idx--; + if (!ISDIGIT(str[idx])) idx++; + + uint16_t num = 0; + + // Add up all digits + while (ISDIGIT(str[idx])) + { + num = (num * 10) + (str[idx] - '0'); + // Erase the number to make sure we don't count it twice + str[idx] = '.'; + idx++; + } + + return num; +} + +// If the character is a * with two adjacent numbers, +// returns the gear ratio. Returns zero if the symbol +// is not a gear. +uint64_t get_gear_ratio( uint8_t idx, + char *above, + char *current, + char *below) +{ + char *above_copy = malloc(sizeof(char) * STRBUF_SIZE); + char *current_copy = malloc(sizeof(char) * STRBUF_SIZE); + char *below_copy = malloc(sizeof(char) * STRBUF_SIZE); + + memcpy(above_copy, above, STRBUF_SIZE); + memcpy(current_copy, current, STRBUF_SIZE); + memcpy(below_copy, below, STRBUF_SIZE); + + uint16_t nums[8] = {0}; + + if (idx) nums[0] = parse_num_at(above_copy, idx - 1); + nums[1] = parse_num_at(above_copy, idx); + nums[2] = parse_num_at(above_copy, idx + 1); + + nums[3] = parse_num_at(current_copy, idx + 1); + nums[4] = parse_num_at(current_copy, idx - 1); + + if (idx) nums[5] = parse_num_at(below_copy, idx - 1); + nums[6] = parse_num_at(below_copy, idx); + nums[7] = parse_num_at(below_copy, idx + 1); + + free(above_copy); + free(current_copy); + free(below_copy); + + uint8_t i = 0; + uint16_t num1 = 0; + uint16_t num2 = 0; + + for (i = 0; i < 8; i++) + { + // More than 2 adjacent numbers + if (nums[i] && num1 && num2) return 0; + + // The second number + if (nums[i] && num1) num2 = nums[i]; + + // The first number + else if (nums[i]) num1 = nums[i]; + } + + return num1 * num2; +} + +// Search through a line of *current for symbols. +uint64_t parse_line(char *above, char *current, char *below) +{ + uint64_t sum = 0; + uint8_t idx; + char c; + + for (idx = 0; current[idx] != 0; idx++) + { + c = current[idx]; + if (c == '*') + { + // We've found a symbol, + // add up all numbers around it + sum += get_gear_ratio(idx, above, current, below); + } + } + + return sum; +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : DEFAULT_FILE; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char *above = malloc(sizeof(char) * STRBUF_SIZE); + char *current = malloc(sizeof(char) * STRBUF_SIZE); + char *below = malloc(sizeof(char) * STRBUF_SIZE); + + memset(above, '.', STRBUF_SIZE); + fgets(current, STRBUF_SIZE, file); + + uint64_t sum = 0; + + while (fgets(below, 200, file)) + { + sum += parse_line(above, current, below); + + free(above); + above = current; + current = below; + below = malloc(sizeof(char) * STRBUF_SIZE); + memset(below, '.', STRBUF_SIZE); + } + + // Process the last line of the file + sum += parse_line(above, current, below); + + printf("Sum: %lud\n", sum); + + return 0; +} \ No newline at end of file diff --git a/03/03.c b/03/03.c new file mode 100644 index 0000000..dbae458 --- /dev/null +++ b/03/03.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include + +#define STRBUF_SIZE 200 +#define DEFAULT_FILE "input.txt" +#define ISDIGIT(X) (X >= '0' && X <= '9') + +// Parses a found number. +// The provided location can be any digit of the +// number; this function will automatically +// seek the first digit before processing. +// Erases numbers as they are processed. +uint16_t parse_num_at(char *str, uint8_t idx) +{ + + // Check input + if (str[idx] < '0' || str[idx] > '9') return 0; + + // Find first digit of number + while (ISDIGIT(str[idx]) && idx) idx--; + if (!ISDIGIT(str[idx])) idx++; + + uint16_t num = 0; + + // Add up all digits + while (ISDIGIT(str[idx])) + { + num = (num * 10) + (str[idx] - '0'); + // Erase the number to make sure we don't count it twice + str[idx] = '.'; + idx++; + } + + return num; +} + +// Returns the sum of all numbers around a symbol, +// including diagonals. +uint16_t search_numbers_around( uint8_t idx, + char *above, + char *current, + char *below) +{ + uint16_t sum = 0; + if (idx) sum += parse_num_at(above, idx - 1); + sum += parse_num_at(above, idx); + sum += parse_num_at(above, idx + 1); + + sum += parse_num_at(current, idx + 1); + sum += parse_num_at(current, idx - 1); + + if (idx) sum += parse_num_at(below, idx - 1); + sum += parse_num_at(below, idx); + sum += parse_num_at(below, idx + 1); + + return sum; +} + +// Search through a line of *current for symbols. +// returns the sum for that line (erases numbers as +// they are processed.) +uint16_t parse_line(char *above, char *current, char *below) +{ + uint16_t sum = 0; + uint8_t idx; + char c; + + for (idx = 0; current[idx] != 0; idx++) + { + c = current[idx]; + if (!ISDIGIT(c) && c != '.' && c != '\n') + { + // We've found a symbol, + // add up all numbers around it + sum += search_numbers_around(idx, above, current, below); + } + } + + return sum; +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : DEFAULT_FILE; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char *above = malloc(sizeof(char) * STRBUF_SIZE); + char *current = malloc(sizeof(char) * STRBUF_SIZE); + char *below = malloc(sizeof(char) * STRBUF_SIZE); + + memset(above, '.', STRBUF_SIZE); + fgets(current, STRBUF_SIZE, file); + + uint32_t sum = 0; + + while (fgets(below, 200, file)) + { + sum += parse_line(above, current, below); + + free(above); + above = current; + current = below; + below = malloc(sizeof(char) * STRBUF_SIZE); + memset(below, '.', STRBUF_SIZE); + } + + // Process the last line of the file + sum += parse_line(above, current, below); + + printf("Sum: %d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/03/input.txt b/03/input.txt new file mode 100644 index 0000000..97c616e --- /dev/null +++ b/03/input.txt @@ -0,0 +1,140 @@ +.854...........................................................................362...........271...732........838.........24................ +...*.............................117*...........459........767*648....#.........*...................................$...&..=................ +....970.........368.124.+............57................653...........723.....366....*443..60.........536....441....45..879.....789...*...... +...........749*...-...+..330.....................215%...*................725.....953........%.................*............639......331.419. +.......706.....59.............*....=...262.............678...........857.*............189....................912.+589.846*...*.............. +..........*................393.59..418....*................151...........594...........*....584*258.......................17.997............ +.......774....275........................777........841..............988.........121....908.........86.....482..295....................@.... +.110..........%.....605..@.......305*18...............*....740.............840..*................52*.......*...........100...........250.... +...........*..............856..............412.........761....*....344....*.....505.....................121......709...-....-............... +......980.269..189+............701..............22...$........343..*...684..............-375......223........97.*..........890......443..... +..904*..................555.....*.......38.....*....207............773.......................824.....*.......*..../....618.................. +....................355*........362....*......442.$..........613...........%770.......526.....*.......418.....283..76....*....862........... +...450....*292..............735.....149...........143..........*...458...........279.........43..769...................$..48.....*.......... +....*..413.........983*....*.................679.......642....214...#........107*......=.........*.....%...........276.39......196.889*624.. +...128.................658.515...890#...................../...........................60..../....528..359.....451...*.....56................ +...................719...................525.................$502............284-........@...489.................#..287.....@....+.......... +...849...............*................../.........................282.+649...............217............240.....................833.....930. +.......666...179.....986.526................./927......73.....176*...............@...459...........=946..*..488...126.....*................. +..........@.....*549.....@...261.....370*951...........+.............114......170.......@...............269............471.891.$859......... +.............................../.................646.....-.327........*..237..............452......../......*620..713...............324..... +..................=716.....753....................-....431..=.......692.%.......210.......*.......860....208...............81*655....$...... +......298....17*..........+....................................................*..........603................950.218.$...................... +................692...54......+778.809........140..*.........249............%.332..............*.........372*......*.328.....=.............. +.......421.............#..............+........*....493.......*..........589..................286...............254..........458...672...258 +........*.....949.630.....725...609.........408.............108..............304.517......829.........666*..........724.182...........*.=... +.........435./....*..........*.*................580..................@.........*..&..147.-......221*......544..662/....*...........881...... +..750.............561......568.487.@...935.......*....106...........104......808.......*............333...................&900.............. +...................................287.$......930.....&.....*528.........332............755..................840../.............583.....209. +.371.299.................503.............................632................*.......&...................500........647..193.......-......... +....*........-902..2.123..*...912.......775......./...............241........734....90.968.513..66.566...................*..&............... +..................*....@.923...*.......*.....289..47.....785..710.......54................*......*....................767....452....=....597 +.............348.362............607.....889.....#........*....*........*......$904................694...............................241..... +....955........*.....559*792............................307..25.........449..............*751.404.....134.....841........................... +......&.959...300............446.504.644....692...............................#.................-.....*.......*...758*35.................... +.908$...*...........&..861...........=.....%....240............-..+..9.514...615.....&....-646.....538...144.751...........899.........545.. +.......806.270*....946.@...............*..........*.555@....803..322.-............410..........514.................510..10..*.....858..-.... +...............373....................7.918.....699.........................710.......&...........-.....78%............+....34.............. +....653...............................................553.......896.......-......&...721....970............................................. +.......%...........379..377.....770@.................$.....126....*...712.287....951.........*......984*..........+.............+700........ +..............924...*....*.............422...................*...233.*........................124...........902....181...................... +................&....156..363.....*855....*.................884......509..879..755.......$...........*635......*........283.........661..... +..559..........................393.........766...789.............683..................461..#......910.........904.........$.%......*.....13. +.........=...568.........680/.......................*......*522.#..........................747...........*113................702...952...... +....*....334...*...392..........910*...............233..189.........219.879............225......521...941................................... +.146.981......284.*.......*972......391.....789*...................................628*.....*....*................675....................... +..................921..151......................983...............582......983.690.......213.137.268.............*..............24$......... +....561....................600........106-...............226..................*.....996.............................681.....768.......852... +..............................%............................$................=...963..$.....@............421*305.......*.....*........$...... +.....923.285*.....961...........*......$812......812..851.............678.29.......*......501.....228..............385...853...........251.. +.444*...............*...998...99.711.............+.....*......330.....*.........287...........781..+..........%445.......................... +......$....250=.....965...*.............................113...$......766....$.......941........-......658.............894........351........ +......335...............463.328*.....411....%.............................981.113......*5.............*...773=.573&....*............$....... +..........%348..................460.....*5..517.......583.261.....889@.......................953.....496...............547............620... +...299.................367.......................+....*................852.442.796.........*.@...............=................834.....*..... +....*....772...487.......................#......938.462.956..41.643...*.....#.....*592....66...809.368..3..549........................772... +.566........*.....*320.....498..775.230.193....................*......961.........................*....*.......%283.....406.......495....... +........292..585..............*.*.....*..........213...*309...................469..549......413........903................*....29..*........ +.........*.......@.........551..806...489......................51.655.999*.......*.$.............21*.................300..931....*..595..... +......878......62../...........................871......169..=..&..*......235..788...497..........................68....*.......191......... +.144.........+.....31............-...............*..623*....428.....955...............*.............424....89....*......728.............*665 +.............447...............530...203...955.336..........................227........665.......$.........*.....669..............473....... +835...................*323..............*./...........=.....24..........*.........................452.......9.............263.........570... +......568...803@.....................152.......209.933.....*....877..667.895............548...963......................................*.... +.......$.........=............................*...........948..-...................171.*........*.605.765..-........90..............992..... +..360..........#.476...........................564../.............755*...............+..709...11.....*......909..........696..124%.......... +........74...73................320.........658......739...=...........484...860*....................................314..................... +...=509...*.........79.290........*...222...*.............46...940..............960.....473.....320..........$681......*591..269....../..... +........887.94@......*..*.........302...+.784.554+............+......#......455........./............891..........457........*...609.120.... +....................874.246.....................................+.....228..*....&.........272....%..$.....*377.....*..52..604....%.......... +.....44.....870*457................905.45......58...............956.........935.551...807..$.....21....356.......317....................%... +.........=...................267......*...300=.........543..............398..............#.................$.......................386...745 +..........145......+............................*......*...........7....$.............64...........646....675..1..930..770.....791.$........ +................744....462......443&......*389..575..965...805....+..14.......761*578..-...#..776...*..................-........-.......822. +....668.484...............*............875.................*.........*....................227...*..908.............215......*.......270..... +.......*......771..........318....883......881...........655.@26..130..799.......876..91......28...........699.........807...510............ +.............-........391*.........*.......+......903..................*.....379.*....@...........713........#............*................. +..........+................196..230...........411....*965..682.......873....$.....916....755....&..=.....................296......+958.983.. +...*.....718.......279........%...............................*.271.............@.......*......932.......621..637.843..................*.... +..59..........%2...........................................400...*...142.870...746......256..........865*...........%...=.....%...409...761. +............@...........122*157...........394........%.444.....207...-......*.........................................434..827...*.......... +.....266..19.....=..............624.......*........398....*................373...........418...16.....654.878*.................890.......... +...............487..........884....*......199.227........723......914*411...........228..........%...................872................-... +.....937..608.................*....306........$....................................*..................522..309.@16.....*.............765.... +......#....................128../.................%136....140.................773...114...........33....*....*.........615.....303.......... +.249.....590..$...949..768.......380......%...996..............833...28...310.#...................*..338.....770...559...................... +...+.854.../.678..*....................646...*.........................=...&..............#.....422...................#.231...714.122....... +......*...........552........................741..........+.......437........455*768..134..69..........*........519.......*........*........ +.......976.............466......497$.............607......783........*....*.............@..............28........-.........279......394..... +............%....857...*....542.........915.543..$...............979...581.66......555....................331...................281......... +....715......542..#..20....@........241...*...*.........701.......$...........113...../...193..96*305........&................/...#...489... +219*...................................#.599...845.....*.....................$....*.........*...................$....996...240........*..... +..........151.520...554.............................665..........................1.398.=450..426.....198.....326.....+..........-....129.... +.........*...........*.................687..............588....62..........504................................................970........... +..........463.....776......804............*..............*.....*..........%....90/...834.790...514...740.770.......667...................... +....392..................................371...184........906.56....575.............*.............*.........*......*......435.....308....... +....*..........*......908..........497...........................-.........884....849............374.....620....727......&........../....... +.125........862.326......&........+..........497.....&811.......213.......*...........465....................64.....993..................... +......................%.....288...............*...-.......617...........-..677........*.....32..........-907.+........*.....=....48.475..... +.........787.........400.....*.......420....884.425......*.....420...727........#27..181.....*....414..............986......114./.....#..404 +........*.......%...........596....=.*....................863................$................428..*......899.....................114....... +.595=.112.737.699................382.888..........................315...@...325..........480........115..*.........-......368............... +...........*......+.@......652.*...............................&.....@..182.......219$.........945+.............844...........996....744*... +..87......749..535...395..#....339..564.....813....410.........135...........330.......828...........585......................*..........870 +...+........................$........+..967*.........*....921......321......%................612@....*......................44.............. +.......764...716............818..327..............578.......*...../...........941..................736..@421........762.........282......... +861#......*..@.......982..........*.........+...............714.................*..867.....863........................@....614....=......... +........549................*....260.........91................................85.....$........*.803*895..622.$..............*.........684... +............770*346.....714.652......145.........270...286..........#.......................66..........*.....337.176.813...483...223*...... +..........................................*..392..&.........505...957.@.........158...285......881#....497.........+...*.................... +.........=../..../.....588........227....639............741*..........443..681..........+..153........................335................... +........201.671.96......$............*.....................................*........415.......*........-.......155...........848.58&........ +............................922......92...........180..........................&39...%....208..389......696.....*............=.......883.852 +....237.........950.........*............80..............................................*....................657.......................*... +....../..611.......*.....671...443...971.&....366....381...442....458...$.......589.343.397.....463.......60.......&........125......&...... +..853...../..945..564...........*......*.......@......-................783..........*.......................*.......28......=.........373... +................*.......+843..550..998.973.........+.....208.565..@..............231......292............+.365..172............+............ +......117......615..................*............299............&..862.895............/86...*....114..552........*...697.....733...388...... +.....................................212..261........885...............*...903..26*..........50.....-..........158................*......... +...../........11..360....748......................67....*272.....320...16.....*....137.905......239......470......................433....... +...141........*.....%......+......967........-...%...........243...*.......904............*....*..............88.377......619............... +................=.....-668....%.....=.+461..525.....662.....*......196..28..............778...940..400..682...*...*.........*..638*......... +779#..113........209...........744....................*...144..811....../...#......................-...*.....297..713.....50................ +.........$................#.........844...6...........62.......*.............957...&.......112@.......211.............173....989............ +..749.......$......989..931................*....&............424.........709.......867............590...................*.......*..645...... +...*..290...573......*............437....227.....53......132............#....471%.............501..%..................733.....270.....=..... +..637...*............596............................=....*.......400...............*...........*....................................#....... +......958.....757%.........=.........228......624...746.81../.....*........../..718.198..38...184..............*820..774......./830.693..... +.........................453...405.=...=....................100.144.......728...........*...................498............$................ +..616............................*.756...310.........#52.............130.......=........506.....509.779..........723.......182..+........... +...*....49.....-..............551..........*................789./.....*......306...613........./......*..491....*...............791..931.... +...863.....%.72......832.653........*490....814.....984.....=...741...568..........*.................998........567........+........#....... +.........171..........*..-.......406...............*....389.....................486.....630............../...............457.576............ +..............308..515..................373@......709..&..............*185..................689..........751........44..........*764........ +..............*..............661....=.........*.............993....984.....*.......908......=...273............../.*........................ +.......582..335...260....59......998../.....39.760.313*174...*..........@.183......................*47....&994.887.577........*464.....22... +......*...............................449..................802........762.....522..139+..154..266$......................46.323.....712*..... +....827.....................................35......600*29.....724........488............*...............149*227.........*.................. +........@......278*............@..135..........594.........470*...........*....540*.......42..............................775.536..790...... +.....990...........742......181....*..............*..@521................743.......552............310...*....+738.....................*..... +.......................125.......311............715........263...........................................173...................235....291... diff --git a/03/input2.txt b/03/input2.txt new file mode 100644 index 0000000..32e49ad --- /dev/null +++ b/03/input2.txt @@ -0,0 +1,3 @@ +.854...........................................................................362...........271...732........838.........24................ +...*.............................117*...........459........767*648....#.........*...................................$...&..=................ +....970.........368.124.+............57................653...........723.....366....*443..60.........536....441....45..879.....789...*...... diff --git a/03/input3.txt b/03/input3.txt new file mode 100644 index 0000000..b20187f --- /dev/null +++ b/03/input3.txt @@ -0,0 +1,10 @@ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. diff --git a/04/04-part2.c b/04/04-part2.c new file mode 100644 index 0000000..511fbad --- /dev/null +++ b/04/04-part2.c @@ -0,0 +1,117 @@ +#include +#include +#include + +#define DEFAULT_FILE "input.txt" +#define STRBUF_LEN 200 +#define NUM_CARDS 202 +#define WINNING_NUM_SIZE 10 +#define HOLDING_NUM_SIZE 25 +#define ISDIGIT(X) (X >= '0' && X <= '9') + +void parse_nums(char *str, uint8_t *nums, uint8_t len) +{ + uint8_t i = 0; + uint8_t digit_idx = 0; + char c; + uint8_t num = 0; + + for (i = 0; i < len; i++) + { + num = 0; + digit_idx = (i * 3); + c = str[digit_idx]; + if (ISDIGIT(c)) num = (c - '0') * 10; + num += str[digit_idx + 1] - '0'; + nums[i] = num; + } +} + +void parse_line(char *str, uint8_t *winning_nums, uint8_t *holding_nums) +{ + while (*str != ':') str++; + str += 2; + parse_nums(str, winning_nums, WINNING_NUM_SIZE); + + while (*str != '|') str++; + str += 2; + parse_nums(str, holding_nums, HOLDING_NUM_SIZE); +} + +bool num_in_set(uint8_t num, uint8_t *set, uint8_t len) +{ + uint8_t i = 0; + for (i = 0; i < len; i++) + { + if (num == set[i]) return true; + } + + return false; +} + +uint32_t calculate_points(uint8_t *winning_nums, uint8_t *holding_nums) +{ + uint32_t points = 0; + uint8_t i = 0; + for (i = 0; i < HOLDING_NUM_SIZE; i++) + { + if (num_in_set(holding_nums[i], winning_nums, WINNING_NUM_SIZE)) points++; + } + + return points; +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : DEFAULT_FILE; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char strbuf[STRBUF_LEN] = {0}; + uint8_t winning_nums[WINNING_NUM_SIZE] = {0}; + uint8_t holding_nums[HOLDING_NUM_SIZE] = {0}; + uint64_t points = 0; + uint64_t card_copies[NUM_CARDS] = { [0 ... NUM_CARDS-1] = 1 }; + uint8_t i = 0; + uint8_t copyidx = 0; + uint8_t cardidx = 0; + + for (cardidx = 0; cardidx < NUM_CARDS; cardidx++) + { + fgets(strbuf, STRBUF_LEN, file); + if (strbuf[0] == '\n') break; + parse_line(strbuf, winning_nums, holding_nums); + points = calculate_points(winning_nums, holding_nums); + for (i = 0; i < points; i++) + { + // Add copy of card for every point + if (cardidx + i < NUM_CARDS) + card_copies[cardidx + i + 1] = card_copies[cardidx + i + 1] + card_copies[cardidx]; + else + break; + } + } + + points = 0; + for (i = 0; i < NUM_CARDS; i++) + { + points += card_copies[i]; + } + + printf("Total cards: %d", points); + + return 0; +} \ No newline at end of file diff --git a/04/04.c b/04/04.c new file mode 100644 index 0000000..9dd5a15 --- /dev/null +++ b/04/04.c @@ -0,0 +1,100 @@ +#include +#include +#include + +#define DEFAULT_FILE "input.txt" +#define STRBUF_LEN 200 +#define WINNING_NUM_SIZE 10 +#define HOLDING_NUM_SIZE 25 +#define ISDIGIT(X) (X >= '0' && X <= '9') + +void parse_nums(char *str, uint8_t *nums, uint8_t len) +{ + uint8_t i = 0; + uint8_t digit_idx = 0; + char c; + uint8_t num = 0; + + for (i = 0; i < len; i++) + { + num = 0; + digit_idx = (i * 3); + c = str[digit_idx]; + if (ISDIGIT(c)) num = (c - '0') * 10; + num += str[digit_idx + 1] - '0'; + nums[i] = num; + } +} + +void parse_line(char *str, uint8_t *winning_nums, uint8_t *holding_nums) +{ + while (*str != ':') str++; + str += 2; + parse_nums(str, winning_nums, WINNING_NUM_SIZE); + + while (*str != '|') str++; + str += 2; + parse_nums(str, holding_nums, HOLDING_NUM_SIZE); +} + +bool num_in_set(uint8_t num, uint8_t *set, uint8_t len) +{ + uint8_t i = 0; + for (i = 0; i < len; i++) + { + if (num == set[i]) return true; + } + + return false; +} + +uint32_t calculate_points(uint8_t *winning_nums, uint8_t *holding_nums) +{ + uint32_t points = 0; + uint8_t i = 0; + for (i = 0; i < HOLDING_NUM_SIZE; i++) + { + if (num_in_set(holding_nums[i], winning_nums, WINNING_NUM_SIZE)) { + if (points) points = points * 2; + else points = 1; + } + } + + return points; +} + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : DEFAULT_FILE; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + char strbuf[STRBUF_LEN] = {0}; + uint8_t winning_nums[WINNING_NUM_SIZE] = {0}; + uint8_t holding_nums[HOLDING_NUM_SIZE] = {0}; + uint32_t totalpoints = 0; + + while (fgets(strbuf, STRBUF_LEN, file)) + { + if (strbuf[0] == '\n') break; + parse_line(strbuf, winning_nums, holding_nums); + totalpoints += calculate_points(winning_nums, holding_nums); + } + + printf("Total Points: %d\n", totalpoints); + + return 0; +} \ No newline at end of file diff --git a/04/input.txt b/04/input.txt new file mode 100644 index 0000000..0da8dd9 --- /dev/null +++ b/04/input.txt @@ -0,0 +1,202 @@ +Card 1: 74 8 2 86 40 25 93 17 61 32 | 65 25 73 55 75 94 54 99 53 17 89 4 44 13 15 32 57 92 8 21 74 64 5 87 24 +Card 2: 8 18 79 59 71 84 72 23 96 74 | 22 83 74 78 72 30 8 59 6 23 7 71 31 84 18 96 21 36 51 67 80 79 60 28 42 +Card 3: 63 27 56 19 85 86 40 78 67 54 | 34 32 79 64 35 46 61 31 24 41 33 44 10 56 49 36 4 82 98 54 23 21 63 86 51 +Card 4: 2 95 87 25 13 12 9 24 68 29 | 84 54 49 78 52 60 34 25 97 26 55 39 66 79 23 94 29 67 12 51 9 16 19 76 8 +Card 5: 70 92 50 61 43 16 53 71 91 7 | 17 70 62 84 82 9 14 16 56 15 63 91 77 57 58 60 96 35 88 26 51 54 59 74 80 +Card 6: 34 86 44 60 10 4 89 5 94 92 | 60 95 35 2 86 32 94 79 82 64 4 5 92 89 44 69 34 21 76 72 9 6 52 48 61 +Card 7: 99 36 57 20 46 38 26 58 72 11 | 99 70 20 58 38 67 76 36 84 27 94 11 26 35 46 21 81 31 72 62 13 10 57 54 4 +Card 8: 19 95 24 99 44 36 58 26 31 6 | 69 10 43 42 70 64 92 40 38 47 21 98 41 49 20 71 65 59 91 72 34 74 84 29 22 +Card 9: 87 77 90 73 7 27 48 1 13 55 | 96 28 40 62 19 3 25 47 80 85 68 94 82 50 12 65 84 75 83 41 91 89 55 42 48 +Card 10: 6 89 13 82 16 54 27 67 19 76 | 65 67 94 58 97 61 54 80 53 6 73 41 95 7 83 2 23 11 63 24 78 29 13 16 82 +Card 11: 27 50 4 17 31 70 18 75 91 20 | 71 85 67 80 92 6 31 48 15 70 51 7 78 34 8 72 16 62 4 52 75 39 2 82 74 +Card 12: 27 68 79 78 21 56 53 29 2 74 | 96 69 59 49 20 42 23 71 54 72 25 7 55 19 64 37 62 41 10 66 26 75 93 18 84 +Card 13: 1 75 85 51 47 45 93 11 57 80 | 97 66 4 61 42 36 12 83 86 51 99 90 52 82 30 33 20 56 44 59 18 24 28 40 41 +Card 14: 24 28 85 42 5 3 33 76 98 75 | 31 95 54 8 90 10 6 85 75 44 94 40 62 47 83 26 9 27 68 63 88 80 82 55 93 +Card 15: 52 28 90 27 6 37 44 3 51 39 | 65 44 64 85 47 20 86 83 38 49 80 21 56 30 89 69 84 93 1 48 88 76 36 77 97 +Card 16: 28 7 3 39 71 85 84 13 44 31 | 93 79 33 21 4 18 63 23 68 49 57 9 22 54 27 69 75 29 30 78 37 98 91 38 94 +Card 17: 97 20 84 50 98 82 45 22 33 60 | 53 10 68 92 43 76 99 52 38 96 31 4 25 15 11 42 69 56 62 23 29 74 51 39 40 +Card 18: 28 66 82 85 94 35 72 29 63 68 | 73 86 63 60 20 10 64 89 66 61 90 35 72 8 85 28 29 1 88 49 76 36 82 94 68 +Card 19: 58 41 33 29 38 60 3 73 10 13 | 52 73 20 51 47 75 74 26 69 18 70 24 62 53 91 85 63 1 76 5 42 43 97 10 84 +Card 20: 46 8 66 7 27 4 9 78 24 18 | 13 14 57 92 6 59 3 81 70 10 4 51 98 23 66 64 74 49 83 27 24 73 95 35 7 +Card 21: 15 32 12 47 53 89 24 58 59 18 | 47 82 1 53 58 93 44 19 12 96 13 61 15 72 75 83 65 41 54 49 71 78 68 59 79 +Card 22: 92 27 79 68 46 97 2 96 94 80 | 18 81 12 13 39 93 83 38 52 46 89 17 24 58 49 74 10 8 57 65 35 19 54 41 11 +Card 23: 92 72 68 65 54 18 34 62 41 82 | 96 32 74 10 12 8 34 55 54 83 91 22 47 68 52 21 41 65 72 97 30 70 46 18 9 +Card 24: 49 76 13 10 59 33 86 29 95 32 | 16 60 38 33 68 51 15 50 95 61 29 93 76 6 31 71 10 25 13 40 49 77 2 32 23 +Card 25: 38 66 33 7 77 73 44 50 25 76 | 20 12 63 92 61 5 88 37 75 21 41 47 73 77 13 76 31 80 60 34 93 90 54 3 45 +Card 26: 77 45 81 84 53 80 76 22 75 61 | 25 58 38 45 98 10 6 92 70 82 24 22 4 68 97 72 14 49 17 83 27 53 77 89 75 +Card 27: 60 16 79 54 85 56 92 41 26 44 | 63 44 69 60 96 7 36 2 37 5 41 73 6 51 64 56 53 76 57 99 21 30 67 85 66 +Card 28: 41 84 40 62 67 89 29 7 2 8 | 35 9 24 29 20 33 6 98 50 95 10 36 14 80 1 3 88 15 13 48 18 72 26 76 31 +Card 29: 68 66 52 34 99 70 29 58 19 98 | 88 64 1 14 79 31 44 39 45 40 21 6 97 13 73 11 48 67 8 50 10 57 51 94 91 +Card 30: 99 45 9 78 88 76 60 86 12 98 | 54 60 30 57 68 22 64 26 98 23 89 50 7 61 91 87 83 25 2 37 56 78 94 36 31 +Card 31: 59 93 89 84 66 44 34 88 54 27 | 29 12 61 23 49 86 24 19 54 99 35 90 65 82 13 76 20 87 48 40 62 16 80 33 43 +Card 32: 44 13 99 31 54 52 55 66 58 16 | 40 88 79 93 67 20 30 37 26 24 77 2 81 62 71 82 49 92 86 41 32 59 53 16 90 +Card 33: 76 34 40 17 37 46 72 62 47 20 | 68 73 3 5 44 78 86 82 52 22 80 91 95 42 66 77 38 88 75 33 41 4 54 65 18 +Card 34: 45 19 5 25 68 70 82 73 95 54 | 28 97 19 95 89 42 27 70 17 73 15 25 61 77 82 1 45 7 65 57 54 90 5 68 79 +Card 35: 9 66 65 71 20 89 4 27 15 54 | 97 24 49 64 14 93 77 99 78 34 88 52 83 39 60 56 79 48 57 50 82 18 3 53 95 +Card 36: 66 89 69 77 32 37 22 40 82 11 | 42 74 69 97 60 22 11 49 82 67 56 90 17 15 27 40 66 13 89 77 32 5 3 37 57 +Card 37: 93 31 41 27 36 50 59 97 86 62 | 21 28 79 92 16 86 23 5 45 34 90 66 95 37 9 71 81 67 58 85 15 73 31 25 30 +Card 38: 61 92 74 75 1 70 96 71 30 68 | 66 44 94 35 78 1 92 18 83 93 2 33 70 71 68 38 61 86 56 40 20 30 74 3 46 +Card 39: 20 15 47 8 33 55 29 94 16 18 | 21 63 8 33 15 58 94 66 16 45 30 59 29 52 20 61 86 31 48 40 25 62 47 95 18 +Card 40: 27 23 32 47 55 48 31 93 74 20 | 15 77 85 31 58 53 60 98 20 22 99 92 64 44 76 1 79 9 36 87 72 21 13 48 59 +Card 41: 57 74 11 92 16 78 44 41 13 64 | 39 34 76 80 84 58 54 38 97 23 46 86 65 69 9 15 91 53 6 29 10 49 47 64 4 +Card 42: 5 4 99 36 85 18 63 81 61 47 | 43 73 80 88 76 64 79 7 86 94 98 39 37 56 33 51 49 90 70 6 20 1 21 59 82 +Card 43: 93 18 47 21 75 30 43 90 52 23 | 50 25 65 33 90 58 57 10 55 61 30 41 62 23 76 21 2 75 18 83 92 69 37 5 98 +Card 44: 24 68 45 26 90 76 33 52 19 72 | 80 68 99 1 12 97 90 26 7 32 4 40 77 8 48 83 96 14 49 27 52 94 54 81 37 +Card 45: 94 48 13 95 73 11 8 91 84 53 | 78 84 12 59 62 57 90 5 75 55 29 22 71 92 54 47 39 53 20 14 26 69 34 48 51 +Card 46: 43 63 30 28 71 57 77 20 27 46 | 49 35 56 20 79 75 44 48 95 52 5 66 12 93 24 85 39 7 16 8 99 9 80 78 71 +Card 47: 25 62 88 36 24 10 15 90 8 23 | 4 54 9 80 42 78 32 19 21 65 86 26 28 7 96 71 48 64 36 95 69 44 89 34 57 +Card 48: 54 27 17 84 63 35 73 61 65 83 | 53 6 88 32 87 63 69 19 20 49 17 29 37 45 73 93 41 27 90 54 3 83 36 56 71 +Card 49: 84 14 88 11 45 63 90 76 38 49 | 86 60 58 31 82 98 55 8 99 92 27 50 85 96 33 19 32 3 62 46 56 2 57 16 77 +Card 50: 61 24 52 67 50 37 36 75 3 2 | 32 61 84 75 22 29 21 80 70 56 86 44 96 97 99 6 65 68 81 60 90 43 85 58 66 +Card 51: 89 91 62 39 50 92 79 7 87 6 | 36 47 77 12 98 83 54 11 31 33 68 52 41 75 62 80 18 14 43 65 15 58 19 71 13 +Card 52: 79 38 23 82 69 27 67 86 48 58 | 83 17 90 42 60 68 65 47 45 33 62 7 23 76 29 91 35 95 28 71 13 24 5 25 92 +Card 53: 86 76 93 98 81 57 44 49 65 11 | 88 28 53 34 58 4 48 23 59 41 7 87 55 74 77 14 18 8 94 99 16 19 56 61 2 +Card 54: 59 11 64 1 14 17 74 82 70 6 | 99 22 37 19 2 18 13 38 26 39 46 5 86 97 56 89 78 91 33 10 30 69 52 90 44 +Card 55: 1 18 55 64 16 44 96 20 21 46 | 64 57 21 69 42 18 89 99 20 88 33 37 55 60 31 67 24 26 1 58 96 44 46 16 98 +Card 56: 10 12 98 27 64 75 70 53 9 5 | 41 26 29 93 7 98 78 66 80 57 31 88 35 18 92 58 47 50 79 74 65 84 71 69 42 +Card 57: 52 84 86 58 4 17 91 35 12 83 | 66 17 35 81 22 25 84 10 26 42 58 4 89 83 12 91 52 47 61 9 50 54 88 86 5 +Card 58: 39 77 53 52 71 86 47 31 35 87 | 54 68 67 36 96 14 70 42 65 85 79 97 39 80 72 95 9 60 4 17 81 30 50 91 55 +Card 59: 48 4 42 32 17 24 13 30 25 90 | 65 38 97 19 16 8 52 11 15 64 73 71 74 66 58 62 49 9 37 91 75 12 56 35 80 +Card 60: 82 20 70 4 17 26 94 99 47 35 | 77 16 6 22 49 83 26 91 8 47 94 44 99 59 52 10 70 90 63 86 82 67 41 4 69 +Card 61: 44 95 42 85 16 26 81 92 61 55 | 67 7 17 8 69 34 13 82 47 18 59 76 70 11 25 99 40 85 21 12 22 77 38 44 24 +Card 62: 56 81 21 43 99 50 20 88 62 51 | 81 99 95 38 43 98 88 20 30 64 79 48 6 62 50 73 7 69 34 56 36 39 85 26 21 +Card 63: 36 72 91 33 84 95 15 50 27 24 | 21 39 47 46 65 51 16 36 6 35 89 95 62 15 75 37 56 84 13 63 31 92 93 44 77 +Card 64: 24 12 30 35 3 45 38 67 73 78 | 3 37 27 12 21 92 58 55 33 14 85 74 13 68 57 15 34 94 65 2 70 63 83 61 98 +Card 65: 54 68 51 13 20 2 26 7 91 18 | 71 11 84 8 35 2 87 24 83 89 75 82 91 28 44 79 63 67 9 46 42 53 13 93 31 +Card 66: 56 80 96 75 66 83 8 37 7 22 | 28 66 87 80 4 21 92 37 90 75 57 22 65 59 99 39 8 31 63 93 89 56 29 26 96 +Card 67: 16 46 47 23 79 96 69 93 45 33 | 76 68 18 60 89 55 23 14 25 21 92 62 52 75 28 13 98 90 94 57 12 64 31 73 45 +Card 68: 76 16 78 19 61 43 35 83 55 80 | 23 51 47 64 10 87 40 77 6 84 27 48 91 38 31 22 39 62 43 67 76 58 5 7 80 +Card 69: 23 33 56 51 8 18 58 1 61 72 | 75 14 18 12 32 23 2 41 57 35 33 61 67 27 56 10 72 58 8 31 43 5 1 87 90 +Card 70: 30 44 77 73 93 35 2 72 96 88 | 40 82 38 69 34 22 31 13 90 28 80 30 92 39 5 14 83 33 93 79 71 2 58 67 97 +Card 71: 7 6 91 81 74 36 90 20 22 97 | 12 30 96 64 34 89 56 21 15 10 76 16 14 50 11 9 95 63 55 92 66 59 27 26 75 +Card 72: 83 63 17 81 44 10 18 3 99 92 | 34 42 46 3 55 37 31 47 92 41 61 39 98 29 14 10 69 62 83 48 44 28 26 93 96 +Card 73: 47 24 29 98 77 93 27 8 73 90 | 23 72 55 65 48 70 27 86 50 68 28 77 37 40 87 14 99 49 62 97 56 36 66 47 71 +Card 74: 55 23 63 86 58 94 48 20 72 79 | 77 36 17 49 39 10 47 23 31 94 3 13 40 70 79 72 8 93 56 62 2 18 55 78 97 +Card 75: 58 16 64 19 99 22 20 89 76 44 | 50 39 92 33 32 61 44 72 88 46 25 5 68 54 74 55 78 77 7 89 64 96 95 47 76 +Card 76: 39 10 25 12 88 89 42 14 32 71 | 34 30 22 46 55 43 77 24 36 20 53 47 8 26 48 45 94 62 93 82 79 63 9 89 88 +Card 77: 12 7 66 55 73 83 43 69 37 27 | 96 81 10 89 17 22 29 44 21 3 18 45 60 32 95 62 67 42 39 49 83 82 99 65 16 +Card 78: 16 73 23 52 38 81 64 25 84 87 | 20 97 9 31 95 36 77 33 63 70 68 17 27 83 53 69 94 74 96 5 99 72 89 13 67 +Card 79: 94 28 21 83 49 34 42 9 89 10 | 81 31 85 74 60 39 38 11 15 79 55 32 72 50 99 19 3 96 98 8 76 1 90 30 47 +Card 80: 18 40 55 13 5 9 66 61 20 57 | 68 85 64 60 94 34 1 27 12 43 95 80 58 38 66 91 74 56 37 88 55 20 44 57 72 +Card 81: 88 79 67 89 83 49 50 91 48 35 | 79 87 29 2 24 48 99 18 88 89 22 91 42 4 49 67 20 73 83 17 23 50 27 76 35 +Card 82: 14 49 40 54 10 90 53 63 8 65 | 8 9 60 54 42 72 87 56 79 76 90 93 40 82 49 63 38 28 10 65 69 97 14 96 53 +Card 83: 37 31 96 81 56 70 38 66 95 54 | 24 92 38 32 23 31 29 90 33 54 80 10 66 13 86 37 1 79 95 81 44 70 3 56 8 +Card 84: 78 23 98 84 3 52 37 59 56 95 | 32 36 38 24 90 7 18 74 48 21 71 57 44 8 58 6 82 25 19 72 62 70 67 47 94 +Card 85: 74 25 65 88 20 52 39 21 17 70 | 76 93 62 26 90 34 25 7 36 98 97 70 45 19 47 22 33 21 11 27 8 57 56 71 61 +Card 86: 1 44 73 15 24 94 87 84 33 51 | 53 38 56 26 16 39 99 72 7 8 36 59 69 98 34 27 5 89 25 78 55 29 62 65 83 +Card 87: 25 27 78 39 14 43 56 36 60 33 | 85 93 71 9 39 7 72 20 13 91 30 76 68 52 94 21 56 15 70 60 32 14 84 57 77 +Card 88: 37 97 26 89 54 64 57 98 32 62 | 77 29 63 33 71 20 99 9 78 4 67 31 8 51 41 12 82 19 61 55 11 56 74 24 66 +Card 89: 75 27 74 63 42 45 72 18 85 50 | 52 2 22 57 45 50 8 10 58 65 69 74 99 32 14 42 27 51 56 30 44 20 84 12 16 +Card 90: 42 22 5 75 28 20 82 31 41 32 | 31 35 75 36 23 64 14 50 25 65 7 81 46 70 27 96 44 15 77 99 39 33 61 12 54 +Card 91: 86 76 17 16 3 93 69 13 8 95 | 12 97 48 33 55 35 84 91 5 31 57 77 28 79 6 19 98 26 43 49 1 82 37 61 24 +Card 92: 76 90 89 65 20 95 59 24 63 22 | 25 71 69 47 36 32 50 77 43 85 33 20 39 27 67 96 40 19 84 34 90 98 81 52 80 +Card 93: 91 96 47 12 2 46 61 58 39 77 | 1 69 67 60 65 63 19 32 64 46 62 8 15 94 92 93 74 20 54 29 99 89 23 75 28 +Card 94: 36 66 11 56 96 54 42 44 83 84 | 19 33 82 32 15 16 97 47 64 73 72 2 12 10 29 75 38 27 5 80 39 6 22 53 24 +Card 95: 35 26 10 67 65 73 5 75 78 18 | 75 99 54 38 73 24 33 7 28 9 64 67 74 5 26 30 37 18 39 35 53 10 4 78 65 +Card 96: 17 63 42 20 93 48 94 41 89 5 | 48 88 41 89 1 40 26 53 46 5 49 97 20 91 42 28 74 17 94 79 63 32 93 7 72 +Card 97: 48 77 23 12 8 80 59 88 92 42 | 96 88 13 97 27 86 8 48 33 99 59 23 12 39 90 36 42 92 94 38 76 80 77 26 9 +Card 98: 70 35 92 63 28 96 50 20 94 98 | 70 12 13 22 96 94 61 74 50 32 92 52 93 54 98 66 20 63 28 99 35 87 78 67 91 +Card 99: 49 65 8 14 33 57 92 90 22 97 | 14 92 84 29 61 97 72 43 26 63 57 19 60 46 49 95 35 86 39 36 80 21 30 73 74 +Card 100: 44 47 96 69 98 77 52 31 80 14 | 34 74 18 25 75 67 16 2 49 36 68 39 87 97 33 43 3 19 46 10 45 86 91 50 71 +Card 101: 28 86 75 77 17 78 96 5 20 30 | 31 67 62 83 58 90 23 25 27 35 29 22 64 50 10 15 6 88 17 78 77 9 4 66 63 +Card 102: 15 8 61 1 24 98 32 16 81 93 | 99 69 26 70 88 71 25 40 53 54 79 58 15 32 48 87 18 24 52 2 98 82 10 21 6 +Card 103: 86 29 83 91 56 31 74 87 53 22 | 45 15 79 95 3 14 94 83 16 72 65 36 38 53 78 52 39 91 50 54 86 31 99 22 56 +Card 104: 22 63 37 54 36 96 90 80 8 7 | 63 75 84 80 48 54 36 35 14 74 53 25 47 37 96 23 56 22 6 8 34 90 7 64 55 +Card 105: 49 2 17 32 41 45 85 25 83 12 | 77 13 34 83 80 20 50 47 78 30 11 48 44 86 84 21 25 63 36 49 97 74 68 53 81 +Card 106: 64 2 46 80 75 13 69 56 54 71 | 42 60 95 16 48 30 75 38 46 69 18 98 59 14 93 84 55 70 97 53 32 20 76 2 19 +Card 107: 22 64 50 79 55 18 87 8 20 98 | 28 69 96 15 70 42 11 12 38 83 55 99 62 98 3 79 53 24 91 44 19 9 4 66 82 +Card 108: 1 71 73 45 2 50 17 72 19 9 | 1 62 77 47 27 54 2 55 60 89 71 96 31 43 10 67 3 65 25 9 45 68 50 88 73 +Card 109: 39 61 22 80 23 78 85 99 71 52 | 45 53 46 75 82 84 44 33 76 57 31 65 80 2 66 49 47 39 35 95 19 96 30 14 43 +Card 110: 50 31 7 42 72 16 28 77 81 43 | 2 6 90 72 16 71 48 77 63 38 31 4 93 76 49 78 45 46 5 80 27 25 26 74 33 +Card 111: 89 53 2 28 35 5 68 42 62 23 | 35 8 78 24 85 56 55 27 14 33 48 80 18 11 71 1 53 77 91 44 58 25 74 92 43 +Card 112: 33 40 80 76 16 97 71 67 26 49 | 27 34 11 35 51 26 59 58 44 86 66 54 82 21 8 74 99 77 37 71 16 50 40 61 28 +Card 113: 34 62 21 74 51 35 19 37 89 49 | 41 5 91 23 43 62 42 68 81 89 19 70 55 88 52 15 97 80 58 26 11 63 6 49 28 +Card 114: 11 63 45 75 92 50 57 42 29 79 | 13 89 23 20 58 50 26 40 3 27 16 47 71 49 85 78 59 21 37 68 34 7 98 45 19 +Card 115: 6 64 20 23 50 14 24 33 9 15 | 61 42 74 40 95 30 18 60 46 43 3 25 14 16 92 56 53 90 19 24 78 58 63 80 49 +Card 116: 69 25 32 2 1 6 24 17 89 4 | 13 57 77 49 27 87 91 68 52 96 20 21 5 62 90 39 47 55 56 63 30 38 14 79 45 +Card 117: 8 5 28 47 41 25 87 73 17 56 | 43 63 88 32 35 20 13 66 64 86 30 10 92 71 45 57 70 69 62 18 9 93 1 81 95 +Card 118: 38 54 10 60 63 36 90 47 83 18 | 63 47 45 65 78 60 55 98 91 36 22 81 83 18 90 15 40 10 87 38 54 33 8 32 4 +Card 119: 82 95 23 76 45 72 16 62 71 83 | 46 66 81 9 16 93 87 4 40 97 5 72 78 54 67 56 61 12 21 74 64 52 23 14 26 +Card 120: 64 42 36 63 41 71 84 69 85 29 | 80 31 87 20 18 71 43 64 94 7 54 36 45 86 41 60 28 84 88 26 63 85 69 58 77 +Card 121: 66 77 99 55 75 31 44 30 47 73 | 20 59 45 34 63 89 88 52 39 13 91 61 78 76 73 99 38 23 40 50 4 1 65 67 58 +Card 122: 9 20 68 24 25 67 3 63 34 12 | 81 48 31 89 72 99 11 26 13 73 58 94 42 57 59 5 74 12 18 20 60 88 83 76 2 +Card 123: 51 24 73 56 61 57 79 46 37 69 | 55 38 63 17 85 75 59 61 88 50 53 72 1 5 66 52 14 80 74 6 57 22 97 70 77 +Card 124: 59 97 26 20 53 15 27 65 2 23 | 75 2 74 22 72 91 85 33 98 11 26 99 9 62 61 16 87 69 8 32 10 37 59 20 48 +Card 125: 30 58 23 6 81 8 3 37 53 15 | 75 66 81 42 32 84 57 40 63 19 70 76 74 54 61 82 44 8 16 80 55 87 10 92 22 +Card 126: 30 71 38 18 91 61 68 99 13 16 | 91 5 99 88 86 61 16 90 13 9 58 30 69 50 71 1 28 54 20 40 68 46 18 4 73 +Card 127: 74 60 96 29 69 68 16 80 45 20 | 53 31 71 26 42 64 99 5 81 92 43 96 16 69 22 19 88 60 54 20 29 76 6 56 11 +Card 128: 47 88 77 56 66 5 38 14 70 1 | 19 5 1 76 2 77 35 51 68 22 75 44 45 13 37 96 86 60 85 87 25 26 64 11 65 +Card 129: 76 13 49 32 89 52 40 43 54 86 | 57 12 64 59 21 1 40 45 20 24 60 68 77 14 55 80 88 11 83 94 84 4 58 71 18 +Card 130: 77 98 41 54 64 1 14 20 51 26 | 5 53 6 80 46 14 29 9 77 55 94 40 84 60 33 97 66 64 81 1 75 73 28 16 36 +Card 131: 16 88 64 81 42 51 13 10 45 48 | 18 77 28 84 75 94 13 35 27 83 29 2 11 44 48 20 19 46 17 25 70 38 30 42 54 +Card 132: 17 95 50 10 52 65 94 91 49 44 | 30 19 5 13 49 97 44 60 54 38 64 92 37 87 33 67 35 43 40 16 91 15 7 96 36 +Card 133: 3 51 66 53 19 60 34 26 32 75 | 87 29 64 65 10 50 98 42 69 35 89 26 41 23 14 94 38 49 13 37 53 31 95 90 27 +Card 134: 81 88 58 61 11 31 54 29 42 50 | 44 35 72 34 21 57 86 79 2 11 67 85 37 49 83 70 64 63 95 12 62 52 71 15 3 +Card 135: 8 45 79 72 50 38 17 92 89 91 | 77 23 59 53 36 80 25 95 69 83 33 40 62 49 86 19 18 75 84 48 44 47 96 39 73 +Card 136: 4 41 75 98 60 79 65 9 74 20 | 90 98 16 2 41 9 1 79 28 27 37 47 20 80 74 36 48 60 42 26 75 65 58 4 6 +Card 137: 96 77 70 23 91 54 43 61 25 4 | 36 96 45 18 42 10 24 65 52 99 93 38 76 27 77 95 23 61 35 34 85 43 59 70 54 +Card 138: 74 87 59 72 88 15 14 97 68 13 | 11 84 15 27 33 38 8 72 12 40 88 37 14 75 97 82 39 57 87 2 83 68 74 59 13 +Card 139: 12 20 1 36 10 91 16 42 94 8 | 74 10 86 57 3 27 25 15 33 78 24 84 19 35 58 38 17 77 59 85 4 92 2 55 60 +Card 140: 62 18 78 34 56 35 70 69 12 50 | 60 8 52 72 95 97 56 69 39 59 38 78 35 43 25 7 16 89 87 57 49 36 88 62 76 +Card 141: 7 36 86 91 88 37 23 67 92 41 | 86 36 60 4 83 14 88 45 44 23 90 16 7 10 30 92 64 52 91 58 9 72 67 37 94 +Card 142: 15 68 29 85 72 87 78 4 45 33 | 70 5 78 53 22 13 88 52 72 37 55 7 24 41 90 58 84 23 73 83 3 66 96 61 92 +Card 143: 8 47 60 23 42 79 66 44 68 62 | 44 66 79 51 8 39 22 85 38 81 42 21 60 67 11 25 7 47 23 9 68 12 70 62 83 +Card 144: 46 62 12 26 90 16 95 99 8 93 | 23 5 94 99 30 85 75 16 34 81 11 53 27 8 90 82 26 62 87 55 14 73 97 67 93 +Card 145: 48 96 83 27 12 82 3 29 86 49 | 21 27 96 82 84 49 3 70 76 91 32 29 12 22 58 86 44 87 61 2 83 72 48 40 68 +Card 146: 62 1 12 83 72 10 50 17 98 5 | 19 26 83 98 49 87 24 32 40 35 50 85 18 17 38 7 61 8 5 20 77 34 1 33 62 +Card 147: 5 62 85 11 61 49 2 88 75 59 | 59 23 11 44 73 35 82 63 2 33 68 49 75 56 88 62 67 61 5 98 89 19 24 90 76 +Card 148: 89 21 6 97 13 61 82 71 37 84 | 71 5 7 34 19 66 4 61 55 10 25 82 97 9 72 30 89 13 21 77 6 31 58 84 48 +Card 149: 46 96 58 2 92 66 52 39 22 23 | 70 31 7 45 46 58 27 2 42 25 59 66 52 99 96 63 39 14 62 51 95 84 69 8 89 +Card 150: 85 61 42 49 66 9 40 74 8 77 | 41 89 97 87 48 49 69 82 21 54 91 52 71 46 28 99 47 78 98 39 81 95 9 33 85 +Card 151: 70 35 27 20 42 47 72 89 8 64 | 73 42 3 10 59 72 89 70 50 35 2 8 32 5 36 47 29 98 75 51 30 58 43 86 56 +Card 152: 65 21 42 45 83 97 90 96 12 28 | 21 30 83 14 24 49 10 65 88 79 64 8 33 15 57 1 97 32 91 78 39 62 4 99 23 +Card 153: 22 82 23 85 32 25 83 63 68 59 | 52 48 27 94 43 18 21 90 10 62 22 35 55 50 77 93 12 42 91 73 64 36 84 9 8 +Card 154: 86 15 55 71 88 99 77 18 66 30 | 31 18 38 57 76 53 82 1 49 84 77 14 26 11 40 86 41 87 47 9 62 88 20 59 21 +Card 155: 34 52 7 30 51 83 42 86 49 16 | 51 57 77 36 21 13 17 88 56 98 96 66 62 63 6 37 52 70 50 32 43 45 47 64 53 +Card 156: 1 48 76 45 33 51 16 20 25 47 | 49 41 1 64 13 57 79 53 35 6 52 71 97 83 95 87 88 58 37 16 24 63 31 94 46 +Card 157: 20 3 5 93 75 15 89 14 96 43 | 42 30 91 82 34 44 31 41 4 59 62 54 38 33 25 51 84 28 96 85 8 60 83 10 36 +Card 158: 68 19 67 1 7 92 4 81 98 53 | 71 64 18 83 66 57 25 49 30 62 95 77 93 40 75 47 15 84 78 9 48 52 24 38 34 +Card 159: 3 32 42 47 90 1 27 66 50 97 | 4 41 22 18 36 57 76 50 80 24 27 45 25 88 58 29 83 87 86 89 59 66 3 11 13 +Card 160: 76 74 90 64 70 1 97 28 68 84 | 18 19 67 84 12 51 97 60 68 92 28 90 1 94 93 64 30 2 74 76 61 49 85 70 96 +Card 161: 75 12 21 36 44 85 1 43 29 45 | 99 87 38 73 60 33 80 25 1 54 85 45 4 57 41 29 43 90 49 44 27 12 31 16 23 +Card 162: 23 69 91 77 84 98 55 89 92 74 | 26 44 25 49 10 15 82 37 39 64 61 83 53 1 38 69 22 96 5 91 36 65 75 41 98 +Card 163: 78 64 29 96 73 12 35 19 65 38 | 76 96 35 9 34 41 46 39 3 10 27 24 13 84 91 92 22 58 62 16 8 12 60 18 56 +Card 164: 82 84 96 81 23 19 58 2 24 62 | 36 93 49 5 71 87 34 39 2 98 97 28 77 70 17 53 51 23 57 81 3 48 29 27 62 +Card 165: 53 95 19 88 39 99 29 62 91 77 | 18 51 63 11 99 71 84 86 57 96 60 62 77 32 35 27 98 23 97 1 65 17 15 87 38 +Card 166: 17 46 33 41 80 57 47 91 1 64 | 33 98 57 1 88 23 64 41 43 61 84 11 7 52 80 60 4 97 75 46 55 21 47 91 79 +Card 167: 47 3 71 68 6 94 54 61 66 72 | 69 9 10 67 68 87 49 61 56 6 85 59 75 23 44 90 94 13 66 52 53 72 64 45 31 +Card 168: 90 57 89 45 63 53 61 46 96 55 | 57 94 39 18 45 53 27 24 81 79 50 30 21 31 83 99 67 98 92 90 22 47 46 80 7 +Card 169: 7 47 36 15 24 51 52 9 48 61 | 15 88 48 99 3 12 22 7 47 87 89 57 9 24 82 51 97 61 52 1 36 54 94 63 62 +Card 170: 26 42 91 72 64 18 69 81 44 22 | 46 60 73 35 4 52 33 51 13 82 62 5 27 90 95 2 7 56 44 76 75 50 87 70 74 +Card 171: 17 80 28 54 57 90 86 59 67 1 | 1 59 19 90 37 57 76 87 42 73 20 41 68 33 67 53 28 50 86 54 80 99 6 17 91 +Card 172: 95 28 26 47 83 76 31 52 70 89 | 69 18 8 50 20 27 16 60 11 88 75 13 34 57 90 1 5 91 38 32 6 68 65 35 33 +Card 173: 15 74 3 88 42 10 62 59 39 27 | 34 61 14 52 74 88 22 39 67 23 10 73 27 46 55 24 30 89 35 82 66 83 86 15 43 +Card 174: 6 8 3 61 1 87 94 18 20 93 | 59 56 13 57 85 8 67 6 14 60 10 69 29 3 99 26 44 78 82 22 49 24 36 90 87 +Card 175: 47 64 30 84 70 92 51 53 12 73 | 11 79 23 33 4 2 36 47 7 53 10 13 20 92 51 72 32 61 94 78 5 64 69 19 54 +Card 176: 55 57 29 40 25 44 96 7 70 14 | 51 88 85 62 5 66 23 30 81 33 50 75 25 61 59 43 87 71 32 76 27 48 8 11 86 +Card 177: 57 9 53 8 63 88 32 52 79 28 | 35 42 99 1 72 64 51 11 58 16 50 70 21 87 65 77 66 94 63 96 47 32 62 81 92 +Card 178: 48 22 72 59 60 61 8 39 24 67 | 34 88 67 4 48 59 84 98 83 26 50 10 57 45 14 7 9 21 63 17 94 91 37 39 36 +Card 179: 11 60 35 51 80 12 53 22 71 72 | 10 18 70 11 16 19 72 23 83 63 61 58 56 50 28 89 7 75 59 48 81 54 33 2 40 +Card 180: 50 48 20 85 86 18 67 91 27 22 | 7 14 31 51 36 42 66 56 46 16 15 10 5 67 90 2 19 63 26 35 91 82 43 68 49 +Card 181: 75 78 86 53 61 26 68 77 85 25 | 95 40 18 73 6 43 74 87 51 64 37 83 62 24 19 33 2 7 13 52 48 63 57 70 75 +Card 182: 6 60 67 18 39 29 33 54 37 83 | 15 72 38 35 8 96 36 44 81 19 21 1 40 87 46 52 9 4 28 31 85 13 68 32 41 +Card 183: 52 18 27 20 7 46 38 58 91 37 | 20 46 27 9 37 90 63 99 59 78 66 65 88 91 18 21 1 49 85 71 26 4 8 58 50 +Card 184: 38 58 36 50 76 43 32 98 69 23 | 36 24 69 33 48 92 28 44 43 91 58 50 86 4 98 78 76 81 23 32 71 27 66 40 38 +Card 185: 53 21 69 24 51 39 88 3 78 5 | 89 78 73 61 59 21 8 79 64 51 39 66 53 69 67 68 36 29 88 38 44 47 46 19 13 +Card 186: 48 54 68 40 60 27 45 51 61 17 | 52 78 51 35 45 74 62 89 27 76 48 17 56 53 40 14 61 11 68 37 31 54 39 60 4 +Card 187: 64 49 14 90 67 54 40 21 60 71 | 8 30 55 89 17 90 97 60 16 49 74 14 67 24 82 64 51 25 61 98 12 19 35 40 43 +Card 188: 53 51 65 17 4 88 5 69 28 34 | 11 24 78 69 77 26 88 4 60 71 28 20 59 10 51 2 17 49 52 65 34 8 53 64 5 +Card 189: 53 78 45 15 50 2 6 16 3 38 | 53 10 27 45 67 38 76 56 50 4 41 77 91 16 3 6 60 13 2 43 15 9 98 20 78 +Card 190: 72 54 84 76 69 10 13 19 97 26 | 84 45 29 49 71 72 2 47 16 32 46 14 5 34 35 99 6 93 56 89 22 79 73 24 64 +Card 191: 18 70 33 56 72 68 98 52 24 46 | 55 52 25 18 24 12 49 15 46 23 71 72 89 26 33 2 76 7 44 56 68 97 83 70 98 +Card 192: 33 34 57 40 93 14 12 45 79 25 | 97 20 48 39 90 64 27 40 26 58 42 60 45 2 81 80 23 34 79 57 24 18 71 53 5 +Card 193: 87 90 72 76 10 83 41 6 54 23 | 23 18 1 76 93 88 96 72 7 31 20 90 68 30 39 40 44 11 35 3 78 54 17 46 60 +Card 194: 5 10 25 27 6 45 67 86 92 32 | 68 32 21 5 33 74 42 27 84 48 46 14 38 39 64 47 95 86 45 56 31 25 67 15 17 +Card 195: 31 33 64 80 68 21 20 29 63 11 | 80 81 1 56 61 21 12 33 64 30 76 82 97 43 27 52 31 20 70 45 17 4 60 77 68 +Card 196: 73 91 78 83 14 54 94 92 9 8 | 3 56 55 76 96 22 17 43 15 40 52 51 13 50 79 65 41 25 60 11 93 53 99 4 87 +Card 197: 63 64 25 48 91 95 77 7 38 69 | 40 29 14 72 27 5 10 97 56 30 51 13 15 34 75 87 86 60 45 88 33 61 90 32 85 +Card 198: 70 60 61 56 16 81 18 12 88 65 | 5 67 62 45 43 21 32 94 19 27 77 58 50 41 9 85 29 40 92 87 54 24 76 48 33 +Card 199: 29 26 70 45 22 86 27 64 95 80 | 46 5 38 61 44 97 9 15 78 93 73 34 7 23 67 41 58 33 1 85 48 98 4 14 53 +Card 200: 3 88 81 61 64 39 54 51 49 17 | 16 87 35 37 82 68 55 19 80 33 10 2 48 25 79 89 52 4 44 59 26 72 90 83 9 +Card 201: 28 44 46 58 13 92 35 16 30 14 | 32 79 85 98 67 55 21 41 93 43 19 72 35 24 90 64 88 82 84 20 45 91 81 38 49 +Card 202: 85 43 47 11 9 21 27 53 17 95 | 10 6 26 91 30 69 52 20 28 16 82 45 72 54 58 96 88 99 38 55 78 98 15 70 4 diff --git a/04/input2.txt b/04/input2.txt new file mode 100644 index 0000000..fba519a --- /dev/null +++ b/04/input2.txt @@ -0,0 +1,6 @@ +Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 +Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 +Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 +Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 +Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 +Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11 diff --git a/boilerplate.c b/boilerplate.c new file mode 100644 index 0000000..1e7cafe --- /dev/null +++ b/boilerplate.c @@ -0,0 +1,27 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + // Get filename as an argument, defaults to "input.txt" + char *path = (argc > 1) ? argv[1] : "input.txt"; + + if (!path) + { + printf("Requires input file.\n"); + return 1; + } + + FILE *file = fopen(path, "r"); + + if (!file) + { + printf("Could not find file."); + return 1; + } + + // Code goes here + + return 0; +} \ No newline at end of file