Thread overview
String Summary
4 days ago
Salih Dincer
4 days ago
Salih Dincer
3 days ago
Ali Çehreli
2 days ago
Salih Dincer
2 days ago
Ali Çehreli
4 days ago

Merhaba,

Az önce basit bir implemantasyon yaptım. Bu D'nin dilimleme yeteneği sayesinde gerçekten de çok basit. Aslında temel olarak şu:

auto summary(size_t Size)(string str)
  => str[0..Size] ~ str[$ - Size..$];

Yani kısaca "string başı ve sonunu, derleme zamanında önceden belirlediğim bir değere göre kırp ve bana özet çıkar" demek istiyorum. Aslında gördüğünüz gibi bunun için ne bir işlev ne de yapı kurmaya gerek vardır. Hemen oracıkta, istediğiniz yerde (örn. writeln içinde) kullanabilirsiniz. İşte D'nin gücü :)

Gelelim 2025 Şubat ayında AI'ın gücüne. Çünkü son yazdığımdan beri derin düşünme ile DeepSeek piyasayı salladı. Ben de bu kadar basit şeyi AI herhalde havada karada yapar demiştim; yanılmışım! İşte sizin de deneyebileceğiniz prompt:

/*
StringSummary adında ve D dilinde yazılmış bir yapı olsun. Yapı, şablon parametresi olarak Size (tipi size_t) ve kurucusunda str (tipi string) parametresini alan özellikte olsun. String'in ilk 'size' karakterini alır, kalan kısımdan da son 'size' karakterini (veya kalan tümünü) alarak toplam 2*size uzunluğunda bir statik dizi (türü char[]) oluşturur. İlk kısım başta, son kısım sonda olmalı, arada gerekirse boşluklar kalabilir. Bir örnek ve açıklamalarla göster ve en kısa şekilde implement et. İpucu:
*/
struct StringSummary(size_t Size)
{ // No UTF support!
  char[Size * 2] buf = ' ';
  alias buf this;

  this(string str)
  {
//...
  }
}
enum len = 8UL;
enum str = "For Example 123";

void main()
{
  auto s1 = StringSummary!len(str);

  import std.stdio;
  s1.writefln!"[%s]"; // [For Exam ple 123]
}

Yani düşünün; olay o kadar basit ki döngü falan kurmaya gerek yok ve birkaç if'le çok büyük bir metnin başından ve sonundan kırpabilmeliydi. Ama istediğim sonuç hala ve hala (üstelik Python'la bile saçmaladı) yapamadı.

Kabul, belki ben prompt'u doğru üretemedim. Hatta "arada gerekirse boşluklar kalabilir." ifadesini "kalmalı!" diye değiştirmeliydim. Ancak yok kardeşim, Claude.ai dahil birçoğu (bu arada Grok 3 geliyor) sınıfta kaldı. M$'ın Copilot'unu veya Google Gemini'yi denemedim bile. Çünkü onlar şu an çağın gerisindeler...

4 days ago

On Monday, 17 February 2025 at 12:40:11 UTC, Salih Dincer wrote:

>

Merhaba,

Az önce basit bir implemantasyon yaptım. Bu D'nin dilimleme yeteneği sayesinde gerçekten de çok basit.

Unutmadan...

Bahsettiğim basitlik aşağıda; parçalı ve sabit özelliği olan bu yapıya ihtiyaç duyuyordum:

(Basit ama değil mi?)

alias StrSum = PartialFixedString;
struct PartialFixedString(size_t Size)
{ // No UTF support!
  char[Size * 2] buf = ' ';
  alias buf this;

  this(string str)
  {
    if (str.length < Size)
    {
      buf[0..str.length] = str[];
      
    } else {

      buf[0..Size] = str[0..Size];

      auto len = str.length - Size;
      if (len <= Size)
      {
        buf[$ - len..$] = str[Size..$];

      } else {

        buf[Size..$] = str[$ - Size..$];
      }
    }
  }
}

auto summary(size_t Size)(string str)
  => str[0..Size] ~ str[$ - Size..$];

enum len = 8UL;
enum str = "For Example 123";

void main()
{
  auto sum1 = StrSum!len(str);
  auto sum2 = str.summary!len;

  import std.stdio;
  sum1.writefln!"[%s]"; // [For Exam ple 123]
  sum2.writefln!"[%s]"; // [For Exammple 123]
}

