src/2017/day-04.lisp @ 7e8b6d68c899

Update some old problems
author Steve Losh <steve@stevelosh.com>
date Fri, 29 Nov 2019 15:15:05 -0500
parents (none)
children 5b5c61ad8d2b
(defpackage :advent/2017/04 #.cl-user::*advent-use*)
(in-package :advent/2017/04)

(defun valid-hash-table-test-p (test)
  (member test `(eq eql equal equalp ,#'eq ,#'eql ,#'equal ,#'equalp)))

(defun ensure-boolean (value)
  (if value t nil))

(defun contains-duplicates-p (sequence &key (test #'eql))
  (ensure-boolean (if (valid-hash-table-test-p test)
        (iterate
          (with seen = (make-hash-set :test test))
          (for value :in-whatever sequence)
          (thereis (hset-contains-p seen value))
          (hset-insert! seen value))
        (etypecase sequence
          (list (iterate
                  (for (value . remaining) :on sequence)
                  (thereis (position value remaining :test test))))
          (sequence
            (iterate
              (for i :from 0 :below (length sequence))
              (for value = (elt sequence i))
              (thereis (position value sequence :start (1+ i) :test test))))))))


(defun anagramp (string1 string2)
  (string= (sort (copy-seq string1) #'char<)
           (sort (copy-seq string2) #'char<)))

(define-problem (2017 4) (data read-lines-of-words)
  (values (count-if (lambda (phrase)
                      (not (contains-duplicates-p phrase :test #'equal)))
                    data)
          (count-if (lambda (phrase)
                      (not (contains-duplicates-p phrase :test #'anagramp)))
                    data)))


(1am:test test-2017/04
  (multiple-value-bind (part1 part2) (run)
    (1am:is (= 337 part1))
    (1am:is (= 231 part2))))