day 10 cleanup
This commit is contained in:
parent
c31d22d69d
commit
65de39af73
103
day10.lisp
103
day10.lisp
|
@ -211,3 +211,106 @@
|
|||
while line
|
||||
do (parse-command-line line my-machine))
|
||||
(accumulated-signal my-machine)))
|
||||
|
||||
;;; Cleaning up:
|
||||
;;; part 1
|
||||
|
||||
;; state of the CPU
|
||||
(defclass machine ()
|
||||
((clock :reader clock :initform 0)
|
||||
(register :reader register :initform 1)
|
||||
(accumulated-signal :reader accumulated-signal :initform 0)
|
||||
(next-special-clock :reader next-special-clock :initform 20)))
|
||||
|
||||
(defmethod print-object ((obj machine) stream)
|
||||
(print-unreadable-object (obj stream :type t)
|
||||
(with-accessors ((clock clock )
|
||||
(register register )
|
||||
(accumulated-signal accumulated-signal)
|
||||
(next-special-clock next-special-clock))
|
||||
obj
|
||||
(format stream "clock: ~a, register: ~a, accum: ~a; next-special: ~a" clock register accumulated-signal next-special-clock))))
|
||||
|
||||
;; passing of sinlge step
|
||||
(defgeneric tick (obj)
|
||||
(:method ((obj machine))
|
||||
(incf (slot-value obj 'clock))
|
||||
(when (= (next-special-clock obj) (clock obj))
|
||||
(incf (slot-value obj 'accumulated-signal) (* (clock obj) (register obj)))
|
||||
(update-special-clock obj))))
|
||||
|
||||
(defgeneric update-special-clock (obj)
|
||||
(:method ((obj machine))
|
||||
(incf (slot-value obj 'next-special-clock) 40)))
|
||||
|
||||
;; actual cpu commands in terms of ticks and register changes:
|
||||
(defgeneric noop (mach)
|
||||
(:method ((mach machine))
|
||||
(tick mach)))
|
||||
|
||||
(defgeneric addx (mach num)
|
||||
(:method ((mach machine) num)
|
||||
(tick mach)
|
||||
(tick mach)
|
||||
(incf (slot-value mach 'register) num )))
|
||||
|
||||
(require 'cl-ppcre)
|
||||
(defun parse-command-line (line machine)
|
||||
(let* ((the-split (cl-ppcre:split " " line))
|
||||
(command (intern (string-upcase (first the-split)))))
|
||||
(case command
|
||||
('addx (addx machine (parse-integer (second the-split))))
|
||||
('noop (noop machine))
|
||||
(t "hello"))))
|
||||
|
||||
;; now it's time to simiulate the file evaluation
|
||||
(let ((my-machine (make-instance 'machine)))
|
||||
(with-open-file (in "day10-test.txt")
|
||||
(loop
|
||||
for line = (read-line in nil nil)
|
||||
while line
|
||||
do (parse-command-line line my-machine))
|
||||
(accumulated-signal my-machine)))
|
||||
|
||||
(let ((my-machine (make-instance 'machine)))
|
||||
(with-open-file (in "day10-input.txt")
|
||||
(loop
|
||||
for line = (read-line in nil nil)
|
||||
while line
|
||||
do (parse-command-line line my-machine))
|
||||
(accumulated-signal my-machine)))
|
||||
|
||||
;;; PART 2
|
||||
|
||||
(defclass crt (machine)
|
||||
((next-special-clock :reader next-special-clock :initform 40)))
|
||||
|
||||
(defun cur-pixel-in-sprite (pixel-index sprite-center)
|
||||
(and (>= pixel-index (1- sprite-center))
|
||||
(<= pixel-index (1+ sprite-center))))
|
||||
|
||||
(defmethod tick :before ((obj crt))
|
||||
(let ((pixel (if (cur-pixel-in-sprite (clock obj) (register obj))
|
||||
"#"
|
||||
".")))
|
||||
(format t pixel))
|
||||
(when (= (clock obj) (1- (next-special-clock obj)))
|
||||
(incf (slot-value obj 'register) 40)
|
||||
(terpri)))
|
||||
|
||||
;; and same code reading in commands, but with CRT results in printing
|
||||
(let ((my-machine (make-instance 'crt)))
|
||||
(with-open-file (in "day10-test.txt")
|
||||
(loop
|
||||
for line = (read-line in nil nil)
|
||||
while line
|
||||
do (parse-command-line line my-machine))
|
||||
(accumulated-signal my-machine)))
|
||||
|
||||
(let ((my-machine (make-instance 'crt)))
|
||||
(with-open-file (in "day10-input.txt")
|
||||
(loop
|
||||
for line = (read-line in nil nil)
|
||||
while line
|
||||
do (parse-command-line line my-machine))
|
||||
(accumulated-signal my-machine)))
|
||||
|
|
Loading…
Reference in New Issue