aboutsummaryrefslogtreecommitdiff
path: root/aoc2018/day-05/day-05.rkt
blob: a78f5b5487d29879e3f76dc0b98058dde83f3006 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#lang racket

(require advent-of-code
         threading)

(define starting-chain
  (~> (fetch-aoc-input (find-session) 2018 5 #:cache #true) string-trim string->list))

(define (reactive-pair? ch1 ch2)
  (and (equal? (char-downcase ch1) (char-downcase ch2)) (not (equal? ch1 ch2))))

(define (remove-reactive-pairs chs [acc '()])
  (match chs
    [(list* ch1 ch2 rest-chs)
     #:when (reactive-pair? ch1 ch2)
     (remove-reactive-pairs rest-chs acc)]
    [(list* ch rest-chs) (remove-reactive-pairs rest-chs (cons ch acc))]
    [(list) (reverse acc)]))

(define (keep-removing-reactive-pairs chs)
  (define chs* (remove-reactive-pairs chs))
  (if (equal? chs chs*) (length chs) (keep-removing-reactive-pairs chs*)))

;; part 1
(keep-removing-reactive-pairs starting-chain)

;; part 2
(~>> (for/list ([letter (in-string "abcdefghijklmnopqrstuvwxyz")])
       (define tweaked-chain (filter (λ (c) (not (equal? (char-downcase c) letter))) starting-chain))
       (keep-removing-reactive-pairs tweaked-chain))
     (apply min))