Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 23s
Recursive wildcard matcher:
let rec is_match s i p j =
if j = String.length p then i = String.length s
else if p.[j] = '*' then
is_match s i p (j + 1) (* * matches empty *)
|| (i < String.length s && is_match s (i + 1) p j) (* * eats char *)
else
i < String.length s
&& (p.[j] = '?' || p.[j] = s.[i])
&& is_match s (i + 1) p (j + 1)
Patterns vs texts:
a*b | aaab abc abxyz xy xyz axby -> 1 match
?b*c | aaab abc abxyz xy xyz axby -> 1 match
*x*y* | aaab abc abxyz xy xyz axby -> 4 matches
total = 6
Tests deeply nested short-circuit && / ||, char equality on
pattern bytes, doubly-nested List.iter cross product.
173 baseline programs total.
25 lines
616 B
OCaml
25 lines
616 B
OCaml
let rec is_match s i p j =
|
|
if j = String.length p then i = String.length s
|
|
else if p.[j] = '*' then
|
|
is_match s i p (j + 1)
|
|
|| (i < String.length s && is_match s (i + 1) p j)
|
|
else
|
|
i < String.length s
|
|
&& (p.[j] = '?' || p.[j] = s.[i])
|
|
&& is_match s (i + 1) p (j + 1)
|
|
|
|
let count_match patterns texts =
|
|
let count = ref 0 in
|
|
List.iter (fun p ->
|
|
List.iter (fun t ->
|
|
if is_match t 0 p 0 then count := !count + 1
|
|
) texts
|
|
) patterns;
|
|
!count
|
|
|
|
;;
|
|
|
|
let patterns = ["a*b"; "?b*c"; "*x*y*"] in
|
|
let texts = ["aaab"; "abc"; "abxyz"; "xy"; "xyz"; "axby"] in
|
|
count_match patterns texts
|