aboutsummaryrefslogtreecommitdiff
path: root/13/1.rkt
blob: 21c29c3454d5b37172e770d213fc7ad349076ead (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
32
33
34
35
36
37
38
39
40
#lang racket

(require "../lib/utils.rkt")

(define lines
  (call-with-input-file "input"
    (λ (fp) (get-lines fp))))

(define patterns (split-list-by "" lines))

(define (find-reflection lines)
  (define lines-vec (list->vector lines))
  (define len (vector-length lines-vec))
  (define (find-first)
    (let loop ((i 0) (ret '()))
      (if (>= i (- len 1))
          (reverse ret)
          (if (string=? (vector-ref lines-vec i)
                        (vector-ref lines-vec (+ i 1)))
              (loop (+ 1 i) (cons i ret))
              (loop (+ 1 i) ret)))))
  (define (count start)
    (let loop ((cnt 1) (i start))
      (if (or (< i 0)
              (>= (+ start cnt) len))
          (+ start 1)
          (if (string=? (vector-ref lines-vec i)
                        (vector-ref lines-vec (+ start cnt)))
              (loop (+ 1 cnt) (- i 1))
              0))))
  (define start (find-first))
  (if (null? start)
      0
      (apply max (map count start))))

(define (score pattern)
  (+ (* 100 (find-reflection pattern))
     (find-reflection (transpose-list pattern))))

(apply + (map score patterns))