From 6012d4d3754bb9a45ae6f8baf1a26ee2ae2cf826 Mon Sep 17 00:00:00 2001
From: Bruno
Date: Fri, 2 Dec 2022 10:32:02 +0100
Subject: [PATCH] 2022/day 1 (C) - save from laptop
---
2022/day01/Makefile | 4 +-
2022/day01/aoc-c.c | 99 ++++++++++++++++++++++++++++++++++++++++++++
2022/include/plist.h | 17 ++++++++
3 files changed, 118 insertions(+), 2 deletions(-)
create mode 100644 2022/day01/aoc-c.c
diff --git a/2022/day01/Makefile b/2022/day01/Makefile
index 5c2011e..9387298 100644
--- a/2022/day01/Makefile
+++ b/2022/day01/Makefile
@@ -71,11 +71,11 @@ assembly: aoc-c.s
part1: aoc-c
@$(TIME) aoc.bash -p 1 < $(INPUT) 2>&1
- @#$(TIME) aoc-c -p 1 < $(INPUT)
+ @$(TIME) aoc-c -p 1 < $(INPUT)
part2: aoc-c
@$(TIME) aoc.bash -p 2 < $(INPUT) 2>&1
- @#$(TIME) aoc-c -p 2 < $(INPUT)
+ @$(TIME) aoc-c -p 2 < $(INPUT)
ccls: $(CCLSFILE)
diff --git a/2022/day01/aoc-c.c b/2022/day01/aoc-c.c
new file mode 100644
index 0000000..0cd18ae
--- /dev/null
+++ b/2022/day01/aoc-c.c
@@ -0,0 +1,99 @@
+/* aoc-c.c: Advent of Code 2022, day 1
+ *
+ * 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 "plist.h"
+#include "debug.h"
+#include "pool.h"
+
+PLIST_HEAD(plist);
+
+static int calc_top_plist(int n)
+{
+ int res = 0;
+
+ struct plist_node *node;
+ plist_for_each_reverse(node, &plist) {
+ res += node->prio;
+ if (!--n)
+ break;
+ }
+ return res;
+}
+
+static void parse(pool_t *pool)
+{
+ size_t alloc = 0;
+ char *buf = NULL;
+ ssize_t buflen;
+ int total = 0;
+ struct plist_node *node;
+
+ while (1) {
+ buflen = getline(&buf, &alloc, stdin);
+ switch (buflen) {
+ case 1:
+ case -1:
+ node = pool_get(pool);
+ plist_node_init(node, total);
+ plist_add(node, &plist);
+ total = 0;
+ if (buflen == -1)
+ goto end;
+ break;
+ default:
+ total += atoi(buf);
+ }
+ }
+end:
+ free(buf);
+ return;
+}
+
+static int usage(char *prg)
+{
+ fprintf(stderr, "Usage: %s [-d debug_level] [-p part] [-i input]\n", prg);
+ return 1;
+}
+
+int main(int ac, char **av)
+{
+ int opt, part = 1;
+
+ while ((opt = getopt(ac, av, "d:p:")) != -1) {
+ switch (opt) {
+ case 'd':
+ debug_level_set(atoi(optarg));
+ break;
+ case 'p': /* 1 or 2 */
+ part = atoi(optarg);
+ if (part < 1 || part > 2)
+ return usage(*av);
+ break;
+ default:
+ return usage(*av);
+ }
+ }
+ if (optind < ac)
+ return usage(*av);
+
+ pool_t *pool_tot = pool_create("total", 128, sizeof(struct plist_node));
+
+ parse(pool_tot);
+
+ printf("%s : res=%d\n", *av, calc_top_plist(part == 1? 1: 3));
+ pool_destroy(pool_tot);
+ exit(0);
+}
diff --git a/2022/include/plist.h b/2022/include/plist.h
index df0e88a..85da7e9 100644
--- a/2022/include/plist.h
+++ b/2022/include/plist.h
@@ -152,6 +152,14 @@ extern void plist_requeue(struct plist_node *node, struct plist_head *head);
#define plist_for_each(pos, head) \
list_for_each_entry(pos, &(head)->node_list, node_list)
+/**
+ * plist_for_each_reverse - iterate backwards over the plist
+ * @pos: the type * to use as a loop counter
+ * @head: the head for your list
+ */
+#define plist_for_each_reverse(pos, head) \
+ list_for_each_entry_reverse(pos, &(head)->node_list, node_list)
+
/**
* plist_for_each_continue - continue iteration over the plist
* @pos: the type * to use as a loop cursor
@@ -182,6 +190,15 @@ extern void plist_requeue(struct plist_node *node, struct plist_head *head);
#define plist_for_each_entry(pos, head, mem) \
list_for_each_entry(pos, &(head)->node_list, mem.node_list)
+/**
+ * plist_for_each_entry_reverse - iterate backwards over list of given type
+ * @pos: the type * to use as a loop counter
+ * @head: the head for your list
+ * @mem: the name of the list_head within the struct
+ */
+#define plist_for_each_entry_reverse(pos, head, mem) \
+ list_for_each_entry(pos, &(head)->node_list, mem.node_list)
+
/**
* plist_for_each_entry_continue - continue iteration over list of given type
* @pos: the type * to use as a loop cursor