import time
def tokenize_pattern(pattern: str, wildcard: str = '@'):
tokens = (token for token in pattern.split(wildcard) if token)
pattern_position = 0
for token in tokens:
token_shift = pattern.index(token, pattern_position)
yield token_shift, token
pattern_position = pattern_position + len(token) + 1
def ara_ara(input_string: str, pattern: str, wildcard: str = '@'):
tokens = [*tokenize_pattern(pattern)]
if not tokens:
return 0
_, start_token = tokens[0]
skip = 0
probe = input_string.find(start_token)
while probe > -1:
skip = skip + probe
input_string = input_string[probe:]
for token_shift, token in tokens[1:]:
if input_string[token_shift:token_shift + len(token)] != token:
skip += 1
input_string = input_string[1:]
probe = input_string.find(start_token)
break
else:
return skip
time_start = time.monotonic()
result = ara_ara(input_string='obosralsya v proshlom primere', pattern='sr@l')
time_end = time.monotonic()
worktime = 1_000_000 * (time_end - time_start)
print(f"result: {result}, worktime: {worktime:.1f}us")
aW1wb3J0IHRpbWUKCgpkZWYgdG9rZW5pemVfcGF0dGVybihwYXR0ZXJuOiBzdHIsIHdpbGRjYXJkOiBzdHIgPSAnQCcpOgogICAgdG9rZW5zID0gKHRva2VuIGZvciB0b2tlbiBpbiBwYXR0ZXJuLnNwbGl0KHdpbGRjYXJkKSBpZiB0b2tlbikKICAgIHBhdHRlcm5fcG9zaXRpb24gPSAwCiAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgIHRva2VuX3NoaWZ0ID0gcGF0dGVybi5pbmRleCh0b2tlbiwgcGF0dGVybl9wb3NpdGlvbikKICAgICAgICB5aWVsZCB0b2tlbl9zaGlmdCwgdG9rZW4KICAgICAgICBwYXR0ZXJuX3Bvc2l0aW9uID0gcGF0dGVybl9wb3NpdGlvbiArIGxlbih0b2tlbikgKyAxCgoKZGVmIGFyYV9hcmEoaW5wdXRfc3RyaW5nOiBzdHIsIHBhdHRlcm46IHN0ciwgd2lsZGNhcmQ6IHN0ciA9ICdAJyk6CiAgICB0b2tlbnMgPSBbKnRva2VuaXplX3BhdHRlcm4ocGF0dGVybildCiAgICBpZiBub3QgdG9rZW5zOgogICAgICAgIHJldHVybiAwCgogICAgXywgc3RhcnRfdG9rZW4gPSB0b2tlbnNbMF0KICAgIHNraXAgPSAwCiAgICBwcm9iZSA9IGlucHV0X3N0cmluZy5maW5kKHN0YXJ0X3Rva2VuKQogICAgd2hpbGUgcHJvYmUgPiAtMToKICAgICAgICBza2lwID0gc2tpcCArIHByb2JlCiAgICAgICAgaW5wdXRfc3RyaW5nID0gaW5wdXRfc3RyaW5nW3Byb2JlOl0KICAgICAgICBmb3IgdG9rZW5fc2hpZnQsIHRva2VuIGluIHRva2Vuc1sxOl06CiAgICAgICAgICAgIGlmIGlucHV0X3N0cmluZ1t0b2tlbl9zaGlmdDp0b2tlbl9zaGlmdCArIGxlbih0b2tlbildICE9IHRva2VuOgogICAgICAgICAgICAgICAgc2tpcCArPSAxCiAgICAgICAgICAgICAgICBpbnB1dF9zdHJpbmcgPSBpbnB1dF9zdHJpbmdbMTpdCiAgICAgICAgICAgICAgICBwcm9iZSA9IGlucHV0X3N0cmluZy5maW5kKHN0YXJ0X3Rva2VuKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2tpcAoKdGltZV9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKcmVzdWx0ID0gYXJhX2FyYShpbnB1dF9zdHJpbmc9J29ib3NyYWxzeWEgdiBwcm9zaGxvbSBwcmltZXJlJywgcGF0dGVybj0nc3JAbCcpCnRpbWVfZW5kID0gdGltZS5tb25vdG9uaWMoKQoKd29ya3RpbWUgPSAxXzAwMF8wMDAgKiAodGltZV9lbmQgLSB0aW1lX3N0YXJ0KQpwcmludChmInJlc3VsdDoge3Jlc3VsdH0sIHdvcmt0aW1lOiB7d29ya3RpbWU6LjFmfXVzIik=