Thread overview
Sohbet: 6 Şubat 2022, Pazar, sabah 10:00 (Türkiye saati)
Jan 30, 2022
Ali Çehreli
Jan 30, 2022
Salih Dincer
Feb 04, 2022
Ali Çehreli
Feb 06, 2022
Ali Çehreli
January 30, 2022
Gündem:

- Aralıklar (ranges): Bu konuda çok konuştuk ama pekiştireceğiz. :)

- AVL Trees: Ben uzmanı değilim ve ilk defa Salih'ten duydum ama Red-Black tree ile karşılaştırarak üzerinden geçeceğiz.

Bu sefer Zoom'dan farklı bir yöntemle bağlanacağız:

  https://meet.jit.si/

Ne yazık ki siteyi basit yapalım derken karışık yapmışlar. :/ Oraya gidince "Start meeting" alanına "DDili" yazın. (Salak web tasarımcıları, o alanın içine otomatik bir şeyler yazdırarak bize "buraya yazılacak" dediklerini sanıyorlar. Halbuki biz normal kullanıcılar, içine bir şeyler yazılacak olan alanların boş olmaları gerektiğini biliyoruz.)

meet.jit.si, bütünüyle tarayıcı içinden çalışıyor. O yüzden mikrofon, kamera, vs. erişimine izin vermek gerekiyor. Benim eski Firefox ile çalışmıyordu ama Chrome ile çalışıyordu. Yeni Firefox ile de çalışıyor.

Özet:

  https://meet.jit.si/

adresindeki kolayca anlaşılmayan yere DDili yazın ve sohbete katılın.

Eğer bu yöntem çalışmazsa önceki toplantılarda kullandığımız Zoom bağlantısına geçelim. (10:15'e kadar bekleyelim; olmazsa Zoom'a geçelim.)

Ali

January 30, 2022

On Sunday, 30 January 2022 at 17:53:15 UTC, Ali Çehreli wrote:

>

Gündem:

  • Aralıklar (ranges): Bu konuda çok konuştuk ama pekiştireceğiz. :)

  • AVL Trees: Ben uzmanı değilim ve ilk defa Salih'ten duydum ama Red-Black tree ile karşılaştırarak üzerinden geçeceğiz.

Ben de yeni duydum ama mutlaka biliyorsundur hocam. Belki Türkiye'de farklı anıldığı için böyledir. Kayhan hoca şurada anlatıyor: https://youtu.be/gAg_z4vZypI

Wikipedia'da şöyle yazıyor:

"AVL ağacı ismini iki Sovyet mucitlerinden alır, Georgy Adelson-Velsky ve Evgenii Landis algoritmayı 1962'deki makaleleri 'An algorithm for the organization of information'de yayımladılar. AVL ağaçı ve Kırmızı-siyah ağaç aynı operasyonları destekledikleri ve ikisinde de basit operasyonlar için O(log n) zamanı sürdüğü için sıklıkla kıyaslanırlar. Arama işleminin fazla olduğu uygulamalar için AVL ağaçları daha katı şekilde dengelendiği için Kırmızı-siyah ağaçtan daha hızlıdır. Kırmızı siyah ağaçlara benzer şekilde AVL ağaçları uzunluğa göre dengelenmiştir."

>

Ne yazık ki siteyi basit yapalım derken karışık yapmışlar. :/

Sanırım daha da basiti şuraya tıklamak: https://meet.jit.si/Ddili

>

meet.jit.si, bütünüyle tarayıcı içinden çalışıyor. O yüzden mikrofon, kamera, vs. erişimine izin vermek gerekiyor. Benim eski Firefox ile çalışmıyordu ama Chrome ile çalışıyordu. Yeni Firefox ile de çalışıyor.

Ben de mobilde Microsoft Edge, masaüstünde GNU Chromium ve Mozilla Firefox'da denedim. Teorik olarak hepsinde çalışıyor fakat encryption olayı Firefox'da cortladı! Karşıya encrypt olarak gönderiyor ve ses&görüntü çözülüyor ama kendi kendine bozuk gösteriyor.

