Merhaba,
GPT-4o duyuralı bir kaç gün oldu ama ne zamandır küçük bir AI karşılaştırma testi için zaman kolluyordum; kısmet bugüneymiş! Biri önemli (capacity ile ilgili) olan ve nispeten çalışmasını etkileyemecek ekleme/çıkarmaları saymazsak son sürüm tam 12'den vurmuşa benziyor...
Prompt şu şekildeydi:
"Lütfen D dilinde bir FIFO stack yaz ama statik bir dizi ile yapmalısın, sınıf kurulurken kapasitesi ve türü belirlenecek ve her push() yapıldığında dizinin sıradaki boş elemanına veriyi kayıt etsin, sonra her pop() yapıldığında da ilk giren veriyi geri döndürsün ve tam o sırada kapasitesi 1 artsın. Yani new Stack!int(10) ile kurulduysa ve 10 defa push() sonras 1 defa pop() yapılarak dizin başından 1 eleman eksiltildiyse hala dizinin sonunda 1 eleman daha eklenebilmeli. Yani kaydırmalı bir buffer(önbellekleme) sistemine ihtiyaç var. Verimli olmalı çünkü her veri eklendiğinde kapasite dolmadan tekrar başından veri çekilebilmeli stack dolduğunda, yani 10 defa push() yapıldığında tekrar 1 defa daha push() yapılırsa program sonlanmadan "veri kayıt edilmedi, yığıt doldu" mesajı ekrana yazsın. Aynı şekilde henüz veri eklenmemiş (stack.empty == true) durumundaysa pop() yapılırsa "döndürülecek bir veri yok, yığıt boş" mesajı ekrana yazsın. Ayrıca clear() ve set() metodları da olmalı. Yani stack.clear() yapılarak sessizce yığıt boşaltılabilmeli ve stack.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) yapılarak bir defada tüm yığıt uyarı mesajı vermeksizin doldurulabilmeli."
main() testi saymazsak çıkan sonuç 50 satırdan az olacak şekilde şöyle oldu:
import std.stdio;
//import std.array; "o ekledi, ben çıkardım!"
class Stack(T) {
private T[] data;
private size_t capacity;
private size_t size;
this(size_t capacity) {
this.capacity = capacity;
this.data = new T[capacity];
//this.size = 0; "o ekledi, ben çıkardım!"
}
void push(T value) {
if (size == capacity) {
writeln("YIĞIT DOLDU: veri kayıt edilemez!");
return;
}
data[size++] = value;
}
T pop() {
if (size == 0) {
writeln("YIĞIT BOŞ: döndürülecek bir veri yok!");
return T.init;
}
T value = data[0];
data = data[1 .. $] ~ T.init;
size--;
//capacity++; "o ekledi, ben çıkardım!"
return value;
}
void clear() {
data = new T[capacity];
size = 0;
}
void set(T[] values) {
if (values.length > capacity) {
writeln("Verilen dizi kapasiteden büyük!");
return; // "^--bunu istememiştim, akıllıca"
}
data = values ~ new T[capacity - values.length];
size = values.length;
}
bool empty() => size == 0; // "tek satır yaptım"
}
Tam 12'den vurduğunu söylemiştim, belki diğer AI modellerine göre beni gönlümden vurmuş olabilir ama pop()'deki capacity++
satırını neden eklediğini anlayamadım! Açıkca bu bir bug ve mantığa aykırı olduğu için 10 üzerinden not verirsek skoru 9'a düşürdüm, şimdilik! Testleri şu kısmen değişmiş devam koduyla yapabilirsiniz:
void main()
{
auto stack = new Stack!int(10);
//writeln(stack.pop()); // YIĞIT BOŞ: döndürülecek bir veri yok!
stack.push(0); // "ben ekledim"
stack.push(1);
stack.push(2);
stack.push(3);
writeln(stack.pop()); // 0
stack.set([4, 5, 6, 7, 8, 9]); /* "ben ekledim"
stack.push(4);
stack.push(5);
stack.push(6);
stack.push(7);
stack.push(8);
stack.push(9);//*/
stack.push(10); // YIĞIT DOLDU: veri kayıt edilemez!
stack.size.writefln!"size = %s"; // 3 "ben ekledim, ismi index olabilirdi!"
stack.push(11); /* "ben ekledim"
with(stack) while(!empty)
pop.write(" ");
writeln;//*/
stack.data.writeln; // "ben ekledim"
stack.clear();
assert(stack.empty); // "ben ekledim"
stack.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
writeln(stack.pop()); // 0
}
Ayrıca gereksiz eklediği satırlar ve benim 0'dan başlayarak ekleme yapmasını belirttiğim halde eklememesi ekstra bir not kırımını gerektiriyor. Çünkü biraz başına buyruk (korkmayın henüz The Terminator'lük bir durum yok) kod yazıyor! Bilerek "statik bir dizi" ifadesini kullandım, bakalım ne yapacak diye ama D'nin dilimleme be GC olanaklarından faydalanmayı tercih ettiğini görüyoruz.
Belki new Stack!(int, 10) şeklinde bir kurulum yapmasını gerektiğini söyleseydim kırdığım notu geri almam gerekebilirdir ne dersiniz? Gerçi set() ederken eklenen dizinin boyutunu belirtmediğim halde kontrol etmesi akıllıca. Ama yinede hala 10 puanı hak etmiyor :)
SDB@79