From 9f01f4fee428243cfc2da9399f71c57ce02ff815 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Fri, 9 Dec 2022 16:24:13 +0100 Subject: [PATCH] 2022 day 6: C (parts 1 and 2) --- 2022/day06/aoc-c.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 2022/day06/aoc-c.c diff --git a/2022/day06/aoc-c.c b/2022/day06/aoc-c.c new file mode 100644 index 0000000..9b1d840 --- /dev/null +++ b/2022/day06/aoc-c.c @@ -0,0 +1,60 @@ +/* aoc-c.c: Advent of Code 2022, day 5 + * + * Copyright (C) 2022 Bruno Raoult ("br") + * Licensed under the GNU General Public License v3.0 or later. + * Some rights reserved. See COPYING. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include +#include +#include + +#include "br.h" +#include "aoc.h" + +struct msg { + char *data; + size_t len; +}; + +static struct msg *parse(struct msg *msg) +{ + size_t alloc = 0; + + msg->data=NULL; + msg->len = getline(&msg->data, &alloc, stdin); + msg->data[--msg->len] = 0; + return msg; +} + +static int solve(struct msg *msg, int marklen) +{ + char *pcur = msg->data, *pnext = pcur; + int len = msg->len, lmark = 0; + + for (; pnext < msg->data + len && lmark < marklen; lmark = ++pnext - pcur) { + for (int j = 0; j < lmark; ++j) { /* compare with prev marker chars */ + if (*(pcur+j) == *pnext) { /* check new char with cur marker */ + pcur += j + 1; /* move marker to after dup char */ + goto nextchar; + } + } + nextchar: ; + } + return pnext - msg->data; +} + +int main(int ac, char **av) +{ + int part = parseargs(ac, av); + struct msg msg; + + printf("%s: res=%d\n", *av, solve(parse(&msg), part == 1? 4:14)); + free(msg.data); + exit(0); +}