Subject: cmpAbc'yi otomatik olarak oluşturmak
Türk alfabesinden başka alfabeleri de (ve şapkalı harfleri de) desteklemeyi kolaylaştırmak için aklıma bir fikir geldi: cmpAbc'yi otomatik olarak oluşturabilir miyiz?
Bu eşleme tablosunu trileri'den kopyalayarak yazdırırsak:
Çıktısı şöyle oluyor:
Yani 0x0.8p0, aslında onaltılı sistemde yazılmış 0.5 değeri. Örneğin ç için 99.5 çıkıyor, çünkü 'c'nin ASCII kodu 99, ve ona .5 eklenince 'ç' için 99.5 oluyor.
Bu tabloyu elle yazmak zahmetli ve hataya açık. Onun yerine, şu dizgiden yola çıksak, yukarıdaki tabloyu otomatik olarak oluşturabilir miyiz:
Tabii otomatik olarak oluşturulan eşleme tablosunda yalnızca özel olanlar değil; bütün alfabe bulunacaktır. Sorun değil...
Yani şu eşlemeleri istiyor olalım:
Algoritma bu dizgide ilerler, sıra dışında gördüklerine yarımlı değerler atar. Örneğin 'â' karakterinin değeri 226'dır. Kendisinden önceki 'a'nın değeri 97, ve kendisinden sonraki 'b'nin değeri '98' olduğu için 'â'nın sıra dışı olduğunu anlar ve ona 'a' ile 'b'nin ortasındaki değeri verir...
Ben yalnızca döngüsünü kuruyorum; ilginç bulanlar tamamlasın lütfen...
Şimdilik yalnızca ekrana yazdırmak yeterli:
Sıra numaraları "sıralı" olsun...
Ali
Bu eşleme tablosunu trileri'den kopyalayarak yazdırırsak:
import std.cstream; /* * Sıralanmalarının düzeltilmesi gereken harflerin sıra numaraları */ private static immutable double[dchar] cmpAbc; static this() { cmpAbc = [ 'ç' : 'c' + 0x0.8p0, 'ğ' : 'g' + 0x0.8p0, 'ı' : 'h' + 0x0.8p0, 'ö' : 'o' + 0x0.8p0, 'ş' : 's' + 0x0.8p0, 'ü' : 'u' + 0x0.8p0, 'Ç' : 'C' + 0x0.8p0, 'Ğ' : 'G' + 0x0.8p0, 'İ' : 'I' + 0x0.8p0, 'Ö' : 'O' + 0x0.8p0, 'Ş' : 'S' + 0x0.8p0, 'Ü' : 'U' + 0x0.8p0 ]; } void main() { foreach (karakter, sıraNumarası; cmpAbc) { dout.writefln(karakter, ": ", sıraNumarası); } }
Çıktısı şöyle oluyor:
Ç: 67.5
İ: 73.5
ı: 104.5
Ö: 79.5
Ü: 85.5
ç: 99.5
ö: 111.5
ü: 117.5
Ş: 83.5
ş: 115.5
Ğ: 71.5
ğ: 103.5
Yani 0x0.8p0, aslında onaltılı sistemde yazılmış 0.5 değeri. Örneğin ç için 99.5 çıkıyor, çünkü 'c'nin ASCII kodu 99, ve ona .5 eklenince 'ç' için 99.5 oluyor.
Bu tabloyu elle yazmak zahmetli ve hataya açık. Onun yerine, şu dizgiden yola çıksak, yukarıdaki tabloyu otomatik olarak oluşturabilir miyiz:
"aâbcçdefgğhıîijklmnoöpqrsştuûüvwxyz"Tabii otomatik olarak oluşturulan eşleme tablosunda yalnızca özel olanlar değil; bütün alfabe bulunacaktır. Sorun değil...
Yani şu eşlemeleri istiyor olalım:
a: 97 â: 97.5 b: 98 c: 99 ç: 99.5 ...
Algoritma bu dizgide ilerler, sıra dışında gördüklerine yarımlı değerler atar. Örneğin 'â' karakterinin değeri 226'dır. Kendisinden önceki 'a'nın değeri 97, ve kendisinden sonraki 'b'nin değeri '98' olduğu için 'â'nın sıra dışı olduğunu anlar ve ona 'a' ile 'b'nin ortasındaki değeri verir...
Ben yalnızca döngüsünü kuruyorum; ilginç bulanlar tamamlasın lütfen...
Şimdilik yalnızca ekrana yazdırmak yeterli:import std.cstream; void main() { dstring alfabe = "aâbcçdefgğhıîijklmnoöpqrsştuûüvwxyz"; foreach (harf; alfabe) { double sıraNumarası = harf; dout.writefln(harf, ": ", sıraNumarası); } }
Sıra numaraları "sıralı" olsun...
Ali
acehreli
Show profile
Link to this post