; your code goes here
(defun match (pattern string)
(let ((i 0)
(len (length string))
star)
(loop
for c across pattern
do
(when (= i len)
(return-from match))
(case c
(#\* (setf star t))
(#\? (incf i))
(otherwise (if star
(loop while (and (< i len) (not (eql c (elt string i))))
do (incf i)
finally (incf i) (setf star nil))
(if (eql c (elt string i))
(incf i)
(return-from match))))))
(= i len)))
(loop :for (s r) :on '("aababbcd" t
"abcd" nil
"aa?bxcxd" nil) :by #'cddr
:for x := (match "a?*bb*cd" s) :do
(format t "~:[FAIL~;OK~] ~:S: expected ~:[false~;true~]~%" (eql r x) s r))
OyB5b3VyIGNvZGUgZ29lcyBoZXJlCihkZWZ1biBtYXRjaCAocGF0dGVybiBzdHJpbmcpCiAgKGxldCAoKGkgMCkKICAgICAgICAobGVuIChsZW5ndGggc3RyaW5nKSkKICAgICAgICBzdGFyKQogICAgKGxvb3AKICAgICAgIGZvciBjIGFjcm9zcyBwYXR0ZXJuCiAgICAgICBkbwogICAgICAgICAod2hlbiAoPSBpIGxlbikKICAgICAgICAgICAocmV0dXJuLWZyb20gbWF0Y2gpKQogICAgICAgICAoY2FzZSBjCiAgICAgICAgICAgKCNcKiAoc2V0ZiBzdGFyIHQpKQogICAgICAgICAgICgjXD8gKGluY2YgaSkpCiAgICAgICAgICAgKG90aGVyd2lzZSAoaWYgc3RhcgogICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIHdoaWxlIChhbmQgKDwgaSBsZW4pIChub3QgKGVxbCBjIChlbHQgc3RyaW5nIGkpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gKGluY2YgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IChpbmNmIGkpIChzZXRmIHN0YXIgbmlsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGVxbCBjIChlbHQgc3RyaW5nIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5jZiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuLWZyb20gbWF0Y2gpKSkpKSkKICAgICAoPSBpIGxlbikpKQoKKGxvb3AgOmZvciAocyByKSA6b24gJygiYWFiYWJiY2QiIHQKICAgICAgICAgICAgICAgICAgICAgICAiYWJjZCIgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgImFhP2J4Y3hkIiBuaWwpIDpieSAjJ2NkZHIKICAgOmZvciB4IDo9IChtYXRjaCAiYT8qYmIqY2QiIHMpIDpkbwogICAoZm9ybWF0IHQgIn46W0ZBSUx+O09Lfl0gfjpTOiBleHBlY3RlZCB+OltmYWxzZX47dHJ1ZX5dfiUiIChlcWwgciB4KSBzIHIpKQo=