From 6d1573267331532c3f458bfcad82bf44d4f2f41d Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 3 Dec 2019 23:48:31 -0800 Subject: [PATCH] d04 --- 2019/04.rkt | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2019/04.rktd | 1 + 2 files changed, 49 insertions(+) create mode 100644 2019/04.rkt create mode 100644 2019/04.rktd diff --git a/2019/04.rkt b/2019/04.rkt new file mode 100644 index 0000000..24c90b6 --- /dev/null +++ b/2019/04.rkt @@ -0,0 +1,48 @@ +#lang br +(require racket/file rackunit) + +(match-define (list low high) + (map string->number (string-split (file->string "04.rktd") "-"))) + +(define (double-digit? num) + (define numstr (number->string num)) + (match (for/list ([c0 (in-string numstr)] + [c1 (in-string numstr 1)] + #:when (char=? c0 c1)) + (string->number (string c0))) + [(? null?) #false] + [nums nums])) + +(define (num->digits num) + (for/list ([c (in-string (number->string num))]) + (string->number (string c)))) + +(define (monotonic? num) + (apply <= (num->digits num))) + +;; 1 +(check-eq? + (for/sum ([num (in-range low (add1 high))] + #:when (and (double-digit? num) (monotonic? num))) + 1) + 1079) + +(define (triple-digit? num digit) + (define numstr (number->string num)) + (define digitc (car (string->list (number->string digit)))) + (for/or ([c0 (in-string numstr)] + [c1 (in-string numstr 1)] + [c2 (in-string numstr 2)]) + (char=? c0 c1 c2 digitc))) + +;;2 +(check-eq? + (for/sum ([num (in-range low (add1 high))] + #:when (and (for/or ([digits (in-value (double-digit? num))] + #:when digits + [digit (in-list digits)]) + (not (triple-digit? num digit))) + (monotonic? num))) + 1) + 699) + diff --git a/2019/04.rktd b/2019/04.rktd new file mode 100644 index 0000000..9be67a1 --- /dev/null +++ b/2019/04.rktd @@ -0,0 +1 @@ +245318-765747 \ No newline at end of file