aboutsummaryrefslogtreecommitdiff
path: root/04/1.scm
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-12-04 15:51:40 +0800
committerMistivia <i@mistivia.com>2024-12-04 15:51:40 +0800
commit45d88908e3fca797db359129fbf9a752dee7b8fa (patch)
treefabd5076cdf3ff002b82be6e6f634143adc486bd /04/1.scm
parent1c64562386506550cae91b01707d66b9bf1c09f0 (diff)
day 4
Diffstat (limited to '04/1.scm')
-rw-r--r--04/1.scm75
1 files changed, 75 insertions, 0 deletions
diff --git a/04/1.scm b/04/1.scm
new file mode 100644
index 0000000..dd5c26d
--- /dev/null
+++ b/04/1.scm
@@ -0,0 +1,75 @@
+(import (chicken string))
+(import (chicken io))
+(import (chicken sort))
+(import matchable)
+(import srfi-1)
+(import regex)
+
+(define input
+ (with-input-from-file "input"
+ (lambda ()
+ (let loop ((ret '()))
+ (let ((line (read-line)))
+ (if (eof-object? line)
+ (reverse ret)
+ (loop (cons line ret))))))))
+
+(define (transpose in)
+ (define cols (string-length (car in)))
+ (let loop ((i 0) (ret '()))
+ (if (>= i cols)
+ (reverse ret)
+ (loop (+ i 1) (cons (list->string (map (lambda (x) (string-ref x i))
+ in))
+ ret)))))
+
+(define (flip in)
+ (define (flip-row row)
+ (list->string (reverse (string->list row))))
+ (map flip-row in))
+
+(define (char-at in x y)
+ (string-ref (list-ref in y) x))
+
+(define (diag in)
+ (define width (string-length (car in)))
+ (define height (length in))
+ (define (diag-start-at x y)
+ (let loop ((cur-row y) (cur-col x) (ret '()))
+ (if (or (< cur-col 0)
+ (>= cur-row height))
+ (list->string (reverse ret))
+ (loop (+ cur-row 1)
+ (- cur-col 1)
+ (cons (char-at in cur-col cur-row) ret)))))
+ (define (row-diag in)
+ (let loop ((i 0) (ret '()))
+ (if (>= i width)
+ (reverse ret)
+ (loop (+ 1 i) (cons (diag-start-at i 0) ret)))))
+ (define (col-diag in)
+ (let loop ((i 1) (ret '()))
+ (if (>= i height)
+ (reverse ret)
+ (loop (+ i 1) (cons (diag-start-at (- width 1) i) ret)))))
+ (append (row-diag in) (col-diag in)))
+
+(define (count-xmas str)
+ (define len (string-length str))
+ (let loop ((cur 0) (count 0))
+ (define pos (string-search-positions "XMAS" str cur))
+ (if pos
+ (loop (cadar pos) (+ 1 count))
+ count)))
+
+(define (count-mat mat)
+ (apply + (map count-xmas mat)))
+
+(define mat-list
+ (list input (flip input)
+ (transpose input) (flip (transpose input))
+ (diag input) (flip (diag input))
+ (diag (flip input)) (flip (diag (flip input)))))
+
+(display (apply + (map count-mat mat-list)))
+(newline)