You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

53 lines
1.9 KiB

(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)))