(with-temp-buffer (insert-file-contents "input") (goto-char (point-min)) (replace-regexp "^" "\"") (goto-char (point-min)) (replace-regexp "$" "\"") (goto-char (point-min)) (insert "(setq data '(") (goto-char (point-max)) (insert "))") (eval-buffer)) (setq height (length data) width (length (car data))) (setq antennas (-mapcat #'identity (-map-indexed (lambda (y ll) (-map-indexed (lambda (x el) (list el (list x y))) ll) ) (-map (lambda (str) (-map #'string-to-char (split-string str "\\|.+" t))) data)))) (setq positions (-map (lambda (antenna) (-map #'cadr (-filter (lambda (a) (eq (car a) antenna)) antennas))) (-remove-item 46 (-distinct (-map #'car antennas))))) (defun diff (l ll) (op-lists #'- l ll)) (defun op-lists (op l ll) (-map (lambda (pair) (funcall op (car pair) (cadr pair))) (-zip-lists l ll))) (defun diff-positions (l) (-filter #'valid-position (-mapcat (lambda (pair) (-map (lambda (pp) (diff pair (diff pp pair))) (-remove-item pair l))) l))) (defun valid-position (pair) (and (> (car pair) -1) (< (car pair) width) (> (cadr pair) -1) (< (cadr pair) height))) (defun gcd (n m) (cond ((< (abs n) (abs m)) (gcd m n)) ((= m 0) n) (t (gcd m (% n m))))) (length (-distinct (-mapcat #'diff-positions positions))) (defun generate-line (origin delta) (let* ((ggg (gcd (abs (car delta)) (abs (cadr delta)))) (del (--map (/ it ggg) delta))) (-unfold (lambda (x) (when (valid-position x) (cons x (op-lists '+ x del)))) origin))) (defun line-positions (l) (-filter #'valid-position (-mapcat (lambda (pair) (-mapcat (lambda (pp) (generate-line pair (diff pp pair))) (-remove-item pair l))) l))) (length (-distinct (-mapcat #'line-positions positions)))