diff --git a/lib/lib-advent.org b/lib/lib-advent.org index 62ce6af..b8c8e87 100644 --- a/lib/lib-advent.org +++ b/lib/lib-advent.org @@ -38,22 +38,42 @@ (-map-indexed (lambda (x el) (list el (list x y))) l)) li))))) #+end_src + * 2D geometry auxiliary functions Here a vector is just a list with two components; the "dot" function is a bit of an overkill tbh #+begin_src emacs-lisp :results none - (defun advent/dot (a b) - "Return the dot product of the two vectors" - (-reduce #'+ (-map (lambda (x) (* (car x) (cdr x))) (-zip-pair a b)))) - - (defun advent/neighbour (p dir) - "Returns the neighbour to P in the direction DIR" - (list (+ (car p) (car dir)) - (+ (cadr p) (cadr dir)))) - - (defun advent/taxicab-distance (p q) - "Returns the taxicab distance from P to Q" - (+ (abs (- (car p) (car q))) - (abs (- (cadr p) (cadr q))))) -#+end_src + (defun advent/dot (a b) + "Return the dot product of the two vectors" + (-reduce #'+ (-map (lambda (x) (* (car x) (cdr x))) (-zip-pair a b)))) + + (defun advent/neighbour (p dir) + "Returns the neighbour to P in the direction DIR" + (list (+ (car p) (car dir)) + (+ (cadr p) (cadr dir)))) + + (defun advent/taxicab-distance (p q) + "Returns the taxicab distance from P to Q" + (+ (abs (- (car p) (car q))) + (abs (- (cadr p) (cadr q))))) + #+end_src + + These are two-dimensional equivalent of -map and -map-indexed + #+begin_src emacs-lisp + (defun -2map (fun li) + (--map (-map fun it) li)) + + (defmacro --2map (form list) + `(-2map (lambda (it) ,form) ,list)) + + (defun -2map-indexed (fun li) + (-map-indexed (lambda (j row) + (-map-indexed (lambda (i it) + (funcall fun i j it)) + row)) + li)) + + (defmacro --2map-indexed (form li) + `(-2map-indexed (lambda (it-index-1 it-index-2 it) ,form) ,li)) + #+end_src