 
 ;; Initially, only "a" to "d"
 (s/def ::regs (s/map-of string? integer?))
+(s/def ::ip   integer?)
 
-(s/def ::computer (s/keys :req-un [::regs]))
+(s/def ::computer (s/keys :req-un [::ip ::regs]))
+
+;; since :y doesn't always exists, I might have to remove it
+(s/def ::cmd  (s/keys :reg-un [::cmd ::x ::y]))
+(s/def ::cmds (s/coll-of ::cmd))
+
+
 
 (s/fdef init-computer
         :args (s/cat)

        ret)))

;; testdata defined further down
(declare puzzle-input-a)

(defn parse-cmds
  ([](parse-cmds (str/split-lines puzzle-input-a)))
  ([cmds]
   (map parse-cmd cmds)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; execution




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn parse-cpy-value
  [cmd]
  (if-let [[_ x y] (re-find (re-matcher #"^cpy (-?\d+) ([a-z]+)$" cmd))]
    {:cmd :cpy-value :x (parse-int x) :y y}))

(defn parse-cpy-reg
  [cmd]
