crypt of decay - July 29th, 2017 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

July 29th, 2017

а почему, собственно? [Jul. 29th, 2017|08:02 am]
с детства понять не мог, почему мальчишка из «в синем море, в белой пене…» так рвался съебнуть. русалка вполне симпатичная, на халяву учат, скипнуть — если чо — можно и попозже… чёрт, его же реальной рабочей магии учили! а этот долбоёб, от таких знаний… к тому же Анаит поёт клёво.
Link73 meows|meow!

оксюмороны, которые... [Jul. 29th, 2017|07:10 pm]
…принимают серьёзно, потому что Так Положено. хотя на самом деле полная чушь:

власть народа.

тот политик, который изобрёл этот термин, был гений. сколько тысяч лет прошло — а долбоёбы до сих пор ведутся.
Linkmeow!

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-кода и менеджмента потоков.
Link14 meows|meow!

navigation
[ viewing | July 29th, 2017 ]
[ go | Previous Day|Next Day ]