а почему, собственно? |
[Jul. 29th, 2017|08:02 am] |
с детства понять не мог, почему мальчишка из «в синем море, в белой пене…» так рвался съебнуть. русалка вполне симпатичная, на халяву учат, скипнуть — если чо — можно и попозже… чёрт, его же реальной рабочей магии учили! а этот долбоёб, от таких знаний… к тому же Анаит поёт клёво. |
|
|
оксюмороны, которые... |
[Jul. 29th, 2017|07:10 pm] |
…принимают серьёзно, потому что Так Положено. хотя на самом деле полная чушь:
власть народа.
тот политик, который изобрёл этот термин, был гений. сколько тысяч лет прошло — а долбоёбы до сих пор ведутся. |
|
|
your glob matching sux |
[Jul. 29th, 2017|11:31 pm] |
вы таки будете смеяться, но куча софта до сих пор не умеет делать нормальный glob pattern matching (это шелл-лайк простенькие регулярки, только с «*» и «?» — типа «a*b.ext»). или тупо хуячат рекурсию с полным бэктрэком, или заводят для этого аж весь движок «взрослых регулярок» (и дико фэйлят опять, если движок бэктрэковый).
то есть, вот эта херня наглухо их убивает, как и полагается (потому что патологический бэктрэк): «a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*b».
а ведь бэктрэкать все снежинки в глобматчере не надо вообще. примерно вот так:
bool wildmatch (const(char)[] pat, const(char)[] str) pure nothrow @trusted @nogc {
bool star = false;
loopStart:
size_t patpos = 0;
foreach (immutable i, immutable char sch; str) {
if (patpos == pat.length) goto starCheck;
switch (pat.ptr[patpos++]) {
case '\\':
if (patpos == pat.length) return false; // malformed pattern
++patpos;
goto default;
case '?': // match anything except '.'
if (sch == '.') goto starCheck;
break;
case '*':
star = true;
str = str[i..$];
pat = pat[patpos..$];
while (pat.length && pat.ptr[0] == '*') pat = pat[1..$];
if (pat.length == 0) return true;
goto loopStart;
default:
if (sch != pat.ptr[patpos-1]) goto starCheck;
break;
}
}
pat = pat[patpos..$];
while (pat.length && pat.ptr[0] == '*') pat = pat[1..$];
return (pat.length == 0);
starCheck:
if (!star) return false;
if (str.length) str = str[1..$];
goto loopStart;
} работоспособность алгоритма может показаться неочевидной; в этом случае покрутите его в голове. как только вы поймёте, почему не надо бэктрэкать прошлые снежинки, вы удивитесь, как оно раньше в голову не приходило. и не пишите больше рекурсивных глобматчеров с полным бэктрэком: каждый такой глобматчер делает голодным и грустным как минимум одного котёнка.
конечно, это всё ещё бэктрэкер, и его можно ускорить, применив thompson vm для регулярок — но мне кажется, что это будет уже немного перебор. а на непатологических случаях ещё и ненужное замедление — за счёт компиляции vm-кода и менеджмента потоков. |
|
|