90 lines
2.4 KiB
Common Lisp
90 lines
2.4 KiB
Common Lisp
(defpackage aoc
|
|
(:use :cl)
|
|
(:export
|
|
#:split-lines
|
|
#:test-input
|
|
#:submit-part1
|
|
#:submit-part2
|
|
#:clear-data-cache))
|
|
|
|
(in-package :aoc)
|
|
|
|
(defun load-ql-dependencies ()
|
|
())
|
|
|
|
|
|
(defvar *aoc-url* "https://adventofcode.com")
|
|
|
|
|
|
(defvar *cookie-jar*
|
|
(cl-cookie:make-cookie-jar
|
|
:cookies (list
|
|
(cl-cookie:make-cookie
|
|
:name "session"
|
|
:value (uiop:getenv "AOC_SESSION")
|
|
:origin-host "adventofcode.com"
|
|
:path "/"
|
|
:domain ".adventofcode.com"
|
|
:secure-p t))))
|
|
|
|
(setf *cookie-jar*
|
|
(cl-cookie:make-cookie-jar
|
|
:cookies (list
|
|
(cl-cookie:make-cookie
|
|
:name "session"
|
|
:value (uiop:getenv "AOC_SESSION")
|
|
:origin-host "adventofcode.com"
|
|
:path "/"
|
|
:domain ".adventofcode.com"
|
|
:secure-p t))))
|
|
|
|
|
|
(defun split-lines (s)
|
|
(cl-ppcre:split "\\n" s))
|
|
|
|
|
|
(defun fetch-input-data (year day)
|
|
(let ((url (format nil "~A/~D/day/~D/input" *aoc-url* year day)))
|
|
(multiple-value-bind
|
|
(body)
|
|
(dex:get url :cookie-jar *cookie-jar* :verbose t)
|
|
(split-lines body))))
|
|
|
|
|
|
(defun submit-answer (year day level answer)
|
|
(let ((url (format nil "~A/~D/day/~D/answer" *aoc-url* year day)))
|
|
(multiple-value-bind
|
|
(body)
|
|
(dex:post url :cookie-jar *cookie-jar* :verbose t
|
|
:content `(("level" . ,level)
|
|
("answer" . ,answer)
|
|
("submit" . "[Submit]")))
|
|
body)))
|
|
|
|
(defun submit-part1 (year day answer)
|
|
(submit-answer year day "1" answer))
|
|
|
|
(defun submit-part2 (year day answer)
|
|
(submit-answer year day "2" answer))
|
|
|
|
(defvar *input-data-cache* (make-hash-table))
|
|
|
|
(defun clear-data-cache ()
|
|
(setf *input-data-cache* (make-hash-table)))
|
|
|
|
(defun test-input (year day)
|
|
"Return input data for the given challenge. Use a cached value if already fetched"
|
|
(let* ((key (+ (* year 100) day))
|
|
(val (gethash key *input-data-cache*)))
|
|
(if val
|
|
val
|
|
(setf (gethash key *input-data-cache*) (fetch-input-data year day)))))
|
|
|
|
(defun print-thread-info ()
|
|
(let* ((curr-thread sb-thread:*current-thread*)
|
|
(curr-thread-name (sb-thread:thread-name curr-thread))
|
|
(all-threads (sb-thread:list-all-threads)))
|
|
(format t "Current thread: ~a~%~%" curr-thread)
|
|
(format t "Current thread name: ~a~%~%" curr-thread-name)
|
|
(format t "All threads:~% ~{~a~%~}~%" all-threads))
|
|
nil)
|