; 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 '("abcd" nil
"aabcd" t
"a?bcd" t
"aa?bxcxd" t
"aa?bxcd" t) :by #'cddr
:for x := (match "a*?b*c*d" s) :do
(format t "~:[FAIL~;OK~] ~:S: expected ~:[false~;true~]~%" (eql r x) s r))
OyB5b3VyIGNvZGUgZ29lcyBoZXJlCihkZWZ1biBtYXRjaCAocGF0dGVybiBzdHJpbmcpCiAgKGxldCAoKGkgMCkKICAgICAgICAobGVuIChsZW5ndGggc3RyaW5nKSkKICAgICAgICBzdGFyKQogICAgKGxvb3AKICAgICAgIGZvciBjIGFjcm9zcyBwYXR0ZXJuCiAgICAgICBkbwogICAgICAgICAod2hlbiAoPSBpIGxlbikKICAgICAgICAgICAocmV0dXJuLWZyb20gbWF0Y2gpKQogICAgICAgICAoY2FzZSBjCiAgICAgICAgICAgKCNcKiAoc2V0ZiBzdGFyIHQpKQogICAgICAgICAgICgjXD8gKGluY2YgaSkpCiAgICAgICAgICAgKG90aGVyd2lzZSAoaWYgc3RhcgogICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIHdoaWxlIChhbmQgKDwgaSBsZW4pIChub3QgKGVxbCBjIChlbHQgc3RyaW5nIGkpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gKGluY2YgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IChpbmNmIGkpIChzZXRmIHN0YXIgbmlsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGVxbCBjIChlbHQgc3RyaW5nIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5jZiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuLWZyb20gbWF0Y2gpKSkpKSkKICAgICAoPSBpIGxlbikpKQoKKGxvb3AgOmZvciAocyByKSA6b24gJygiYWJjZCIgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgImFhYmNkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImE/YmNkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImFhP2J4Y3hkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImFhP2J4Y2QiIHQpIDpieSAjJ2NkZHIKICAgOmZvciB4IDo9IChtYXRjaCAiYSo/YipjKmQiIHMpIDpkbwogICAoZm9ybWF0IHQgIn46W0ZBSUx+O09Lfl0gfjpTOiBleHBlY3RlZCB+OltmYWxzZX47dHJ1ZX5dfiUiIChlcWwgciB4KSBzIHIpKQo=