summaryrefslogtreecommitdiff
path: root/not-quite-lisp/nql.scm
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2024-06-09 22:02:45 -0600
committerbd <bdunahu@operationnull.com>2024-06-09 22:02:45 -0600
commite61508e4764d69a4ea0073f419b89ff0a06e813e (patch)
treeb2f49eeced70c552c73e4030c87406f47a0a8f5e /not-quite-lisp/nql.scm
parentaec326408dd6ad16347b5661112895e60335893a (diff)
AoC 2015.1 p1+2
Diffstat (limited to 'not-quite-lisp/nql.scm')
-rw-r--r--not-quite-lisp/nql.scm33
1 files changed, 33 insertions, 0 deletions
diff --git a/not-quite-lisp/nql.scm b/not-quite-lisp/nql.scm
new file mode 100644
index 0000000..3863f02
--- /dev/null
+++ b/not-quite-lisp/nql.scm
@@ -0,0 +1,33 @@
+(define-module (nql)
+ #:use-module (srfi srfi-13)
+ #:export (nql
+ paren->number))
+
+
+(define (nql str count-all?)
+ "GIven string of parens STR,
+calculates '(' - ')' when
+COUNT-ALL is #t..
+
+If COUNT-ALL? is #f, returns the
+index of the first time a negative
+number is reached."
+ (let loop ((floor 0) (iteration 0) (lst (map paren->number
+ (string->list str))))
+ (cond
+ ((and (not count-all?)
+ (> 0 floor)) iteration)
+ ((null? lst) (and count-all? floor))
+ (#t (loop (+ (car lst) floor)
+ (1+ iteration)
+ (cdr lst))))))
+
+(define (paren->number char)
+ "Given a character representing a
+parenthesis, returns 1 for '(' and
+-1 for ')'.
+Returns zero for all other characters."
+ (cond
+ ((char=? char #\() 1)
+ ((char=? char #\)) -1)
+ (#t 0)))