; your code goes here
(defun match (pattern string)
(let ((i 0)
(len (length string))
star)
(loop
for c across pattern
while (< i len)
do
;; (format t "~a [~d]~a ~%" c i (elt string i))
(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))))))
(and (= 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 "~a ==> ~f ~%" s x)
(format t "~:[FAIL~;OK~] ~:S: expected ~:[false~;true~]~%" (eql r x) s r))
OyB5b3VyIGNvZGUgZ29lcyBoZXJlCihkZWZ1biBtYXRjaCAocGF0dGVybiBzdHJpbmcpCiAgKGxldCAoKGkgMCkKICAgICAgICAobGVuIChsZW5ndGggc3RyaW5nKSkKICAgICAgICBzdGFyKQogICAgKGxvb3AKICAgICAgIGZvciBjIGFjcm9zcyBwYXR0ZXJuCiAgICAgICB3aGlsZSAoPCBpIGxlbikKICAgICAgIGRvCiAgICAgICAgIDs7IChmb3JtYXQgdCAifmEgW35kXX5hIH4lIiBjIGkgKGVsdCBzdHJpbmcgaSkpCiAgICAgICAgIChjYXNlIGMKICAgICAgICAgICAoI1wqIChzZXRmIHN0YXIgdCkpCiAgICAgICAgICAgKCNcPyAoaW5jZiBpKSkKICAgICAgICAgICAob3RoZXJ3aXNlIChpZiBzdGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3Agd2hpbGUgKGFuZCAoPCBpIGxlbikgKG5vdCAoZXFsIGMgKGVsdCBzdHJpbmcgaSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyAoaW5jZiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgKGluY2YgaSkgKHNldGYgc3RhciBuaWwpKQogICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXFsIGMgKGVsdCBzdHJpbmcgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmNmIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm4pKSkpKSkKICAgICAoYW5kICg9IGkgbGVuKSkpKQoKKGxvb3AgOmZvciAocyByKSA6b24gJygiYWJjZCIgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgImFhYmNkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImE/YmNkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImFhP2J4Y3hkIiB0CiAgICAgICAgICAgICAgICAgICAgICAgImFhP2J4Y2QiIHQpIDpieSAjJ2NkZHIKICAgOmZvciB4IDo9IChtYXRjaCAiYSo/YipjKmQiIHMpIDpkbwogICA7OyAoZm9ybWF0IHQgIn5hID09PiB+ZiB+JSIgcyB4KQogICAoZm9ybWF0IHQgIn46W0ZBSUx+O09Lfl0gfjpTOiBleHBlY3RlZCB+OltmYWxzZX47dHJ1ZX5dfiUiIChlcWwgciB4KSBzIHIpKQo=