Scheme/Guile
Guile doesn't seem to come with a bag implementation :(. Not a big deal, a linear scan works about as well.
(use-modules (ice-9 rdelim))
(use-modules (srfi srfi-1))
(define (parse-file file-name)
(let* ((p (open-input-file file-name))
(comma-split (string-split (read-line p) #\,))
(number-list (map string->number comma-split)))
number-list))
(let* ((crates (parse-file "notes/everybody_codes_e2025_q03_p1.txt"))
(dedup-crates (delete-duplicates crates)))
(format #t "P1 Answer: ~a\n\n" (apply + dedup-crates)))
(let* ((crates (parse-file "notes/everybody_codes_e2025_q03_p2.txt"))
(dedup-crates (delete-duplicates crates))
(sorted-crates (sort dedup-crates <)))
(format #t "P2 Answer: ~a\n\n" (apply + (take sorted-crates 20))))
(let* ((crates (parse-file "notes/everybody_codes_e2025_q03_p3.txt"))
(sorted-crates (sort crates <))
(largest-set-size (let loop ((count 0) (l sorted-crates) (c #f) (max-count 0))
(if (nil? l)
max-count
(let* ((new-c (car l))
(new-count (if (equal? new-c c) (+ count 1) 1)))
(loop new-count (cdr l) new-c (max new-count max-count)))))))
(format #t "P3 Answer: ~a\n\n" largest-set-size))