Ayrıca ekran paylaşımı çok başarılı! Örneğin browser'daki açık tab'lardan Youtube olanı seçtim ve herkese izlediğim dersi izlettim. Gerçi sesi paylaşmayı (paylaşmadan evvel sol alt köşedeki kutuyu işaretlememe rağmen) başaramadım.

Görüşmek üzere...

February 04, 2022
On 1/30/22 09:53, Ali Çehreli wrote:
> Gündem:
>
> - Aralıklar (ranges): Bu konuda çok konuştuk ama pekiştireceğiz. :)
>
> - AVL Trees: Ben uzmanı değilim ve ilk defa Salih'ten duydum ama
> Red-Black tree ile karşılaştırarak üzerinden geçeceğiz.

Başka bir konuda şu sunumu paylaşmıştım:

  https://dconf.org/2016/talks/clugston.html

Bugün tekrar baktım; gerçekten çok güzel. Belki orada gösterilen kayan noktalı sayıların garipliklerinden de bahsedecek zamanımız olur.

Ali

February 06, 2022
Bu sohbette aşağıdakileri karaladık.

Ali

/*
  6 Şubat 2022

  - Floating point gariplikleri

      https://dconf.org/2016/talks/clugston.html

  - AVL trees

  - Ranges (aralıklar)

  - Salih'in sayıları sözle yazma programının (code kata)
    farklı derleyicilerler farklı hızlarda çalışması

      https://forum.dlang.org/thread/sspkdp$1m4n$1@digitalmars.com

 */



/+
   +     +─────────+─────────+   ...   +   ...   +─────────+─────────+     +
   │   -max       -1         │         0         │         1        max    │
   │                         │                   │     │
-infinity               -min_normal          min_normal infinity
+/


/+

sign    : 1
exponent: 8
mantissa:
0       == 0.5
1       == 0.25
2       == 0.125
3       == 0.625
...
22



0       == 65536
1       == 32768
2       == 16384
3       == 8192
...
22


%a

 +/




/+
import std.stdio;

auto magic(float x) {
  return x + 35 - x;
}

void main() {
  writeln(float.max);
  writeln(magic(1_000_000_000));
  writefln!"%a"(0.5 + 0.125);

  //    1 84
  //---------------
  // 0001 0100


  // http://www.octomatics.org/


  writefln!"%0.20f"(0x1.fffffffp+2);

  1.8e3
}
+/





/+
import std.stdio;
import std.range;
import std.algorithm;
import std.random;

struct Düğüm_(T) {
  T eleman;
  Düğüm_ * sol;
  Düğüm_ * sağ;

  Düğüm_ * ekle(T eleman)
  out (sonuç; sonuç.eleman == eleman)
  {
    if (eleman == this.eleman) {
      return &this;
    }

    if (eleman < this.eleman) {
      if (sol is null) {
        sol = new Düğüm_(eleman);
      }

      return sol.ekle(eleman);
    }

    if (sağ is null) {
      sağ = new Düğüm_(eleman);
    }

    return sağ.ekle(eleman);
  }

  void göster(int indent) {
    if (sağ) {
      sağ.göster(indent + 2);
    }
    writefln!"%*s%s%s"(indent, "", ((indent == 0) ? "- " : "  "), eleman);
    if (sol) {
      sol.göster(indent + 2);
    }
  }
}

struct Ağaç(T) {
  alias Düğüm = Düğüm_!T;
  Düğüm * kök;
  size_t length;

  Düğüm * ekle(T eleman) {
    if (kök is null) {
      kök = new Düğüm(eleman);
      return kök;
    }

    return kök.ekle(eleman);
  }

  void göster() {
    if (kök is null) {
      writeln("boş");

    } else {
      kök.göster(0);
    }
  }
}

void main() {
  enum adet = 80;

  auto ağaç = Ağaç!int();

  auto sayılar = adet.iota
                 .map!(i => uniform(0, adet))
                 .array;

  azSırala(sayılar);

  sayılar.each!(i => ağaç.ekle(i));
  ağaç.göster();
}

