aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--2024/aoc-utils.scm8
-rwxr-xr-x2024/day02/main.scm54
2 files changed, 61 insertions, 1 deletions
diff --git a/2024/aoc-utils.scm b/2024/aoc-utils.scm
index 6b57aa5..7fafcc6 100644
--- a/2024/aoc-utils.scm
+++ b/2024/aoc-utils.scm
@@ -3,9 +3,15 @@
#:use-module (srfi srfi-9)
#:use-module (ice-9 regex)
#:use-module (ice-9 rdelim)
- #:export (file->list))
+ #:export (file->list
+ lines->number-list))
(define (file->list filename)
(let ((lines (string-split (call-with-input-file filename read-string) #\Newline)))
; Remove EOF token
(take lines (1- (length lines)))))
+
+(define (lines->number-list lines)
+ (map (lambda (line)
+ (map string->number (string-split line #\Space)))
+ lines))
diff --git a/2024/day02/main.scm b/2024/day02/main.scm
new file mode 100755
index 0000000..310f72e
--- /dev/null
+++ b/2024/day02/main.scm
@@ -0,0 +1,54 @@
+#!/usr/bin/guile -s
+!#
+
+(add-to-load-path (format #f "~a/2024" (getcwd)))
+(add-to-load-path (format #f "~a/.." (dirname (current-filename))))
+
+(use-modules
+ (aoc-utils)
+ (srfi srfi-1)
+ (srfi srfi-9)
+ (ice-9 regex))
+
+(define (all-decresing? report)
+ (equal? report (sort report >)))
+
+(define (all-incrising? report)
+ (equal? report (sort report <)))
+
+(define (safe-head? report)
+ (if (>=(length report) 2)
+ (let ((diff (abs (- (first report) (second report)))))
+ (and (<= diff 3) (>= diff 1)))
+ #t))
+
+(define (safe-difference? report)
+ (cond ((not (safe-head? report)) #f)
+ ((null? report) #t)
+ (else (safe-difference? (cdr report)))))
+
+(define (safe-report? report)
+ (and (or (all-incrising? report)
+ (all-decresing? report))
+ (safe-difference? report)))
+
+(define (part1 lines)
+ (let ((reports (lines->number-list lines)))
+ (fold + 0 (map (lambda (report) (if (safe-report? report)
+ 1
+ 0)) reports))))
+
+(define (part2 lines)
+ (let ((reports (lines->number-list lines)))
+ 0))
+
+(define (main)
+ (let ((lines (file->list "input.txt")))
+ (display "Part1: ")
+ (display (part1 lines))
+ (newline)
+ (display "Part2: ")
+ (display (part2 lines))
+ (newline)))
+
+(main)