İşte bu basitliğe AI modellerin erişmesi zor. D'nin kişiliğini kavramaları gerekiyor. Eee, tabi "summary() neyine yetmiyor!" diyenler olabilir. Sebebi basit: Bana veri tekrarı yapmadan sabit uzunlukta bir özet (baştan ve sondan kırpan) yapı lazımdı. Diğerleri bunu tam olarak yapamıyor ve get/put gibi method'lar için uygun değil.

SDB@79

3 days ago
On 2/17/25 4:40 AM, Salih Dincer wrote:

> auto summary(size_t Size)(string str)
>    => str[0..Size] ~ str[$ - Size..$];

Yalnızca hatırlatmak amacıyla söylüyorum: Masrafı çoğu zaman önemli olmasa da `~` işleci bellek ayırarak yeni dizgi oluşturmak zorundadır.

Belki aşağıdaki gibi bir işlev daha hızlı olabilir:

auto summary(size_t Size)(string str)
   => chain(str[0..Size], str[$ - Size..$]);

Ben de eğlencesine bir fiber çözümü yazdım:

import std.algorithm;
import std.concurrency;
import std.stdio;

void özeti(string s, size_t uzunluk) {
    size_t gösterilenUzunluk = min(s.length, uzunluk);
    yield(s[0..gösterilenUzunluk]);
    s = s[gösterilenUzunluk .. $];

    if (s.length > uzunluk) {
        yield("[...]");
    }

    gösterilenUzunluk = min(s.length, uzunluk);
    yield(s[$-gösterilenUzunluk .. $]);
}

void main() {
    scope özet = new Generator!string(() => "1234567890".özeti(3));
    writefln!"%-(%s%)"(özet);
}

Tabii ki unutmuş olduğumdan şu bölümden yararlanmak zorunda kaldım: :D

  https://ddili.org/ders/d/fiberler.html

Ali

2 days ago

On Monday, 17 February 2025 at 20:19:26 UTC, Ali Çehreli wrote:

>

Ben de eğlencesine bir fiber çözümü yazdım:

Teşekkürler hocam, eğleniyorsak sorun yok. Özellikle bugünlerde AI modelleri ile ben çok eğleniyorum; onları kapıştırıyorum falan! Misal:

Birine şunun promtunu yaz diyorum, diğerine promptun gereğini yap... Ondan aldığımı ötekine satıyor eklemeler yapıyorum. Neticede düğümleniyorlar ve bu kod daha da optimize olmaz diyorlar :)

Ancak şu foreach() kullanmadan kaydırma olayını beceremedik. Her model (organik model olarak ben de) dügümlendik. Nedense tek satırlı çözümde (lütfen gizlenen satır aç) Range Error hatası alıyorum:

Anlamıyorum! Gizlenen yorum satırının çalışması gerekiyordu, neden çalışmadı?

import std.stdio;
void main()
{
  auto sum = StrSum!8("For Exam");
  sum.writeln;
  sum.put('p');
  sum.writeln;
  sum.put('l');
  sum.writeln;
  sum.put('e');
  sum.writeln;
}

alias StrSum = StringSummary;
struct StringSummary(size_t Size)
{
  char[Size * 2] buf = ' ';
  size_t index, length;

  this(string str)
  {
    length = str.length + index;
    if (length <= Size)
    {
      buf[index..length] = str[];
      index = length;

    } else {

      buf[0..Size] = str[0..Size];
      index = Size;

      length = str.length - Size;
      if (length <= Size)
      {
        buf[$ - length..$] = str[Size..$];

      } else {

        buf[Size..$] = str[$ - Size..$];
      }
    }
  }

  void put(char value)
  {
    if (index < Size)
    {
      buf[index++] = value;

    } else {
      // işte alttaki ilk akla gelen çöxüm hata veriyor:
      //buf[Size .. $ - 1] = buf[Size + 1 .. $];/*
      foreach (i; Size .. buf.length - 1)
      {
        buf[i] = buf[i + 1];
      }//*/
      buf[$ - 1] = value;
    }
  }

  alias buf this;/*
  auto toString() const
    => buf.idup; //*/
}

Saygılar...

2 days ago
On 2/18/25 12:20 PM, Salih Dincer wrote:

> Anlamıyorum! Gizlenen yorum satırının çalışması gerekiyordu, neden
> çalışmadı?

>        // işte alttaki ilk akla gelen çöxüm hata veriyor:
>        //buf[Size .. $ - 1] = buf[Size + 1 .. $];/*

Orada uzunluklarda sorun yok çünkü Size==8 ve $==16 ama benim de hemen aklıma gelmeyen bir konu varmış: Bu tür dilim atamasında örtüşme (overlap) hata kabul ediliyormuş:

  https://dlang.org/spec/arrays.html#overlapping-copying

Ali