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

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

July 25th, 2017

не слушайте космонавтов [Jul. 25th, 2017|07:46 am]
когда тебе говорят, что код надо писать с оглядкой на то, как его можно будет использовать ещё где-нибудь — смело посылай такого дебила нахуй. это сраный архитектурный космонавт, который — обычно — вообще нихуя рабочего никогда не написал, а в худшем случае — родил уёбаного говномонстра, который «универсальная платформа для всего», огромная, неповоротливая и нихера не юзабельная нормальными людьми.

на самом деле эта хуйня гнездится в черепе от того, что большинство людей не умеют думать. каждый написаный ними кусок кода — это неебать какой подвиг. им легче оттяпать себе руку или ногу, нежели выкинуть код, который они с такими страданиями высрали. но даже они как-то там понимают, что задачи бывают разные; а код выкидывать нельзя, новый-то родить сложно. поэтому они пытаются высрать «универсальный код», который можно засунуть куда угодно. а в итоге получается гибрид ежа, ужа и стаместки: такой же красивый, полезный и удобный.

не бойся писать код «под задачу». и не бойся выкидывать написаное. на самом деле — выкидывай написаное как можно чаще. потому что старый код писал старый ты — и у этого старого тебя было меньше знаний и опыта. теперешний ты сделает то же самое красивее, лучше и быстрее (а если нет — то ты говно, убей себя немедленно). всё равно если ты не говно, то две трети старого кода ты в итоге перепишешь, а про оставшуюся треть постараешься не вспоминать никогда. только это займёт больше времени, потому что сначала ты попробуешь отделаться «малой болью и лёгкой косметикой» — вместо того, чтобы спокойно сделать заново, не стесняя себя протухшей хернёй.

а вот то, что выжило после нескольких переписываний в более-менее неизменном виде — то смело оформляй как библиотеку. пригодится. всё равно это будет типичный библиотечный код для типовых рутинных хуёвин. который код, конечно, можно взять уже готовый в интернетах — но какой смысл? при первой же ошибке в нём тебе придётся туда нырять, после чего ты захочешь его переписать, и… ну, дальше понятно. да, в итоге ты перепишешь даже libc — ну и что? всё равно libc говно. ну ладно, может, не перепишешь — но наделаешь враперов для удобства, я гарантирую это. потому что libc — говно.
Link21 meows|meow!

бесполезно, но забавно [Jul. 25th, 2017|03:09 pm]
видео раз
видео 2

вообще-то я хотел поиграться с проверкой столкновений. но нашёлся на винте древний такой polyengine на сишечке (не мой). ну, «он же работает», да: портанул на дишечку. это ничего, потому что код был не мой — можно спиздить целиком, а не переписывать. ну, обычно на это надеешься. конечно, треть уже переписал, треть готова к выкидыванию, а оставшаяяся треть ужасна.

p.s.: он не тормозит, это запись тормозит. потому что я забыл там параметры подкрутить.
Linkmeow!

грешно не использовать [Jul. 25th, 2017|05:27 pm]
когда нужно что‐то отсортировать, а либцшный qsort не нравится — обычно или ебошат какой‐нибудь сранопузырёк («а, потом переделаю!» ну да, ну да…), или примитивную реализацию того же квиксорта (иногда ещё и поломаную). а ведь есть отличный heapsort: простой как полено, стабильно O(n*log n) в худшем случае, не требует дополнительной памяти. чтобы было ясно, насколько оно простое, вот весь код:
void heapsort(alias lessfn, T) (T[] arr) {
  auto count = arr.length;
  if (count < 2) return; // nothing to do

  void siftDown(T) (T start, T end) {
    auto root = start;
    for (;;) {
      auto child = 2*root+1; // left child
      if (child > end) break;
      auto swap = root;
      if (lessfn(arr.ptr[swap], arr.ptr[child])) swap = child;
      if (child+1 <= end && lessfn(arr.ptr[swap], arr.ptr[child+1])) swap = child+1;
      if (swap == root) break;
      auto tmp = arr.ptr[swap];
      arr.ptr[swap] = arr.ptr[root];
      arr.ptr[root] = tmp;
      root = swap;
    }
  }

  auto end = count-1;
  // heapify
  auto start = (end-1)/2; // parent; always safe, as our array has at least two items
  for (;;) {
    siftDown(start, end);
    if (start-- == 0) break; // as `start` cannot be negative, use this condition
  }

  while (end > 0) {
    {
      auto tmp = arr.ptr[0];
      arr.ptr[0] = arr.ptr[end];
      arr.ptr[end] = tmp;
    }
    --end;
    siftDown(0, end);
  }
}

нет никакой причины его не использовать, когда надо по какой‐то причине притащить доморощеную сортировку. ну, разве если вам нужен stable sort: хип не stable. зато не имеет патологических случаев — в отличие от quick.

p.s.: тут анонимус уточняет, что quick тоже не stable. я, вроде, не говорил, что он stable, но как-то из текста оно подразумевалось. был неправ. отстрадаю. отсижу.
Link7 meows|meow!

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