void azSırala(T)(ref T[] dizi) {
  foreach (_; 0 .. 6) {
    foreach (i, eleman; dizi[0..$-1]) {
      const j = i + 1;
      if (dizi[j] < eleman) {
        swap(dizi[i], dizi[j]);
      }
    }
  }
}
+/


/+
 AVL trees ile red black trees'in karşılaştırması

    - Arama, AVL'de daha hızlıymış çünkü daha dengeliymiş

    - Ekleme ve çıkartma, red black'te daha hızlıymış

    - AVL her düğümde bir int'lik "balance factor" bilgisini tutarmış, red black tek bit'lik bilgi tutarmış

    - Red black kütüphanelerde tercih edilirmiş, AVL veri tabanlarında tercih edilirmiş
+/



/+
 Range types:

 InputRange
 ForwardRange
 BidirectionalRange
 FiniteRandomAccessRange
 InfiniteRandomAccessRange

 Eric Niebler ve range tarihçesi
 D'yi kaynak kullandığını açıkça söyleyen tek (?) C++'çı.

 Karışıklıklar:

 - Container elements veya generators (Python'un verdiği isim)
 - front()'un döndürdüğü lvalue mu rvalue mu?
 - front()'un döndürdüğü referans mı kopya mı? (HasReferenceElements)
 - Eleman hesabı nerede yapılsın? constructor da mı? popFront'ta mı? vs.
+/


// std.random (rasgele)
// "random access range" değil


/+

import std.stdio;


// (iota)
struct Sırayla(T) {
  T baş;
  T son;

  // InputRange:
  T front() {
    return baş;
  }

  auto empty() {
    return baş >= son;
  }

  void popFront() {
    ++baş;
  }

  // ForwardRange:
  auto save() {
    return this;
  }

  // Bidirectional
  auto back() {
    return son - 1;
  }

  void popBack() {
    --son;
  }

  // RandomAccessRange:
  auto opIndex(size_t i) {
    return baş + i;
  }

  // FiniteRandomAccessRange
  // (ve hasLength!R için)
  size_t length() {
    return son - baş;
  }
}

auto sırayla(T)(T baş, T son) {
  return Sırayla!T(baş, son);
}

import std.range;

void main() {
  auto r = sırayla(0, 11);
  // writefln!"%(%s, %)"(r);

  // while (true) {
  //   writeln(r.front);
  //   r.popFront();
  //   if (r.empty) {
  //     break;
  //   }

  //   writeln(r.back);
  //   r.popBack();
  //   if (r.empty) {
  //     break;
  //   }
  // }

  foreach (i; 0 .. r.length) {
    writeln(r[i]);
  }
}
+/




/+
 1) gdc 2.076
 2) ldc 2.098
 3) dmd 2.098

 bölme: /
 modulus: %
 formattedWrite <==
 sprintf

 1) ldc 2.098
 2) dmd 2.098
 3) gdc 2.076  (tam optimizasyon için başka command line switches gerekiyormuş; -O3 yetmez)

 +/



/+
// Manjaro Linux

import std;

void main() {
  string sonuç;
  foreach (i; 0 .. 10) {
    sonuç ~= ~ '(' ~ i.to!string ~ ')';
  }

  writeln(sonuç);
}

slow: ~ ~=

+/



/+
string foo() {
  static Appender!(char[]) sonuç;
  sonuç.clear();

  foreach (i; 0 .. 100) {
    static Appender!(char[]) ara;
    ara.clear();

    foreach (j; 0 .. 200) {
      ara ~= j.to!string;
    }
    sonuç ~= ara;
  }

  return sonuç.data;
}
+/



import std;
void main() {
  // const s = "abcu\u0306\u0327de";
  // const s = "abcu\u0327\u0306de";
  const s = "abcğde";
  // writeln(s);

  // char: utf-8
  // wchar: utf-16
  // dchar: utf-32

  foreach (i, c; s.byCodePoint.enumerate) {
    static assert(is (typeof(c) == dchar));
    const değer = cast(int)c;
    writefln!"%s - %08b"(i, değer);
    // write(c);
    // stdout.flush();
  }
  writeln();
}