August 01

Merhaba,

Aslında toplantı sırasında değindiğim için şuraya yazmak istedim ama kolaylık olsun diye her seferinde ayrı başlık açma geleneğine devam:

https://forum.dlang.org/post/nhauxkbjkqpiwjzmybhu@forum.dlang.org

Orada kısaca demiştim ki abeceyi bir diziye sıralı bir şekilde koyarsak basit bir indexOf() gerçeklemesi ile hızlı bir çözüm üretebiliriz. Hatta bunun sırasını kullanım sıklığına göre değiştirerek daha verimli çalıştırmak mümkün:

import std.string, std.stdio, std.uni;

void main()
{
  auto message = "123 â şemsiye ve de ölçüsüz ip kullanılarak ağlayan çocuk istanbul'a getirilir."d;
  //auto deneme = Dizgi!"tur"(message);
  //auto abeceD = to!dstring(türkAlfabesi);
  auto abece = "  '’,,..00112233445566778899aAbBcCçÇdDeEfFgGğĞhHıIiİjJkKlLmMnNoOöÖpPqQrRsSşŞtTuUüÜvVwWxXyYzZ"d;
  foreach(m; message) {
    abece[abece.indexOf(m)+1].write;
  }
  writeln;
  message.asUpperCase.writeln;

  /* 2. satır sonuç çıkar, kod acehreli.alphabet
   * ile uyumludur (gizlenen satır ve modül koda
   * eklenmek şartıyla), ilk satırda Türkçe İ'le
   * ilgili bir sorun yoktur, hatta indexOf() -1
   * döndürmesi programın çökmesiyle sonuçlanmaz
   * ama yerine boşluk döndürür: örn. â gibi ...
   */
}

Aksanlı harfleri ve diğer noktalama işaretlerini de eklerseniz kodun eksikliği giderilebilir. En güzel özelliği de mesela düz tırnak işareti yerine daha insancıl üst ayraç dönüşümünün burada uygulanabilmesi.

Gayet basit değil mi?

August 01
On 8/1/21 7:08 AM, Salih Dincer wrote:

>    auto abece = "
> '’,,..00112233445566778899aAbBcCçÇdDeEfFgGğĞhHıIiİjJkKlLmMnNoOöÖpPqQrRsSşŞtTuUüÜvVwWxXyYzZ"d;

Evet, en hızlı "arama", bunun gibi dizilerle sağlanır.

>      abece[abece.indexOf(m)+1].write;

Ama burada indexOf'un kendisinin sıralı arayan (linear search) bir algoritma olduğunu da hatırlamak gerek. Ortalamada her harf için abece'nin yarı uzunluğu kadar ilerler.. diyeceğim ama demiyorum... :) çünkü sık karşılaşılan harfleri abece'nin baş tarafına yerleştirmek gibi eniyileştirmelerden bahsetmiştin.

Ali