import time
import re
from memory_profiler import profile
stepan_says = "aahahaaaaaaaaaaajkfldhahadofofahahlsaaadklsdhahaaa" * 2000
#with open("stepan_says.txt", "w", encoding="utf-8") as f:
#f.write(stepan_says)
# @profile
def loop(inp):
m, cm = 0, 0
pch = ''
for i, ch in enumerate(inp):
if i == 0:
pch = ch
if ch in ('a', 'h'):
cm += 1
continue
if i == 1:
if (pch + ch) in ('aa', 'hh'):
cm = 0
pch = ch
continue
if (pch + ch) in ('ah', 'ha'):
cm += 1
pch = ch
else:
if cm > m:
m = cm
cm = 0
if cm > m:
m = cm
return m
@profile
def regex(inp):
return len(
sorted(
filter(
lambda x: abs(x.count("a") - x.count("h")) <= 1,
re.findall('(?!aa|hh)([ah]{1,})(?<!aa|hh)', stepan_says)
), key=lambda x: len(x)
)[-1]
)
start = time.monotonic()
regex(stepan_says)
finish = time.monotonic()
# print(f'Loop: {finish-start:.5f}')
# print(f'Regex: {finish-start:.5f}')
aW1wb3J0IHRpbWUKaW1wb3J0IHJlCgpmcm9tIG1lbW9yeV9wcm9maWxlciBpbXBvcnQgcHJvZmlsZQoKCnN0ZXBhbl9zYXlzID0gImFhaGFoYWFhYWFhYWFhYWFqa2ZsZGhhaGFkb2ZvZmFoYWhsc2FhYWRrbHNkaGFoYWFhIiAqIDIwMDAKCgojd2l0aCBvcGVuKCJzdGVwYW5fc2F5cy50eHQiLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAjZi53cml0ZShzdGVwYW5fc2F5cykKCiMgQHByb2ZpbGUKZGVmIGxvb3AoaW5wKToKICAgIG0sIGNtID0gMCwgMAoKICAgIHBjaCA9ICcnCgogICAgZm9yIGksIGNoIGluIGVudW1lcmF0ZShpbnApOgogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgcGNoID0gY2gKICAgICAgICAgICAgaWYgY2ggaW4gKCdhJywgJ2gnKToKICAgICAgICAgICAgICAgIGNtICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgaSA9PSAxOgogICAgICAgICAgICBpZiAocGNoICsgY2gpIGluICgnYWEnLCAnaGgnKToKICAgICAgICAgICAgICAgIGNtID0gMAogICAgICAgICAgICAgICAgcGNoID0gY2gKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIChwY2ggKyBjaCkgaW4gKCdhaCcsICdoYScpOgogICAgICAgICAgICBjbSArPSAxCiAgICAgICAgICAgIHBjaCA9IGNoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgY20gPiBtOgogICAgICAgICAgICAgICAgbSA9IGNtCiAgICAgICAgICAgIGNtID0gMAoKICAgIGlmIGNtID4gbToKICAgICAgICBtID0gY20KCiAgICByZXR1cm4gbQoKQHByb2ZpbGUKZGVmIHJlZ2V4KGlucCk6CiAgICByZXR1cm4gbGVuKAogICAgICAgIHNvcnRlZCgKICAgICAgICAgICAgZmlsdGVyKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IGFicyh4LmNvdW50KCJhIikgLSB4LmNvdW50KCJoIikpIDw9IDEsCiAgICAgICAgICAgICAgICByZS5maW5kYWxsKCcoPyFhYXxoaCkoW2FoXXsxLH0pKD88IWFhfGhoKScsIHN0ZXBhbl9zYXlzKQogICAgICAgICAgICApLCBrZXk9bGFtYmRhIHg6IGxlbih4KQogICAgICAgIClbLTFdCiAgICApCgoKc3RhcnQgPSB0aW1lLm1vbm90b25pYygpCgpyZWdleChzdGVwYW5fc2F5cykKCmZpbmlzaCA9IHRpbWUubW9ub3RvbmljKCkKIyBwcmludChmJ0xvb3A6IHtmaW5pc2gtc3RhcnQ6LjVmfScpCiMgcHJpbnQoZidSZWdleDoge2ZpbmlzaC1zdGFydDouNWZ9JykK