Merhaba,
Aşağıda D olanaklarını biraz zorlamak istediysem de, dili bir işlemci (D == CPU) gibi düşünürsek hiç ısınma olmadı bile! Zorlanan ben oldum galiba :)
Bakalım n'olcak, hangi olanağı seveceksiniz, söyleyin bakalım sevdiniz mi? Belki devamında bir JSON dosyasından okutup AA içine atar ve şimdi yapacağımız gibi sıralarız, ne dersiniz?
Veri kaynağı: https://en.m.wikipedia.org/wiki/English_punctuation
string[char] dict = [
'.': "Dot",
',': "Comma",
'"': "Doublequote",
'\'': "Apostrophe",
'-': "Hyphen",
'?': "Question",
':': "Colon",
'!': "Exclamation",
';': "Semicolon"
];
// Yukardaki gibi AA dizisinin indeksi karakter, açıklaması da bir dizge olsun ve bunların kullanım sıklığını da şu şekilde AA içine alalım:
char[float] freq = [
65.3:46,
61.3:44,
26.7:34,
24.3:39,
15.3:45,
5.6 :63,
3.4 :58,
3.3 :33,
3.2 :59
];
// Hemen basit bir şekilde ve dolaylı olarak bağlayıp (cross-indexing) ekrena şu şekilde listelemek mümkün:
foreach(f; freq.keys.sort!"a>b") {
auto key = freq[f];
writefln("(%c) %s, %.1f", key, dict[key], f);
}
/* ÇIKTISI:
(.) Dot, 65.3
(,) Comma, 61.3
(") Doublequote, 26.7
(') Apostrophe, 24.3
(-) Hyphen, 15.3
(?) Question, 5.6
(:) Colon, 3.4
(!) Exclamation, 3.3
(;) Semicolon, 3.2
*/
Ama bu pek düzenli görünmüyor. Çünkü başka bir üçlü veri elimizde olabilir ve bunları sıralı bir şekilde listelemek gerekebilir. Belki daha kolay yolu vardır (Ali hocam, AA kullanmadan mümkün mü?) ama şimdilik şu leziz çözüm ile idare edin:
import std.algorithm;
import std.stdio, std.typecons;
struct SÖZLÜK(C, F, S) {
S[C] dict;
C[F] freq;
@property add(Tuple!(C, F, S) chr) {
dict[chr[0]] = chr[2];
freq[chr[1]] = chr[0];
}
string toString() const {
import std.array : appender;
import std.format : formattedWrite;
auto r = appender!string;
foreach(f; freq.keys.sort!"a>b") {
auto key = freq[f];
r.formattedWrite("(%c) %s, %.1f\n",
key, dict[key], f);
}
return r.data;
}
}
void main()
{
writeln("İngilizce'de kullanılan noktalama işaretlerinin ağırlıkları");
alias index = char;
alias rank = float;
alias name = string;
alias chr = Tuple!(index, rank, name);
auto chrs = [chr(46, 65.3, "Dot"),
chr(44, 61.3, "Comma"),
chr(34, 26.7, "Doublequote"),
chr(39, 24.3, "Apostrophe"),
chr(45, 15.3, "Hyphen"),
chr(63, 5.6, "Question"),
chr(58, 3.4, "Colon"),
chr(33, 3.3, "Exclamation"),
chr(59, 3.2, "Semicolon")];
SÖZLÜK!(index, rank, name) sözlük;
foreach(tup; chrs) {
sözlük.add(tup);
}
sözlük.writeln;
}
Başarılar...