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