upto ve downto kabul! :)
Ben de aşağıdaki programda artanAzalan ve azalanArtan diye iki işlev yazdım. Böylece boşlukların 2, 1, 0, 1, 2 diye önce azalan ve sonra artan genişliklerini ve yıldızların 1, 3, 5, 3, 1 diye önce artan ve sonra azalan genişliklerini ifade edebiliriz.
Bu iki genişlik dizisini zip ile birleştirdiğimizde de çokuzlu sayı dizileri elde etmiş oluruz. Örneğin, genişliği 5 olan baklava dilimi için:
writefln("%(%s\n%)", zip(azalanArtan(0, 2, 1),
artanAzalan(1, 5, 2)));
Çokuzluların birinci elemanları boşluk genişliğini, ikinci elemanları da yıldız genişliğini veriyor:
'
Tuple!(int, int)(2, 1)
Tuple!(int, int)(1, 3)
Tuple!(int, int)(0, 5)
Tuple!(int, int)(1, 3)
Tuple!(int, int)(2, 1)
'
Şimdi o çokuzluları boşluk ve yıldız karakterleri üreten bir map'e verirsek bu işi daha farklı ama yine temiz bir biçimde halletmiş oluyoruz:
import std.range;
import std.algorithm;
import std.conv;
import std.string;
import std.exception;
import std.stdio;
import std.traits;
/* Küçük değerden büyük değere doğru artan ve sonra tekrar küçük değere doğru
* azalan değerler üretir. */
auto artanAzalan(T)(T küçük, T büyük, T adım = 1)
if (isSigned!T)
{
return chain(iota(küçük, büyük, adım),
iota(büyük, küçük - 1, -adım));
}
unittest
{
assert(artanAzalan(1, 7, 2).equal([ 1, 3, 5, 7, 5, 3, 1 ]));
}
/* Büyük değerden küçük değere doğru azalan ve sonra tekrar büyük değere doğru
* artan değerler üretir. */
auto azalanArtan(T)(T küçük, T büyük, T adım = 1)
if (isSigned!T)
{
return chain(iota(büyük, küçük, -adım),
iota(küçük, büyük + 1, adım));
}
unittest
{
assert(azalanArtan(10, 20, 5).equal([ 20, 15, 10, 15, 20 ]));
}
auto baklavaDilimi(size_t N)
{
enforce(N % 2, format("Baklava dilimi genişliği çift olamaz. (%s)", N));
return zip(azalanArtan(0, N.to!int / 2, 1),
artanAzalan(1, N.to!int, 2))
.map!(genişlikler => chain(' '.repeat(genişlikler[0]),
'*'.repeat(genişlikler[1])));
}
void main()
{
writefln("%(%s\n%)", baklavaDilimi(9));
}
Bu kodu daha çok beğeniyorum çünkü .text ile hevesli dizgi üretimi yok ve .center ile satır sonundaki boşlukları bulunmuyor. (İstendiğinde sona da boşluk eklenebilir.) Dolayısıyla, sonuçtaki aralığın elemanları artık dizgi olmadıklarından, en sondaki düzen dizgisinde "%-(" kullanmak da gerekmedi.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]