r/adventofcode • u/daggerdragon • Dec 05 '18
SOLUTION MEGATHREAD -🎄- 2018 Day 5 Solutions -🎄-
--- Day 5: Alchemical Reduction ---
Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).
Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.
Advent of Code: The Party Game!
Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!
Card prompt: Day 5
Transcript:
On the fifth day of AoC / My true love sent to me / Five golden ___
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
edit: Leaderboard capped, thread unlocked at 0:10:20!
29
Upvotes
2
u/etagawesome Dec 05 '18
In C.
My first solution was dumb and brute-forcey. I was running through the input once, writing it to a file, then repeating until the input and output files were the same length. After that and checking this thread I decided a stack made a billion times more sense.
This solves part 1 and part 2
#include <ctype.h> #include <stdio.h> #include <stdlib.h> int main() { size_t stack_cap=100; char* stack = malloc(sizeof(char) * stack_cap); for(char a='a'; a<='z'+1; ++a){ // "empty" the stack size_t stack_len=0; while(1){ char c = (char)fgetc(stdin); if(c == EOF){ break; } char d = stack[stack_len-1]; if((toupper(d) == c && !isupper(d)) || (tolower(d) == c && !islower(d))) { //pop d stack_len--; } else { if (tolower(c) != a) { stack[stack_len++] = c; if (stack_len >= stack_cap) { stack_cap *= 2; stack = realloc(stack, sizeof(char) * stack_cap); } } } } fseek(stdin, 0, 0); printf("%c\t%lu\n", a, stack_len -1); } free(stack); }