Merhaba,
Aşağıdaki bir tür zeka oyunu değil! Sadece iş çıkışı std.algorithm olanakları üzerine denenmiş rasgelelik üzerine ve OOP olmayan basit bir kod...
Ama eğlenceli sanki, ne dersiniz? Elbet daha zeki şekilde de programlanabilir!
import std.random, std.range, std.stdio;
import std.algorithm.mutation : remove;
import std.algorithm.iteration : sum;
import std.math : abs;
/* En hafifi 90 gram, en ağırı 120 gram olan ve
* 10 adet elma bulunduran 2 sepetimiz olsun:
*/
enum { enAz = 90,
enÇok = 120,
adet = 10,
değişim = 2
}
void main() { // Sepetlerimizi öyle rasgele dolduruyoruz:
auto sepet1 = generate!(() => uniform(enAz, enÇok)).
takeExactly(adet).array;
auto sepet2 = generate!(() => uniform(enAz, enÇok)).
takeExactly(adet).array;
/* Herhangi bir sepetten ikişer elma eksilten ve
* bunları döndüren işlevimiz: avuçla() ise şöyle:
*/
auto avuçla(ref int[] sepet) {
size_t pos = uniform(0, sepet.length);
int ilk = sepet[pos];
sepet = remove(sepet, pos);
pos = uniform(0, sepet.length);
scope(exit) sepet = remove(sepet, pos);
return [ ilk, sepet[pos] ];
}
// Sonsuz döngü için test ederiz ama şartlı*:
size_t loop = 1;
do {
auto x = sepet1.sum; auto y = sepet2.sum;
int fark = abs (x - y);
x.writeln(" gr. (sepet1)");
y.writeln(" gr. (sepet2), fark:", fark);
writefln("%s\n%s\n", sepet1, sepet2);
if(fark < 4 ) { // (*) Fark küçükse çık:
"Toplam rasgele değişim: ".writeln(loop);
break;
}
// Önce birinden 2 elma aldık ve hemen...
auto birAvuçElma = avuçla(sepet2);
sepet2 ~= avuçla(sepet1); /*... diğer avcumuzla da
fazlaları alıp eksilen sepet attık! */
// Avcumuzda kalan elmayı da diğerine ekliyoruz:
sepet1 ~= birAvuçElma; // sepet2'den ilk seçtiğimiz!
} while(loop++);
}/* ÇIKTISI: (en az olasılık!)
1068 gr. (sepet1)
1070 gr. (sepet2), fark:2
[116, 114, 119, 110, 93, 98, 104, 103, 103, 108]
[110, 98, 119, 116, 101, 91, 107, 118, 93, 117]
Toplam rasgele değişim: 1*/